在 pytest.ini 或 pyproject.toml 中配置 fail_under = 80 即可使覆盖率低于 80% 时 pytest 退出码非 0,触发 CI 中断;该参数仅在启用 --cov 时生效,且不读取 .coveragerc,需置于 pytest 配置节中。

pytest-cov 要求测试覆盖率低于阈值就报错,怎么配?
直接在 pytest.ini 或 pyproject.toml 里加 fail_under 参数就行。它不是“提醒”,而是让 pytest 进程退出码非 0,CI 流水线会自然中断。
-
fail_under = 80表示整体覆盖率低于 80% 就失败(注意:是整数,不带 % 符号) - 只对
--cov指定的包/路径生效;没开--cov,fail_under完全不触发 - 如果同时用
--cov-report=term-missing,失败时仍会打印缺失行,方便定位哪块没覆盖
为什么加了 fail_under 却没生效?常见静默失效原因
最常踩的坑是配置位置不对或被覆盖。pytest-cov 不读 .coveragerc 里的 fail_under —— 那是 coverage.py 自己的配置,对 pytest 的门禁无效。
- 必须写在 pytest 能读到的配置里:
pytest.ini的[tool:pytest]下,或pyproject.toml的[tool.pytest.ini_options]中 - 命令行传参优先级更高:
pytest --cov --cov-fail-under=75会覆盖配置文件里的值 - 如果项目有多个
--cov目标(如--cov=src --cov=tests),fail_under判断的是所有目标合并后的总覆盖率,不是单个目录
按模块设不同覆盖率阈值,能实现吗?
原生 pytest-cov 不支持 per-module 的 fail_under。但可以曲线救国:用 coverage.py 的 paths + fail_under 配合多轮运行。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 在
.coveragerc里定义多个[run:xxx]区段,每个指定不同source和fail_under - 再用
coverage run -m pytest --cov-config=.coveragerc --cov-config-section=run:critical分别跑关键模块 - 注意:这会重复执行测试,影响速度;且
pytest-cov的命令行参数(如--cov-report)可能和coverage原生命令行为不一致
CI 中覆盖率突然掉 0.2%,是浮点精度问题吗?
不是精度问题,是统计口径变化。coverage.py 默认忽略 __init__.py、空行、纯注释、if False: 块,但一旦你加了新导入、类型提示或 docstring,行数基数变了,百分比就动。
- 检查
coverage debug sys输出的source_pkgs和include是否意外包含了不该测的目录(比如生成的build/) - 用
coverage debug config确认实际生效的配置来源,避免本地.coveragerc和 CI 的pyproject.toml冲突 - CI 环境中没装
pytest-cov或版本太老(--cov-fail-under 被静默忽略——建议固定版本如pytest-cov>=4.1.0
覆盖率门禁真正的复杂点不在配置语法,而在于“哪些代码该被统计”。一行没执行的 except 分支、mock 掉的第三方调用、甚至 if TYPE_CHECKING: 块,都可能让数字飘忽。得先理清业务逻辑边界,再谈阈值数字。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










