因为pytest-cov默认只跟踪当前工作目录下被导入的模块,若src/等源码目录未被Python路径识别,便不会被统计;必须通过--cov=src或pyproject.toml配置source明确指定源码路径。

pytest-cov 为什么默认不统计项目源码?
直接运行 pytest --cov 通常只覆盖测试文件本身,源码目录压根没进统计范围——因为 pytest-cov 默认只跟踪当前工作目录下被导入的模块,而你的 src/ 或 myproject/ 目录若没被 Python 路径识别,就完全“隐身”了。
解决办法不是加路径参数,而是让 Python 知道源码在哪:
- 在项目根目录放一个
pyproject.toml,写入:[tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] addopts = ["--cov=src", "--cov-report=html", "--cov-report=term-missing"]
- 把源码放在
src/下(推荐),并确保该目录有__init__.py(哪怕为空);否则用--cov=myproject显式指定包名 - 避免用
python -m pytest启动却忘了-m会改变sys.path行为——改用pytest命令直接执行
如何排除测试文件、配置和临时代码?
覆盖率报告里混进 tests/、conftest.py、__pycache__/ 甚至 venv/,会让数字虚高且干扰判断。关键不是靠 --cov-ignore 手动列一堆路径,而是用 .coveragerc 做声明式过滤:
[run] source = src omit = */tests/*,*/test_*.py,*/conftest.py,*/migrations/*,*/__pycache__/*,*/venv/*,*/env/*
source 锁定统计起点,omit 是 glob 模式,比命令行参数更稳定;注意 */tests/* 和 */test_*.py 必须都写,前者防目录,后者防单文件。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 如果用了
setup.py或pyproject.toml的packages声明,source值必须与之一致,否则覆盖率仍为空 -
omit不支持正则,只认*和?,别写^test这类东西 - CI 环境中常漏掉
*/migrations/*,Django 项目尤其要注意
为什么 html 报告里某些文件显示 0%,但实际有测试?
常见于模块只被 import 但没执行任何语句(比如纯类型定义、__all__ 列表、空函数存根),或者测试运行时根本没 import 它——pytest-cov 统计的是「被执行过的行」,不是「被 import 过的模块」。
- 检查该模块是否真被测试触发:在模块顶部加一句
print("loaded"),再跑测试看有没有输出 - 确认 import 路径正确:比如源码在
src/myapp/utils.py,但测试里写了from myapp.utils import xxx,而myapp没在sys.path里,就会静默失败 - 使用
--cov-fail-under=80前先人工核对几份term-missing输出,防止因误判导致 CI 卡住
多进程或异步测试下覆盖率丢失怎么办?
pytest-xdist 并行跑测试时,pytest-cov 默认无法聚合各 worker 的数据,结果就是总覆盖率暴跌甚至归零。
- 必须加
--cov-branch+--cov-context=test,并安装pytest-cov[xdist](不是仅pytest-cov) - 在
.coveragerc中启用并发支持:[run] parallel = true [report] exclude_lines = pragma: no cover def __repr__ raise AssertionError raise NotImplementedError - 运行完要手动合并:
coverage combine && coverage report,CI 脚本里别漏掉这步
真正麻烦的是带 async 的测试——coverage.py 对协程帧的支持仍有限,某些 await 行可能被跳过;这时候得靠 coverage debug sys 查看是否启用了 trace_dispatch,而不是盲目调参数。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










