如何配置coverage模块实现覆盖率报告增量更新而非覆盖?
针对你用coverage 3.6.3版本,想要多次执行myscript.py时更新同一覆盖率报告而非覆盖的需求,我给你整理了几个可行的方案,还有你之前报错的原因分析:
一、直接累积更新同一报告的最优方案
其实coverage本身就支持覆盖数据的累积,不需要折腾多个.coveragerc配置文件。你之前的错误是因为指定了不存在的.coveragerc1文件,所以才会抛出Couldn't read '.coveragerc1' as a config file的异常。
方法1:使用coverage run --append(最直观)
跳过环境变量的配置,直接用coverage run命令配合--append参数执行脚本,这个参数会明确告诉coverage把新的覆盖数据追加到现有数据文件中,而不是覆盖:
# 先加载你的setup脚本 source coverage_setup.sh # 第一次执行,追加数据 coverage run --append myscript.py --f 1 # 第二次执行,继续追加 coverage run --append myscript.py --f 2 # 第三次执行,继续追加 coverage run --append myscript.py --f 3 # 生成最终报告 coverage report # 或者生成HTML可视化报告 coverage html
coverage 3.6.3版本已经支持--append参数,这个方法最简单,不容易出错。
方法2:用COVERAGE_PROCESS_START累积数据
如果你必须通过环境变量的方式让coverage自动追踪脚本执行,那只需要保持同一个.coveragerc配置,确保每次执行都复用同一个数据文件:
- 确保你的
.coveragerc文件中包含(默认已经有,也可以明确写上):
[run] data_file = .coverage
- 执行脚本的命令改为:
source coverage_setup.sh # 设置环境变量,指定同一个配置文件 setenv COVERAGE_PROCESS_START .coveragerc # 多次执行脚本,数据会自动追加到.coverage文件 myscript.py --f 1 myscript.py --f 2 myscript.py --f 3 # 取消环境变量 unsetenv COVERAGE_PROCESS_START # 生成报告 coverage report
这样每次执行脚本时,coverage都会把新的覆盖数据追加到.coverage文件,不会覆盖之前的内容。
二、替代方案:生成多个数据文件后合并
如果上面的方法因为某些限制无法使用,你可以为每次执行生成独立的覆盖数据文件,之后再合并成一个报告:
- 执行脚本时,通过
COVERAGE_DATA_FILE环境变量指定不同的数据文件:
source coverage_setup.sh setenv COVERAGE_PROCESS_START .coveragerc # 第一次执行,指定数据文件为.coverage.1 setenv COVERAGE_DATA_FILE .coverage.1 myscript.py --f 1 # 第二次执行,指定数据文件为.coverage.2 setenv COVERAGE_DATA_FILE .coverage.2 myscript.py --f 2 # 第三次执行,指定数据文件为.coverage.3 setenv COVERAGE_DATA_FILE .coverage.3 myscript.py --f 3 # 取消环境变量 unsetenv COVERAGE_PROCESS_START unsetenv COVERAGE_DATA_FILE
- 使用
coverage combine命令合并所有数据文件:
coverage combine .coverage.*
这个命令会把.coverage.1、.coverage.2、.coverage.3的内容合并到一个.coverage文件中,之后就可以正常生成报告了。
三、你之前报错的原因
你之前尝试设置COVERAGE_PROCESS_START .coveragerc1时,系统找不到.coveragerc1这个文件,所以抛出了异常。如果一定要用多个配置文件,必须先手动创建每个.coveragerc文件(比如.coveragerc1、.coveragerc2),并在里面配置好必要的参数,但这完全没必要,复用同一个配置文件+控制数据文件的方式更高效。
内容的提问来源于stack exchange,提问作者vesii

