代码覆盖率和测试检测
使用 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 反馈 — 无需本地设置。