覆盖率是手段,不是目的

很多团队把覆盖率当成 KPI:覆盖率必须到八十、九十。但覆盖率数字高,并不代表测试真的有用——它只说明这些代码被「执行到过」一次。

覆盖率真正该回答的问题是:这些测试能不能在代码改错时真的把错抓住。抓不住错的高覆盖率,只是一张自我安慰的成绩单。

一个覆盖率九十却抓不住任何错的测试套件,比覆盖率三十但每次都能报警的套件更危险——因为它给了人虚假的安全感。
本文核心知识点
  • 覆盖率只是执行到过,不等于验证了。
  • 断言没有断言的测试抓不住错。
  • 门槛覆盖率门槛要现实可达。
  • 不稳定测试时过时不过的测试最伤信任。
  • 治理找出病根,别靠重跑碰运气。
单元测试覆盖率示意:蓝色渐变背景一块由许多发光小方格组成的测试覆盖网格,大部分格子已被点亮成明亮青蓝色,少数仍是暗蓝色,旁有一个发光圆环覆盖率仪表盘正在逐渐填满,扁平科技插画
覆盖率网格点亮得越多,越要问一句:这些测试真的在验证关键行为吗。

覆盖率到底在测什么

覆盖率有不同层次,从粗到细看,意义差别很大。最常用的是行覆盖和分支覆盖,后者要求每个分支的真假两条路都走到。

层次看什么
行覆盖这行代码被执行到过吗
分支覆盖每个条件的真假两路都走过吗
关键路径真正重要的业务流程被验证了吗

与其追一个虚高的总行覆盖,不如盯着关键路径有没有被真正验证。

别被假绿骗了

有一种测试,跑是跑了,覆盖率也上去了,但它根本没有断言——也就是没有检查任何结果。这种测试永远是绿的,看起来很美,实际上啥也没守住。

# 坏例子:覆盖到了,但啥也没验
调用一下函数,不检查返回值
不抛异常就算过
# 好测试必须有断言:
result = 计算(输入)
assert result 等于预期
# 没有断言的测试,只是在给覆盖率凑数。

评审时多问一句:这个测试到底在验证什么?答不上来,它就是个凑数的。

覆盖率门槛:定多高合适

覆盖率门槛是把双刃剑。定得太低形同虚设,定得太高团队就会去写凑数测试来达标。门槛应该现实可达,并且重点放在关键模块。

做法说明
核心模块高门槛钱、订单这些关键路径严一点
整体门槛渐进随新代码逐步提高,不一步到位
新增代码必测新改动的覆盖率要过关

把门槛用在刀刃上,比全公司一刀切一个数字要健康得多。