覆盖率数据采集:Python覆盖率工具(coverage.py)安装与使用
说到覆盖率数据采集,我第一个想到的就是 coverage.py。这个工具我用了快十年了,从 Python 2.7 时代就开始用。说实话,它是我见过最省心的覆盖率工具——装好就能用,不用折腾什么环境变量。
安装 coverage.py
安装方式很简单,就一行命令:
pip install coverage
嗯,这里要注意一点。我建议你在虚拟环境里装。为什么呢?因为不同项目可能依赖不同版本的 coverage,混在一起容易出问题。我自己吃过这个亏,有一次升级了全局的 coverage,结果好几个老项目的报告格式全乱了。
验证安装是否成功:
coverage --version
看到版本号输出,就说明装好了。
基本使用流程
coverage.py 的使用流程,说白了就三步:跑测试、生成报告、看报告。我一般这么用:
# 第一步:运行测试并收集覆盖率
coverage run -m pytest test_calculator.py
# 第二步:生成覆盖率报告
coverage report
# 第三步:生成 HTML 格式的详细报告
coverage html
你想想看,这三步走完,你就能看到哪些代码被测试覆盖了,哪些还裸奔着。
coverage erase 清空上次的数据。不然新旧数据混在一起,报告会变得很奇怪。我曾经因为这个排查了半天,结果发现是数据没清干净。
生成覆盖率报告
coverage.py 支持好几种报告格式。我个人最常用的是 HTML 报告,因为它能逐行显示覆盖情况,看起来非常直观。
生成 HTML 报告的命令:
coverage html -d coverage_report
这个 -d 参数指定输出目录。如果不指定,默认会生成在 htmlcov 文件夹里。
除了 HTML,还有几种常用格式:
| 报告格式 | 命令 | 适用场景 |
|---|---|---|
| 终端文本 | coverage report |
快速查看整体覆盖率 |
| HTML | coverage html |
逐行查看覆盖详情 |
| XML | coverage xml |
集成到 CI/CD 流水线 |
| JSON | coverage json |
程序化处理覆盖率数据 |
解读覆盖率报告
报告拿到手了,怎么看?我教你几个关键点。
先看终端报告:
Name Stmts Miss Cover
---------------------------------------------
calculator.py 20 5 75%
test_calculator.py 30 0 100%
---------------------------------------------
TOTAL 50 5 90%
这个表格里,Stmts 是可执行语句数,Miss 是没被执行到的语句数,Cover 就是覆盖率百分比。
我一般先看 Miss 列。如果某个文件 Miss 数很高,说明这个模块的测试严重不足。
深入解读 HTML 报告
HTML 报告才是真正的利器。打开 coverage_report/index.html,你会看到:
- 绿色行:被测试执行到的代码
- 红色行:没被测试执行到的代码
- 黄色行:部分执行(比如 if-else 只走了其中一个分支)
举个例子,假设你有这么一段代码:
def divide(a, b):
if b == 0: # 红色:没被测试覆盖
return None # 红色:没被测试覆盖
return a / b # 绿色:被测试覆盖了
看到红色行,你就知道——哦,除零的情况没测。赶紧补个测试用例吧。
覆盖率配置
实际项目中,我一般会写一个 .coveragerc 配置文件:
[run]
source = my_project
omit = */tests/*, */migrations/*
[report]
exclude_lines =
pragma: no cover
def __repr__
if __name__ == .__main__.:
这个配置做了几件事:
source:只统计my_project目录下的代码omit:排除测试文件和迁移文件exclude_lines:忽略一些不需要覆盖的代码行
为什么要排除测试文件?因为测试代码本身不需要被测试覆盖,我们关心的是业务代码。
实战中的注意事项
说几个我踩过的坑:
- 分支覆盖率 vs 行覆盖率:行覆盖率只统计代码有没有执行,分支覆盖率会统计 if-else 的每个分支。我建议两个都看。
- 不要追求 100%:有些代码(比如异常处理、日志打印)很难覆盖到 100%。我一般把目标定在 80%-90%,剩下的留给核心逻辑。
- 定期跑覆盖率:别等到项目快上线了才跑。我习惯每次提交代码前都跑一下,确保新代码有测试覆盖。
覆盖率数据与缺陷定位的联动
覆盖率数据最大的价值,不是那个百分比数字,而是它告诉你的「未覆盖区域」。我通常的做法是:
- 拿到 Bug 报告后,先看 Bug 涉及的代码文件
- 打开这个文件的覆盖率报告,看哪些行是红色的
- 如果 Bug 所在的代码行是红色,说明测试没覆盖到——这就是缺陷的根源
- 补上测试用例,再跑一遍覆盖率,确认红色变绿色
说白了,覆盖率数据就是一张「测试地图」。红色区域就是雷区,你得一个个排掉。
这张图展示了我日常工作的完整流程。从安装工具开始,到跑测试、生成报告,再到定位缺陷、补充测试,形成一个闭环。你想想看,每次循环都能让代码质量提升一点。
可可精品资料库