本文档提供了用于测试和开发 CPython 的工具的全面概述。它涵盖了回归测试框架 (libregrtest)、持续集成管道以及各种用于调试和性能分析的实用工具。有关构建系统的信息,请参阅 构建系统,有关扩展开发细节,请参阅 扩展开发与 C API。
CPython 开发工具集包括:
CPython 的测试基础设施的核心是名为 libregrtest 的回归测试框架。该框架负责测试发现、执行和结果报告。
来源:Lib/test/libregrtest/main.py Lib/test/libregrtest/utils.py Lib/test/libregrtest/runtests.py Lib/test/libregrtest/findtests.py
测试发现过程由 findtests.py 模块处理。测试通过以下方式发现:
Lib/test 目录中搜索匹配 test_*.py 模式的 Python 文件来源:Lib/test/libregrtest/findtests.py20-31
测试可以以几种模式执行
这是单个测试的运行方式
来源:Lib/test/libregrtest/single.py
测试框架最强大的功能之一是能够检测 CPython C 代码中的引用泄漏。这在 refleak.py 中实现,其工作原理是:
核心函数是 runtest_refleak(),它会多次运行测试并跟踪引用计数
来源:Lib/test/libregrtest/refleak.py52-305
test.support 包提供了许多实用工具来支持测试开发和执行。
主要支持功能包括:
来源:Lib/test/support/__init__.py
测试框架主要通过其命令行界面使用。
python -m test [options] [test_name1 [test_name2 ...]]
命令行界面提供了丰富的选项集,这些选项按类别进行组织:
| 类别 | 示例选项 | 目的 |
|---|---|---|
| 通用 | --timeout、--wait、--header | 控制测试执行环境 |
| 详细程度 | -v/--verbose、-W/--verbose3 | 控制输出详细级别 |
| 测试选择 | -m/--match、-i/--ignore、-r/--randomize | 控制运行哪些测试 |
| 执行 | -j/--multiprocess、-s/--single | 控制如何执行测试 |
| 特殊运行 | -R/--huntrleaks、-T/--coverage | 特殊测试模式 |
| 资源使用 | -u/--use、-M/--memlimit | 控制资源使用 |
来源:Lib/test/libregrtest/cmdline.py9-128
一些最重要的命令行选项
来源:Lib/test/libregrtest/cmdline.py207-545
CPython 使用 GitHub Actions 进行持续集成。工作流定义在 .github/workflows 目录中。
来源:.github/workflows/build.yml .github/workflows/jit.yml .github/workflows/reusable-tsan.yml
build.yml 中的主工作流协调整个 CI 管道。
build-context 作业)check-docs 作业)来源:.github/workflows/build.yml13-672
每个平台都有自己的工作流文件,定义了如何构建和测试 CPython。
| 平台 | 工作流文件 | 主要功能 |
|---|---|---|
| Windows | reusable-windows.yml | 在 x86、x64 和 ARM64 架构上进行测试 |
| macOS | reusable-macos.yml | 在 Intel 和 Apple Silicon 上进行测试 |
| Linux | reusable-ubuntu.yml | 在 x86_64 和 ARM64 上进行测试,并可选 BOLT 优化 |
| WASI | reusable-wasi.yml | WebAssembly 测试 |
来源:.github/workflows/reusable-windows.yml .github/workflows/reusable-macos.yml .github/workflows/reusable-ubuntu.yml .github/workflows/reusable-wasi.yml
提供几种特殊的测试模式:
来源:.github/workflows/reusable-tsan.yml .github/workflows/jit.yml
测试在各种构建配置下运行,以确保 CPython 在不同环境中正常工作。
| 配置 | 描述 | 控制方式 |
|---|---|---|
| 调试构建 | 包含断言和调试符号 | --with-pydebug 配置标志 |
| 发布构建 | 针对性能进行了优化 | 默认构建 |
| 启用 JIT | 使用实验性的 JIT 编译器 | --enable-experimental-jit 配置标志 |
| 自由线程 | 在没有全局解释器锁 (GIL) 的情况下运行 | --disable-gil 配置标志 |
| Sanitizers | 使用 LLVM Sanitizers | --with-address-sanitizer、--with-thread-sanitizer |
| BOLT 优化 | 使用 LLVM 的 BOLT 优化器 | --enable-bolt 配置标志 |
来源: .github/workflows/build.yml150-172 .github/workflows/reusable-ubuntu.yml91-100
CPython 包含一个用于收集系统信息的工具,以帮助调试测试失败。 pythoninfo.py 模块收集有关以下方面的详细信息:
这些信息对于在不同环境中重现和调试测试失败至关重要。
有多种命令和工具可供开发人员使用
测试结果以结构化格式报告,便于识别问题
-o/--slowest 获取性能统计信息结果也可以导出为 JUnit XML 格式,以便与 CI 系统集成。
来源: Lib/test/libregrtest/results.py
以下是运行测试的典型工作流程
运行完整的测试套件以确保一切正常
使用详细输出来运行特定测试
如果测试失败,请提供更多信息重新运行它
如果您怀疑存在内存泄漏,请运行并进行泄漏检测
来源: Lib/test/libregrtest/main.py55-184
在开发 CPython 的补丁时
python -m test 在本地运行相关测试CI 系统将根据您的拉取请求中所更改的文件自动选择要运行的测试。
来源: .github/workflows/build.yml24-43
CPython 的开发工具为测试、调试和维护 Python 解释器及标准库提供了一个全面的环境。回归测试框架、持续集成管道和调试工具协同工作,以确保代码库的质量和稳定性。