首页/开发/代码质量与评审速查/行覆盖与分支覆盖:含义与局限
技术债与度量63 条

行覆盖与分支覆盖:含义与局限

覆盖度回答「哪些代码被执行过」:行覆盖粗、分支覆盖细;覆盖高不代表测试好(断言可能缺失),覆盖低也未必危险(生成代码、简单转发);它适合发现未测区域而非质量评分。

行覆盖与分支覆盖

覆盖率回答的是哪些代码在测试中被执行过:行覆盖粗,分支覆盖细,路径覆盖成本更高。覆盖率高不代表测试好——可能缺少断言;覆盖率低也未必危险——生成代码与简单转发本来就少测。正确用法是发现未被测试触及的区域,而不是当作质量评分。

基本信息

口径层次行覆盖、分支覆盖、路径覆盖(成本递增)
常用工具JaCoCo、Istanbul、coverage.py、Go 内置覆盖
正确用法看未覆盖区域找风险,而不是追数字
常见约束新代码覆盖率设下限,存量只看趋势
固有局限覆盖只说明执行过,不说明验证过

典型使用场景

  • 提交前确认新分支是否都有用例覆盖
  • 识别长期无人测试的核心模块
  • 用补丁覆盖率约束新代码质量
  • 重构前确认目标区域的测试覆盖情况
  • 评估测试补写工作的优先级

常用命令

常用命令
go test ./... -coverprofile=cover.out         # 生成覆盖率数据
go tool cover -html=cover.out -o cover.html    # 可视化查看未覆盖行
# Java 项目常用 JaCoCo:构建时生成报告,按包与类看行覆盖与分支覆盖
# JavaScript 常用 Istanbul / c8:关注分支与函数覆盖率

口径与含义

口径含义成本
行覆盖每行是否被执行低,最常用
分支覆盖条件的每个分支是否走到中,更有意义
路径覆盖组合路径是否全部走到高,通常不完全追求
常见做法是给新代码设覆盖率下限(例如补丁覆盖率要求),存量整体数字只做趋势观察,避免为了达标写空壳测试。
拿整体覆盖率考核团队,数字一定会被灌水:只调用不校验、删掉断言都能提高数字,最后指标上升而缺陷率不变。
覆盖数据要按模块看:整体数字掩盖局部差异,核心计费或权限模块零覆盖,比边缘脚本缺少用例危险得多;报告建议按目录与包分层呈现。

易错点

  • 拿整体覆盖率考核团队:数字被空壳测试灌水
  • 忽略分支口径:条件的两条路径只测一条也算覆盖
  • 只看数字不看未覆盖列表:错过真正需要补测试的风险点
  • 把覆盖率低直接等同于质量差:生成代码与简单转发本就无需大量用例

数据来源与参考

  • 各覆盖率工具文档(JaCoCo、Istanbul、coverage.py、Go cover)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌