返回

如何为 pytest 生成的进程添加代码覆盖率,提升测试有效性

python

为 pytest 生成的进程添加代码覆盖率

引言

代码覆盖率是一个衡量测试有效性的关键指标。pytest 是一种流行的 Python 测试框架,但它默认情况下不会收集进程的代码覆盖率数据。本文将介绍如何为 pytest 生成的进程添加代码覆盖率,从而获得更全面的测试报告。

添加代码覆盖率

创建 sitecustomize.py 模块

在本地站点包目录中创建一个名为 sitecustomize.py 的模块,并添加以下代码:

import coverage
coverage.process_startup()

设置 COVERAGE_PROCESS_START 环境变量

export COVERAGE_PROCESS_START=True

运行测试

使用 coverage 选项运行测试:

coverage run --rcfile=.coveragerc -m pytest tests/gui/test_screenshots.py

.coveragerc 配置

.coveragerc 文件包含以下配置:

[run]
source = src/
parallel = True
relative_files = True
omit =
    **/tests/*

解决问题

无数据收集警告

  • 确保 sitecustomize.py 模块已加载到 pytest 进程中。
  • 确保 COVERAGE_PROCESS_START 环境变量已正确设置。
  • 确保要覆盖的代码由测试脚本调用。

代码示例

# sitecustomize.py
import coverage
coverage.process_startup()

# tests/gui/test_screenshots.py
import subprocess

# 启动外部 Python 应用程序
subprocess.Popen(["python", "external_app.py"])

结论

通过遵循这些步骤,你可以为 pytest 生成的进程添加代码覆盖率,从而获得更全面的测试覆盖率报告。这对于确保代码被充分测试至关重要,并可以帮助你提高代码质量和稳定性。

常见问题解答

Q1:为什么使用 sitecustomize.py?
A1:sitecustomize.py 是一种用于在 Python 启动时加载自定义代码的模块。

Q2:为什么需要设置 COVERAGE_PROCESS_START 环境变量?
A2:该环境变量指示 Python 在每个子进程启动时启动覆盖率跟踪。

Q3:可以排除哪些文件进行覆盖率?
A3:可以使用 .coveragerc 配置中的 omit 部分排除文件。

Q4:如何并行收集覆盖率数据?
A4:在 .coveragerc 中将 parallel 设置为 True。

Q5:覆盖率报告在哪里生成?
A5:覆盖率报告生成到 coverage.xml 文件中。