CPython 回归测试框架是一个全面的系统,用于验证代码更改不会破坏现有功能(回归)。该框架负责发现、执行和报告 Python 大量的测试套件。它提供了并行测试执行、引用泄漏检测、资源控制和详细报告的功能。
有关编写单个测试的信息,请参阅 unittest、doctest 或 Python 标准库中使用的其他测试框架的相应文档。
回归测试框架主要位于 Lib/test/libregrtest/ 目录,由几个相互关联的组件组成。
来源: Lib/test/libregrtest/main.py Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/findtests.py Lib/test/libregrtest/runtests.py Lib/test/libregrtest/worker.py Lib/test/libregrtest/results.py Lib/test/libregrtest/utils.py
CPython 的测试套件组织在 Lib/test/ 目录中,大多数测试文件遵循 test_*.py 的命名模式。测试框架还处理包含多个测试模块的特殊测试包。
来源: Lib/test/libregrtest/findtests.py
回归测试框架通常使用 python -m test 调用,并提供丰富的命令行选项来定制测试执行。最常见的选项包括:
| 选项 | 描述 |
|---|---|
-v, --verbose | 增加详细程度(可重复使用以获得更多详细信息) |
-j N, --multiprocess N | 使用 N 个进程并行运行测试 |
-m PATTERN, --match PATTERN | 仅运行名称与模式匹配的测试 |
-r, --randomize | 随机化测试执行顺序 |
-G, --failfast | 遇到第一个测试失败时停止 |
-u RESOURCES, --use RESOURCES | 指定要运行的特殊资源密集型测试 |
-M LIMIT, --memlimit LIMIT | 运行大型内存消耗测试,并指定限制 |
-R RUNS, --huntrleaks RUNS | 多次运行测试以检测引用泄漏 |
-w, --rerun | 以详细模式重新运行失败的测试 |
--fast-ci | 以快速 CI 模式运行(由 GitHub Actions 使用) |
通过运行 python -m test --help 可以获得选项的完整列表。
来源: Lib/test/libregrtest/cmdline.py
测试执行工作流程包括几个阶段,从解析命令行参数到显示测试结果。
来源: Lib/test/libregrtest/main.py Lib/test/libregrtest/setup.py Lib/test/libregrtest/run_workers.py
回归测试框架的一个关键功能是它能够并行运行测试,显著缩短测试执行时间。
并行运行测试时
RunWorkers 类创建多个工作线程。来源: Lib/test/libregrtest/run_workers.py Lib/test/libregrtest/worker.py
该框架包含专门支持检测 Python 代码中引用泄漏的功能,这对于保持解释器内存效率至关重要。
选项 -R 或 --huntrleaks 可启用此功能,它将每个测试运行多次,并检查引用计数是否持续增加,这可能表明存在引用泄漏。
来源: Lib/test/libregrtest/refleak.py
测试框架为控制资源密集型测试提供了复杂的资源管理功能。
| 资源 | 描述 |
|---|---|
all | 启用所有特殊资源 |
audio | 使用音频设备的测试 |
curses | 使用 curses 的测试 |
largefile | 创建大文件的测试 |
network | 使用外部网络资源的测试 |
decimal | decimal 模块的测试 |
cpu | CPU 密集型测试 |
subprocess | subprocess 模块的测试 |
urlfetch | 下载文件的测试 |
gui | 需要 GUI 的测试 |
可以使用 -u 或 --use 选项启用资源(例如,-u network,subprocess)。
来源: Lib/test/support/__init__.py Lib/test/libregrtest/utils.py
框架收集并汇总测试结果,提供详细信息,包括:
结果可以显示为各种格式,包括:
-T 或 --coverage 选项)来源: Lib/test/libregrtest/results.py Lib/test/libregrtest/result.py
该框架包括管理测试环境的功能:
此外,该框架还能检测到测试是否更改了环境,这有助于识别具有可能影响其他测试的副作用的测试。
来源: Lib/test/libregrtest/setup.py Lib/test/support/__init__.py
下图显示了回归测试框架中的关键类及其关系。
来源: Lib/test/libregrtest/main.py Lib/test/libregrtest/runtests.py Lib/test/libregrtest/run_workers.py Lib/test/libregrtest/result.py Lib/test/libregrtest/results.py
以下是一些运行测试套件的常用方法
| 命令 | 描述 |
|---|---|
python -m test | 运行所有测试 |
python -m test test_abc | 运行特定的测试模块 |
python -m test -j4 | 运行 4 个并行进程中的测试 |
python -m test -v | 运行更详细的测试 |
python -m test -m "socket" | 运行名称中包含“socket”的测试 |
python -m test -u all | 运行所有测试,包括资源密集型测试 |
python -m test -r | 随机化测试执行顺序 |
python -m test -R | 运行测试以检测引用泄漏 |
python -m test --fast-ci | 在快速 CI 模式下运行测试 |
来源: Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/main.py
测试框架包含持续集成(CI)环境的特殊模式
--fast-ci):由 GitHub Actions 使用,针对速度进行了优化--slow-ci):由 buildbot 工作人员使用,更全面这些模式会自动配置各种选项以优化 CI 环境中的测试执行。
来源: Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/main.py
测试框架包含其他几个功能
来源: Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/main.py Lib/test/libregrtest/single.py
回归测试框架利用了标准的 Python 测试工具,但增加了额外的功能
unittest 来运行大多数测试doctest 的测试来源: Lib/test/libregrtest/single.py Lib/test/libregrtest/results.py