pytest 覆盖率报告:pytest-cov 让测试覆盖度一目了然

小飞兽 Python 8 次阅读 2026-07-24

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 的高级用法

---
有问题欢迎在评论区交流!