测试与代码质量

代码覆盖率 100% 的陷阱,多少百分比才合适?

代码覆盖率 100% 并不意味着代码没有 bug。本文总结实践中常用的 70%~80% 标准,以及如何找出比数字更应优先确认的未验证分支。

3 分钟阅读
代码覆盖率 100% 的陷阱,多少百分比才合适? 封面图

编写测试代码时,不知不觉就会开始执着于覆盖率数字。

“既然都做了,就应该补到 100%”的心情,我非常理解。

先说结论,**代码覆盖率保持在 70%~80% 是实践中最现实的目标,100% 并不等于代码没有 bug。**下面结合我的经验说明原因。


先看核心总结

为了方便忙碌的读者,先整理本文结论。

  1. 覆盖率 100% 只表示“每一行都执行过”,并不表示“所有情况都经过验证”。
  2. 实践中的建议值通常在 70%~80% 左右。
  3. 对于支付、身份验证等重要核心逻辑,可以争取达到 90% 以上。
  4. 比起数字,更重要的是知道“哪些内容还没有测试”。

代码覆盖率 100% 就没有 bug 了吗?

这是最常见的误解。

覆盖率 100% 只表示测试“至少执行过代码中的每一行一次”。

这并不表示已经验证每一行是否正确运行。

举个例子。下面的函数就是测试只执行代码,却没有正确检查结果的情况。

func divide(_ a: Double, _ b: Double) -> Double {
    return a / b // b如果是 0?测试会执行,但
}

// 这个测试有覆盖率 100%,但
@Test func divide_只执行_代码() {
    _ = divide(10, 2) // 不验证返回值(#expect)!
}

这段代码达到了 100% 覆盖率。

但由于没有通过 #expect确认结果,实际上什么也保证不了。

覆盖率衡量的是“执行了多少”,而不是“验证得有多好”。

这正是不能只看数字就放心的原因。


那么多少百分比才合适?

我把辗转多个团队后感受到的现实标准整理成了表格。(截至 2026 年的一般实践建议值)

代码区域 建议覆盖率 原因
核心业务逻辑 90% 以上 支付、身份验证等出错时后果严重
一般服务代码 70~80% 成本效益最好的区间
UI・视图层 50~60% 变更频繁,测试维护成本高
自动生成・配置文件 排除测量 测试意义较小

Google 也曾公开表示,在内部将 60% 视为“可接受水平”、75% 视为“建议值”、90% 视为“最佳实践”。

虽然没有绝对正确的答案,但可以把 80% 左右视为大多数团队合理的目标

显示 78% 数值以及绿色、红色代码行的代码覆盖率报告界面
真正的关键是先查看报告中的红色代码行

为什么坚持 100% 反而会吃亏?

补齐最后 20% 所需的努力,远远大于补齐前 80%。

如果要测试所有异常处理、难以到达的分支和防御性代码,所需时间会呈指数增长。

更大的问题还在后面。

为了填满数字,会出现专门用来“展示”的测试。

不进行实际验证、只提高覆盖率的测试,之后修改代码时只会成为阻碍。

每次重构都要花时间修复没有意义的测试。


常见问题(Q&A)

问:那么,测量覆盖率本身没有意义吗?

不是。覆盖率非常适合用来找出“测试完全没有触及的区域”。

不要把数字当成目标,而要利用覆盖率报告检查红色部分(未执行代码)。

问:可以在 CI 中强制设置覆盖率标准吗?

可以,但建议采用“新代码至少达到 80%”这样的方式。

如果对全部代码统一设置较高标准,团队会因为既有代码而疲惫不堪。

问:覆盖率好像有好几种?

除了行覆盖率,还建议同时查看分支覆盖率

因为 if/else 等条件分支是否经过充分测试,更接近实际质量。

终端中整齐显示绿色 PASS 标记的单元测试运行界面
比起数字,我觉得这些绿色标记更让人安心

不要被数字牵着走,先问问自己:“这个测试真的在保护什么吗?”

覆盖率 80% 但扎实的测试,比覆盖率 100% 却空洞的测试可靠得多。希望你今天也能写出优秀的测试代码!

延伸阅读