pytest --cov 没反应是因为未指定被测模块路径,必须显式使用 --cov=module_name;覆盖率虚高需用 --cov-ignore 或 .coveragerc 的 omit 排除测试和 venv;数值不一致源于数据文件不同,CI 中需确保插件安装、路径正确及 parallel 配置。

安装 pytest-cov 后为什么 pytest --cov 没反应?
因为没指定要测的模块或路径。pytest-cov 不会自动推断目标包,必须显式告诉它「覆盖谁」。
- 最简启动:运行
pytest --cov=my_module(my_module是你项目里实际存在的包名或目录名) - 若模块不在 Python path 中,先加
-p pytest_cov或确保当前目录有__init__.py,或用--cov=.覆盖当前目录下所有 Python 文件 - 常见错误:写成
--cov=src/(带斜杠)——这会被当作模块名解析失败;应写--cov=src
如何让覆盖率只统计业务代码,排除测试文件和 venv?
默认 --cov 会扫描所有导入过的代码,包括测试文件、第三方库,导致结果虚高或报错。
- 用
--cov-report=term-missing显示缺失行号,更易定位未覆盖逻辑 - 排除路径:加
--cov-ignore=tests/*和--cov-ignore=venv/*(注意通配符需 shell 支持,Windows cmd 下建议改用--cov-exclude配置文件方式) - 更可靠的做法是建
.coveragerc文件:
[run]
source = myapp
omit = */tests/*,*/venv/*,*/env/*,*/migrations/*,*/__pycache__/*
[report]
exclude_lines =
pragma: no cover
def __repr__
raise AssertionError
raise NotImplementedError为什么 coverage report 和 pytest --cov 数值不一致?
因为它们默认读取的 coverage 数据文件不同:pytest --cov 写入 .coverage,而单独跑 coverage report 可能读的是旧数据或别的文件。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 统一做法:加
--cov-fail-under=80让低于 80% 直接失败,避免手动查报告 - 生成 HTML 报告看细节:
pytest --cov=myapp --cov-report=html,打开htmlcov/index.html点击文件可看到每行是否执行 - 如果数值跳变,检查是否启用了
--cov-append(会累积历史数据),CI 环境务必加--cov-reset或删掉.coverage再跑
在 CI 中跑覆盖率要注意哪些兼容性坑?
GitHub Actions / GitLab CI 默认工作目录和本地不同,且可能没安装依赖或缺少 pytest-cov 插件本身。
立即学习“Python免费学习笔记(深入)”;
- 确保
pip install pytest-cov在测试命令前执行(不能只靠requirements.txt,有些 CI 缓存会跳过) - 用绝对路径防模块找不到:例如
pytest --cov=$(pwd)/src而不是--cov=src - 多进程测试(如
pytest-xdist)需额外加--cov-config=.coveragerc并启用[run] parallel = true,否则子进程覆盖率不合并
实际跑起来后,最容易被忽略的是 .coveragerc 的 source 字段 —— 它决定覆盖率统计的“根范围”,写错会导致大量文件显示为 “no data”,而不是 0%。

















