Coverage.py 使用详解:Python代码覆盖率测试完全指南
Coverage.py 使用详解:Python代码覆盖率测试完全指南
一、基础用法
1. 安装与基本命令
# 安装 pip install coverage # 运行测试并收集覆盖率数据 coverage run -m pytest tests/ # 生成报告 coverage report -m # 输出示例 Name Stmts Miss Cover Missing ------------------------------------------------------ my_module.py 57 3 95% 24-26, 42 tests/test_module.py 23 0 100% ------------------------------------------------------ TOTAL 80 3 96%
2. 常用命令行参数
| 只统计指定模式的文件 |
| 排除测试文件 |
| 只分析指定目录的代码 |
| 显示未覆盖的行号(Missing) |
| 覆盖率低于阈值时返回非零状态码 |
二、高级配置
1. 配置文件.coveragerc
[run] source = src omit = */tests/* */migrations/* */__init__.py branch = True parallel = True [report] exclude_lines = pragma: no cover def __repr__ raise NotImplementedError if __name__ == .__main__.: ignore_errors = True fail_under = 80 [html] directory = coverage_html title = My Project Coverage
2. 分支覆盖率
# 启用分支覆盖率分析 coverage run --branch -m pytest # 报告显示分支覆盖率 coverage report -m # 输出新增BR列显示分支覆盖率 Name Stmts Miss Branch BrPart Cover Missing ---------------------------------------------------- module.py 10 2 2 1 75% 3-4, 3->5
三、报告生成与分析
1. 多种报告格式
# 控制台报告(默认) coverage report # HTML报告(交互式) coverage html open htmlcov/index.html # XML报告(CI集成) coverage xml # JSON报告 coverage json
2. 动态排除代码块
def uncovered_function(): # pragma: no cover """这个函数不计入覆盖率统计""" pass def partial_cover(x): if x < 0: # pragma: no branch return "negative" return "positive"
四、API编程接口
1. 程序化控制覆盖率
import coverage cov = coverage.Coverage( source=["src"], omit=["src/tests/*"], branch=True ) cov.start() # 运行被测代码 import my_module my_module.main() cov.stop() cov.save() # 生成报告 cov.report() cov.html_report(directory='cov_html')
2. 合并多进程数据
# 主进程 cov = coverage.Coverage(data_file='.coverage.main') cov.start() # ...启动子进程... cov.stop() cov.save() # 子进程 cov = coverage.Coverage(data_file='.coverage.child1') cov.start() # ...执行代码... cov.stop() cov.save() # 合并 cov.combine(data_paths=['.coverage.main', '.coverage.child1']) cov.report()
五、持续集成集成
1. GitHub Actions配置
name: Test with Coverage on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 - name: Install dependencies run: | python -m pip install --upgrade pip pip install pytest coverage - name: Test with coverage run: | coverage run -m pytest coverage report --fail-under=90 - name: Upload coverage uses: codecov/codecov-action@v1
2. 与Codecov集成
# 安装上传工具 pip install codecov # 本地生成并上传报告 coverage run -m pytest coverage xml codecov -f coverage.xml
六、高级技巧
1. 选择性覆盖
# 只统计特定代码段的覆盖率 cov = coverage.Coverage() cov.start() with cov.collect(): # 只收集这个块内的覆盖率 important_function() cov.stop()
2. 上下文管理器
with coverage.Coverage() as cov: test_suite.run() cov.report()
七、常见问题解决
1. 缺失覆盖率数据
# 检查数据文件是否存在 ls -la .coverage # 强制重新收集 coverage erase coverage run -m pytest
2. 虚拟环境问题
# 确保在同一个Python环境中运行 which python which coverage # 使用模块方式运行 python -m coverage run -m pytest
八、最佳实践
- 合理设置阈值:核心模块100%,工具脚本80%
- 定期检查趋势:使用Codecov等工具监控覆盖率变化
- 结合质量门禁:在CI中设置
--fail-under
- 关注关键路径:不要盲目追求100%覆盖率
- 排除不需要的代码:合理使用
omit
和pragma: no cover
完整工作流示例
# 1. 配置 echo "[run] source = src omit = */tests/* branch = True" > .coveragerc # 2. 运行测试 coverage run -m pytest tests/ -v # 3. 生成报告 coverage html --skip-covered coverage report --show-missing # 4. CI集成 (GitLab示例) coverage xml curl -s https://codecov.io/bash | bash
通过系统化使用Coverage.py,您可以:
- 精确掌握代码测试覆盖情况
- 发现未经测试的代码路径
- 提高测试代码的有效性
- 建立质量保障的量化指标
进阶高级测试工程师 文章被收录于专栏
《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart