describe 和 it 代码块
组织测试套件。
describe 和 it 代码块 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
规范文件的结构
busted 使用两个核心函数组织测试:describe 和 it。describe 块将相关测试分组,而每个 it 块都是一个测试用例。
这种结构源自行为驱动开发,读起来就像普通英语一样。
describe("Stack", function()
it("starts empty", function()
assert.are.equal(0, Stack.new():size())
end)
end)describe 块
describe 接受一个名称字符串和一个函数。名称应标识正在测试的单元或功能,例如模块或类。
函数中的所有内容都属于该分组。名称会出现在测试输出中,用于组织结果。
describe("calculator", function()
-- tests live here
end)it 块
每个 it 块描述一种具体行为。这个字符串应补全由 describe 开头的句子。
将“计算器”和“将两个数字相加”放在一起,就形成了对预期意图的清晰说明。
describe("calculator", function()
it("adds two numbers", function()
assert.are.equal(5, calc.add(2, 3))
end)
end)嵌套 describe 块
您可以嵌套 describe 块来表达上下文。内部块可以描述某个特定方法或特殊条件。
嵌套结构会将相关案例放在一起,并生成易读的缩进输出。
describe("List", function()
describe("push", function()
it("adds an item", function()
assert.are.equal(1, list:push("a"):size())
end)
end)
end)before_each 设置
before_each 会在其所在块中的每个 it 运行前执行一个函数。请使用它创建全新的测试数据,避免测试共享状态。
这样可以保持每个测试相互隔离。一个测试中的修改不会泄漏到下一个测试。
describe("Stack", function()
local s
before_each(function()
s = Stack.new()
end)
it("pushes", function()
s:push(1)
assert.are.equal(1, s:size())
end)
end)after_each 清理
after_each 会在每个测试之后运行。请使用它清理临时文件、open 的连接或全局状态等资源。
将设置与清理配对,可以确保测试之间的环境得到重置。
after_each(function()
os.remove("temp.db")
end)setup 与 teardown
busted 还提供 setup 和 teardown,它们每个 describe 块只运行一次,而不是每个测试运行一次。
当每个测试都进行设置会造成浪费时,请将它们用于一次性的高成本工作,例如打开共享连接。
describe("db", function()
setup(function()
db = connect()
end)
teardown(function()
db:close()
end)
end)待完成的测试
有时您想记录一个尚未编写的测试。请使用描述调用 pending,或者编写一个不带函数的 it 块。
busted 会将这些测试报告为待完成,而不是通过或失败,提醒您完成它们。
it("handles unicode", function()
pending("not implemented yet")
end)聚焦和排除
调试时,您可以专注于一部分测试。在命令行中使用 --tags 添加标记,或使用 busted 的辅助工具,就可以只运行重要的测试。
这样,您在处理某个失败区域时就不必运行整个测试套件。
-- run only tests tagged 'fast'
-- busted --tags=fast命名约定
好的名称能让失败原因一目了然。describe 应以主题开头,it 应以描述行为的动词开头。
避免使用“有效”或“测试 1”之类含糊的名称。失败的测试应该读起来像一份可以据此采取行动的错误报告。
describe("parser", function()
it("rejects malformed input", function()
assert.has_error(function() parser.parse("{") end)
end)
end)组合起来
完整的规范会组合 describe 分组、before_each 设置和目标明确的 it 案例。这个骨架可以从一个测试扩展到数百个测试。
请保持块简短,并让每个 it 专注于一种行为,以获得最清晰的输出。
describe("Account", function()
local acc
before_each(function() acc = Account.new(100) end)
it("withdraws funds", function()
acc:withdraw(40)
assert.are.equal(60, acc.balance)
end)
end)快速检查
测试您对 busted 块结构的理解。
回顾
describe 将相关测试分组,it 定义单个案例,整体读起来就像一份规范。嵌套 describe 块可以表达上下文。
使用 before_each 和 after_each 实现每个测试之间的隔离,使用 setup 和 teardown 执行每个块一次的工作。使用 pending 标记尚未完成的工作。
常见问题解答
「describe 和 it 代码块」课时是免费的吗?
是的 — 「describe 和 it 代码块」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「describe 和 it 代码块」这节课中我会学到什么?
组织测试套件。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「describe 和 it 代码块」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。