Python多进程代码在site-packages下覆盖率统计异常求助
问题原因及解决方案
核心原因
- coverage默认追踪范围限制:当库被安装到
site-packages后,属于Python全局已安装包,coverage.py默认不会自动追踪这类包的代码(默认仅追踪项目根目录下的代码);而同级目录下的代码属于项目本地代码,会被默认纳入追踪范围。 - 多进程覆盖率继承失效:
multiprocessing.Pool启动的子进程无法自动继承主进程的coverage追踪配置,尤其是代码在site-packages时,子进程环境未加载coverage的追踪钩子,导致子进程执行的f函数代码未被统计。
解决方案
显式指定追踪包:
在pytest命令中明确指定要覆盖的包名(假设你的库名为sample_lib),执行:pytest --cov=sample_lib tests/或者在
pytest.ini中配置:[pytest] cov = sample_lib让coverage明确追踪
site-packages中的目标库代码。启用跨进程覆盖率支持:
使用coverage的并行模式处理多进程场景,步骤如下:# 以并行模式运行测试 coverage run --parallel-mode -m pytest tests/ # 合并多进程生成的覆盖率数据 coverage combine # 生成覆盖率报告 coverage report也可在
pytest.ini中开启覆盖率追加:[pytest] cov_append = True采用可编辑安装方式:
开发阶段测试时,用可编辑模式将库安装到site-packages,代码仍指向本地源码目录,覆盖率追踪逻辑和同级目录一致:pip install -e .强制包含site-packages中的库代码:
创建.coveragerc配置文件,添加规则强制覆盖site-packages中的目标库:[run] include = */site-packages/sample_lib/*
内容的提问来源于stack exchange,提问作者Sébastien Eskenazi
相关产品推荐
相关产品推荐

