0Pricing
Lua Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么要测试
  2. describe 和 it 代码块
  3. 断言
  4. 模拟对象与间谍
← 返回 Lua Academy