coverage.py报告存在缺失语句但HTML未展示及覆盖率计算疑问
coverage.py 覆盖率问题解答
问题1:未被高亮的缺失语句是什么,如何消除该缺失?
定位缺失内容
先执行coverage report --show-missing --branch命令,它会直接输出两个文件中具体的缺失行号、未执行分支的位置,比默认ASCII报告更详细,能快速定位未被执行的代码。
另外你之前生成HTML报告时没带--branch参数,导致分支覆盖的缺失没被高亮,重新执行coverage html --branch生成报告,就能在HTML页面里看到缺失的分支/语句被标记出来。消除缺失的操作
根据定位到的缺失内容,给created_unit_test.py补充对应的测试用例:- 如果缺失的是
contains_negative()的某个逻辑分支(比如空列表、全正数、全负数、正负混合中的某一种场景没覆盖),就新增该场景的测试; - 如果是测试文件
created_unit_test.py里的语句缺失,检查是不是有测试逻辑没被触发(比如某个断言分支、异常处理代码没走到),补全对应的测试场景即可。
- 如果缺失的是
问题2:coverage.py的覆盖率计算规则是怎样的,为何example_solution.py的覆盖率不是预期的66%而是80%?
这是因为你混淆了语句覆盖率和分支覆盖率:
coverage.py的核心计算规则
- 语句覆盖率:公式为
(总可执行语句数 - 未执行语句数) / 总可执行语句数 × 100%,你预期的66%就是基于这个规则(3条语句,1条缺失:(3-1)/3≈66%)。 - 分支覆盖率:公式为
(总分支数 - 未执行分支数) / 总分支数 × 100%,每个条件判断(比如if、elif)会产生至少2个分支(True/False),覆盖率统计的是这些分支的执行情况。
- 语句覆盖率:公式为
为什么显示80%
你执行测试时用了--branch参数,此时coverage.py默认的ASCII报告会优先展示分支覆盖率,而非语句覆盖率。结合你的数据,example_solution.py的总分支数应该是5,其中1个分支未被执行:(5-1)/5=80%,刚好对应报告里的数值。
如果你想单独查看语句覆盖率,可以执行coverage report(不带--branch);或者执行coverage report --branch,报告会同时显示语句和分支的覆盖数据,一目了然。
内容的提问来源于stack exchange,提问作者rpommes
相关产品推荐
相关产品推荐

