跳到主要内容

Lua 脚本测试

测试能帮你确认代码行为是否符合预期。Lua 项目可以从最简单的 assert() 开始测试,也可以使用 Busted 这类测试框架组织更完整的测试集。

这一节先带你写一个简单函数,再给它补测试。

使用 assert 做最小测试

创建 mathx.lua

mathx.lua
local mathx = {}

function mathx.clamp(value, min_value, max_value)
if value < min_value then
return min_value
end

if value > max_value then
return max_value
end

return value
end

return mathx

创建 test_mathx.lua

test_mathx.lua
local mathx = require("mathx")

assert(mathx.clamp(5, 0, 10) == 5)
assert(mathx.clamp(-1, 0, 10) == 0)
assert(mathx.clamp(20, 0, 10) == 10)

print("all tests passed")

运行:

lua test_mathx.lua

输出:

all tests passed

如果某个断言失败,Lua 会直接报错并指出失败位置。

写一个简单测试函数

你可以给断言加上更清楚的错误信息:

test_mathx.lua
local mathx = require("mathx")

local function equals(actual, expected, message)
if actual ~= expected then
error(string.format(
"%s: expected %s, got %s",
message,
tostring(expected),
tostring(actual)
))
end
end

equals(mathx.clamp(5, 0, 10), 5, "inside range")
equals(mathx.clamp(-1, 0, 10), 0, "below range")
equals(mathx.clamp(20, 0, 10), 10, "above range")

print("all tests passed")

这样失败时,你能更快知道哪个场景出问题。

使用 Busted

Busted 是 Lua 生态中常见测试框架。安装:

luarocks install busted

创建目录:

project/
├── mathx.lua
└── spec/
└── mathx_spec.lua

spec/mathx_spec.lua

spec/mathx_spec.lua
local mathx = require("mathx")

describe("mathx.clamp", function()
it("returns the original value inside range", function()
assert.are.equal(5, mathx.clamp(5, 0, 10))
end)

it("returns min value when below range", function()
assert.are.equal(0, mathx.clamp(-1, 0, 10))
end)

it("returns max value when above range", function()
assert.are.equal(10, mathx.clamp(20, 0, 10))
end)
end)

在项目目录运行:

busted

输出会显示测试是否通过。

测试错误情况

如果你的函数会抛出错误,也应该测试错误路径:

sensor.lua
local sensor = {}

function sensor.normalize(value)
assert(type(value) == "number", "value must be a number")
return value / 100
end

return sensor

Busted 测试:

spec/sensor_spec.lua
local sensor = require("sensor")

describe("sensor.normalize", function()
it("normalizes number", function()
assert.are.equal(0.5, sensor.normalize(50))
end)

it("rejects non-number value", function()
assert.has_error(function()
sensor.normalize("50")
end)
end)
end)

测试建议

初学阶段你可以先测这些内容:

  • 普通输入是否返回正确结果。
  • 边界值是否正确,例如 0、空字符串、空 table。
  • 错误输入是否能给出明确错误。
  • 函数是否意外修改传入 table。
  • 模块是否返回预期 table。

小结

你需要掌握:

  • assert() 可以完成最小测试。
  • 测试文件本身也是 Lua 脚本。
  • Busted 适合组织更完整的测试套件。
  • 好测试应覆盖正常路径、边界情况和错误路径。