测试覆盖率是什么
覆盖率度量测试执行了多少被测对象:行覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖、需求覆盖等口径各有侧重。它回答的是「哪些代码没被跑到」,是发现盲区的工具;但它不度量断言质量——跑过一行代码不等于验证了这行的行为。把覆盖率当方向灯而不是终点线,才不会掉进刷数字的陷阱。
基本信息
| 常见口径 | 行覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖、需求覆盖 |
|---|---|
| 获取方式 | 覆盖率工具(coverage.py、JaCoCo、Istanbul 等)配合测试执行数据 |
| 使用方式 | 增量覆盖率做门禁,覆盖缺口清单做改进输入 |
| 审阅方式 | 定期抽样阅读未被覆盖的代码段 |
| 度量边界 | 覆盖率高不等于质量高,只说明执行过 |
常见口径对照
| 口径 | 测什么 | 主要盲区 |
|---|---|---|
| 行/语句覆盖 | 每行代码是否执行过 | 条件只走一个分支也算覆盖 |
| 分支覆盖 | if/else 等分支两个方向 | 多条件组合仍可能漏 |
| 条件覆盖 | 每个布尔条件的真假取值 | 条件间组合关系不保证 |
| 路径覆盖 | 执行路径的组合 | 路径数爆炸,实际难全做 |
| 需求覆盖 | 需求项是否有用例对应 | 依赖需求拆分质量 |
典型使用场景
- 增量门禁:新代码覆盖率低于阈值则 CI 报警或阻断。
- 盲区清单:列出未覆盖代码段,人工判断哪些需要补用例。
- 重构安全网:改动前确认相关代码有执行覆盖再动手。
- 发布证据:向干系人展示关键模块的覆盖情况与趋势。
- 评审输入:结合覆盖缺口讨论用例设计的遗漏原因。
- 工具选型:按语言生态选择 coverage.py、JaCoCo、Istanbul 等。
高覆盖率不等于高质量:断言缺失的测试也能贡献覆盖率。覆盖率应结合缺陷数据与评审判断。
门禁盯增量更合理:新代码要求高覆盖,老代码看趋势改善;一刀切的全量阈值会把老项目直接冻结。
覆盖缺口要有人读:工具产出的未覆盖清单应定期抽样审阅,转化为用例或明确的「不需要覆盖」结论。