必须同时安装coverage和pytest-cov,仅装后者无法使用coverage命令;运行coverage html前须先执行coverage run生成.data文件;推荐用coverage run --source=xxx -m pytest确保路径匹配和结果准确。

pytest-cov 装了但 coverage 命令不识别?先确认底层依赖
pytest-cov 本身只是 pytest 的插件,它不自带 coverage 运行时 —— 真正干活的是 coverage.py 库。如果你只装了 pytest-cov,执行 coverage run 会报 command not found。
必须同时安装:
-
pip install coverage pytest-cov(推荐一起装) - 验证是否就绪:
coverage --version和python -m pytest --help | grep cov都应有输出
注意:某些旧环境里 pip install pytest-cov 可能不会自动拉取 coverage,尤其在 Python 3.12+ 或使用 --no-deps 时,得手动补上。
运行测试时覆盖率始终为 0%?检查源码路径和包结构
最常见原因是 coverage 没找到你的源代码文件 —— 它默认只统计被测试代码“导入过”的模块,且路径需匹配 --source 指定范围。
典型错误场景:
- 项目结构是
src/myapp/,但没告诉 coverage 源码在哪:coverage run -m pytest会漏掉所有src/下的文件 - 用
python -m pytest运行,但src/不在PYTHONPATH中,导致测试里import myapp失败或导入了 site-packages 里的同名包 -
setup.py或pyproject.toml里没配packages,pip install -e .后仍无法正确解析模块路径
实操建议:
- 显式指定源码根目录:
coverage run --source=src/myapp -m pytest - 或者用配置文件
.coveragerc固化设置:[run] source = src/myapp omit = */tests/*,*/test_*.py
HTML 报告打开全是灰色?coverage html 找不到数据文件
coverage html 默认读取当前目录下的 .coverage 文件,而这个文件只有在 coverage run 成功执行后才会生成。如果直接跑 coverage html,会提示 No data to report,页面空白或全灰。
关键顺序不能错:
- 先跑带
coverage run的命令(哪怕只是coverage run -m pytest) - 再执行
coverage html;生成的报告在htmlcov/index.html - 如果用了
--rcfile或自定义数据文件名(如--data-file=.coverage.myenv),生成和报告命令必须用同一参数对齐
小技巧:加 --fail-under=80 可让覆盖率低于 80% 时让 CI 失败,但注意它只对 coverage report 生效,coverage html 不触发检查。
为什么 pytest --cov 和 coverage run -m pytest 结果不一致?
二者底层都调用 coverage.py,但启动方式和默认行为有差异:
-
pytest --cov=myapp会自动启用coverage并把myapp当作--source,但不会自动包含子包,除非你写--cov=myapp.submodule或用--cov=. -
coverage run -m pytest更“原始”,完全依赖你传的--source和当前工作目录,对conftest.py、插件钩子等的覆盖更敏感 - 某些 pytest 插件(比如
pytest-asyncio)在--cov模式下可能干扰覆盖率采集,表现为部分函数标为“未执行”——这时换用coverage run方式反而更准
真实项目中,建议统一用 coverage run --source=xxx -m pytest,避免 --cov 的隐式行为带来歧义;CI 脚本里尤其要固定路径和参数。
覆盖率数字容易骗人,真正难的是判断哪些分支、异常路径、空值边界没测到 —— htmlcov 里点进具体文件,看黄色高亮行,比总百分比有用得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











