菜单

回归测试框架

相关源文件

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

并行测试执行

回归测试框架的一个关键功能是它能够并行运行测试,显著缩短测试执行时间。

并行运行测试时

  1. RunWorkers 类创建多个工作线程。
  2. 每个线程创建一个子进程来运行测试。
  3. 子进程运行测试,并将结果作为 JSON 编码的消息发回。
  4. 主进程收集并汇总所有结果。

来源: 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使用外部网络资源的测试
decimaldecimal 模块的测试
cpuCPU 密集型测试
subprocesssubprocess 模块的测试
urlfetch下载文件的测试
gui需要 GUI 的测试

可以使用 -u--use 选项启用资源(例如,-u network,subprocess)。

来源: Lib/test/support/__init__.py Lib/test/libregrtest/utils.py

测试结果与报告

框架收集并汇总测试结果,提供详细信息,包括:

结果可以显示为各种格式,包括:

  • 带有颜色编码结果的控制台输出
  • JUnit XML 文件,用于与 CI 系统集成
  • 覆盖率报告(使用 -T--coverage 选项)

来源: Lib/test/libregrtest/results.py Lib/test/libregrtest/result.py

测试环境管理

该框架包括管理测试环境的功能:

  1. 路径设置:确保正确的 Python 路径配置
  2. 资源限制:调整打开文件描述符等资源限制
  3. 故障处理:设置故障处理器以捕获和报告崩溃
  4. 线程安全:配置线程异常钩子
  5. 清理:确保测试后资源的正确清理

此外,该框架还能检测到测试是否更改了环境,这有助于识别具有可能影响其他测试的副作用的测试。

来源: 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)环境的特殊模式

  1. 快速 CI 模式 (--fast-ci):由 GitHub Actions 使用,针对速度进行了优化
  2. 慢速 CI 模式 (--slow-ci):由 buildbot 工作人员使用,更全面

这些模式会自动配置各种选项以优化 CI 环境中的测试执行。

来源: Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/main.py

附加功能

测试框架包含其他几个功能

  1. JIT 测试:用于测试实验性 JIT 编译器的选项
  2. 超时控制:设置超时以防止测试挂起
  3. 内存限制:为内存密集型测试设置内存限制
  4. 测试二分查找:查找导致失败的确切测试
  5. 环境变更检测:识别会更改环境的测试

来源: Lib/test/libregrtest/cmdline.py Lib/test/libregrtest/main.py Lib/test/libregrtest/single.py

与其他测试工具的关系

回归测试框架利用了标准的 Python 测试工具,但增加了额外的功能

  1. 它使用 unittest 来运行大多数测试
  2. 它可以处理基于 doctest 的测试
  3. 它增加了并行执行、引用泄漏检测和资源控制等功能
  4. 它通过 JUnit XML 输出与 CI 系统集成

来源: Lib/test/libregrtest/single.py Lib/test/libregrtest/results.py