0Pricing
Lua Academy · 课时

代码覆盖率和测试检测

使用 luacov 测量测试覆盖率,并解读覆盖率报告。

代码覆盖率和测试检测 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是代码覆盖率

代码覆盖率衡量测试执行了代码中的哪些行、分支或函数。较高的覆盖率可以增强您对测试充分执行代码的信心。

luacov:标准工具

luacov 是 Lua 的标准覆盖率工具。它会接入 Lua 调试层,并记录执行过的行。

-- Run with luacov:
luacov script.lua
-- Or require at the start of the test file:
require("luacov")

在测试运行器中使用 luacov

使用 busted 或自定义测试运行器时,请在开始处引入 luacov,它会自动记录覆盖率。

-- spec/all_spec.lua
require("luacov")
describe("my module", function()
  it("does something", function()
    local m = require("mymodule")
    assert.equals(m.add(1,2), 3)
  end)
end)

生成报告

测试运行完毕后,luacov 会写入一个 luacov.stats.out 文件。运行 luacov-reporter 生成人类可读的报告。

# After tests:
luacov-reporter
# Produces luacov.report.out with per-file line coverage

阅读报告

每行显示:命中次数、未命中次数和源代码行。命中次数为 0 的行属于未覆盖代码,可能是死代码或缺少测试用例。

分支覆盖率

luacov 跟踪的是行覆盖率,而不是分支覆盖率。要获得分支覆盖率,请使用更高级的工具,或手动为每条 if/else 路径添加测试用例。

自定义覆盖率钩子

使用 debug.sethook 监听行事件,构建一个最小化覆盖率记录器。

local covered = {}
debug.sethook(function(event, line)
  local info = debug.getinfo(2, "S")
  local src = info.short_src
  covered[src] = covered[src] or {}
  covered[src][line] = (covered[src][line] or 0) + 1
end, "l")
-- ... run tests ...
debug.sethook()

覆盖率阈值

在 CI 中设置最低覆盖率阈值(例如 80%)。如果覆盖率低于该阈值,则使构建失败。这样可以防止死代码意外累积。

测试插桩模式

除了覆盖率之外,还可以为测试添加以下插桩:执行时间(检测慢速测试)、调用次数断言(验证函数是否按预期次数调用)以及值捕获(记录传递给模拟函数的参数)。

用于测试隔离的模拟

测试期间使用模拟模块替换真实模块,以隔离各个单元。保存真实函数,替换为跟踪存根,并在测试后恢复。

local realSend = http.send
local calls = {}
http.send = function(...) calls[#calls+1] = {...} end
-- run tests --
http.send = realSend  -- restore
print(#calls, "send calls")

与 CI 集成

在 CI 流程中运行 luacov。将覆盖率报告上传到 Coveralls 或 Codecov,以跟踪不同提交之间的趋势。

覆盖率问题

luacov 报告中命中次数为 0 的行表示什么?

回顾:代码覆盖率与测试插桩

使用 luacov 记录行覆盖率并生成报告。设置持续集成中的覆盖率阈值。添加自定义的 debug.sethook 插桩以进行专门跟踪。使用模拟对象实现单元测试隔离并验证调用次数。

常见问题解答

「代码覆盖率和测试检测」课时是免费的吗?

是的 — 「代码覆盖率和测试检测」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「代码覆盖率和测试检测」这节课中我会学到什么?

使用 luacov 测量测试覆盖率,并解读覆盖率报告。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「代码覆盖率和测试检测」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入了解 debug 库
  2. 使用 MobDebug 进行远程调试
  3. 使用 LuaProfiler 进行性能分析
  4. 代码覆盖率和测试检测
← 返回 Lua Academy