pytest 覆盖率报告:pytest-cov 让测试覆盖度一目了然
Introduction
测试写了100个用例,但真的测到代码的每个角落了吗?代码覆盖率(Code Coverage)是衡量测试质量的关键指标——它告诉你有多少行代码、分支、函数被测试跑过。
pytest-cov 是 pytest 的覆盖率插件,基于 coverage.py,生成 HTML、XML、JSON 等多种格式的报告。
---
基础语法
1. 安装
pip install pytest-cov
2. 基本用法
pytest --cov=myproject tests/
这会生成终端覆盖率摘要:
---------- coverage: platform darwin, python 3.x.x ----------
Name Stmts Miss Cover
---------------------------------------------
myproject/__init__ 20 0 100%
myproject/core.py 150 30 80%
myproject/utils.py 80 20 75%
---------------------------------------------
TOTAL 250 50 80%
3. 生成 HTML 报告
pytest --cov=myproject --cov-report=html tests/
# 报告生成在 htmlcov/ 目录
open htmlcov/index.html
4. 只测特定目录
pytest --cov=myproject.core --cov-report=term tests/
5. 覆盖率卡点(最低覆盖率阈值)
# 要求总体覆盖 ≥ 80%,任意文件 ≥ 60%
pytest --cov=myproject --cov-fail-under=80 --cov-fail-per-file=60 tests/
超过阈值才让测试通过,常用在 CI 流程里防止测试摆烂。
---
常见问题与注意事项
Q1: 只想看某个文件的覆盖情况?
pytest --cov=myproject.core tests/
Q2: 某些文件不想计入覆盖(第三方库、测试文件自身)?
pytest --cov=myproject --covomit='*/tests/*' --covomit='*/venv/*' tests/
或在项目根目录建 setup.cfg:
[coverage:omit]
*/tests/*
*/venv/*
*/__pycache__/*
Q3: 分支覆盖(branch coverage)怎么开?
pytest --cov=myproject --cov-branch tests/
分支覆盖会告诉你 if-else 语句里哪条分支没测到,比普通行覆盖更严格。
Q4: 覆盖率100%是目标吗?
不一定。追求100%覆盖度可能让你写出为覆盖而覆盖的无意义测试。合理的做法是:- 核心业务逻辑 ≥ 80%
- 错误处理分支要测
- 简单 getter/setter 可以跳过
---
延伸阅读
- [[pytest 参数化测试]] — 数据驱动提升覆盖效率
- [[GitHub Actions 自动化 CI]] — 把覆盖率检查加入 CI 流程
- [[unittest.mock 进阶]] — patch、Mock、Spy 的高级用法
---
有问题欢迎在评论区交流!