运行和编写测试

注意

此文档假设您正在从 Python 的正在开发中检出版本中进行操作。如果您没有这样做,那么此处介绍的一些内容可能无法正常工作,因为它们可能依赖于 Python 早期版本中不可用的新功能。

运行

运行测试套件的最短、最简单的方法是在检出目录的根目录中执行以下命令(在您构建 Python之后)

./python -m test
./python.exe -m test

这适用于大多数 macOS 系统。

.\python.bat -m test

这将运行大部分测试,但会排除其中一小部分;这些被排除的测试使用特殊类型的资源:例如,访问互联网,或尝试在您的桌面上播放声音或显示图形界面。它们默认被禁用,以便运行测试套件不会过于侵入。要启用其中一些附加测试(以及其他有助于调试各种问题(例如引用泄漏)的标志),请阅读帮助文本

./python -m test -h
./python.exe -m test -h
.\python.bat -m test -h

如果您想运行单个测试文件,只需将测试文件名(不带扩展名)指定为参数。您可能还希望启用详细模式(使用-v),以便详细说明各个失败

./python -m test -v test_abc
./python.exe -m test -v test_abc
.\python.bat -m test -v test_abc

要运行单个测试用例,请使用unittest模块,提供到测试用例的导入路径

./python -m unittest -v test.test_abc.TestABC_Py
./python.exe -m unittest -v test.test_abc.TestABC_Py
.\python.bat -m unittest -v test.test_abc.TestABC_Py

一些测试模块还支持直接调用,这对于 IDE 和本地调试可能很有用

./python Lib/test/test_typing.py
./python.exe Lib/test/test_typing.py
.\python.bat Lib/test/test_typing.py

但是,有几个重要的注意事项

  1. 这种运行测试的方法仅适用于本地开发人员需求,不建议用于其他任何用途

  2. 有些模块根本不支持它。一个示例是test_importlib。换句话说:如果某个模块没有unittest.main(),那么它很可能不支持直接调用。

如果您有一台多核或多 CPU 的计算机,则可以使用多个 Python 进程启用并行测试,以加快速度

./python -m test -j0
./python.exe -m test -j0
.\python.bat -m test -j0

最后,如果你想在更严格的一组设置下运行测试,你可以运行 test 作为

./python -bb -E -Wd -m test -r -w -uall
./python.exe -bb -E -Wd -m test -r -w -uall
.\python.bat -bb -E -Wd -m test -r -w -uall

传递给 Python 的各种额外标志使其对各种事情更加严格(-Wd 标志应该在某个时候是 -W error),但测试套件尚未达到所有警告都已处理的程度,因此我们无法保证无错误的 Python 将使用 -W error 正确完成测试运行。测试运行器的 -r 标志使其以更随机的顺序运行测试,这有助于检查各种测试是否不会相互干扰。 -w 标志导致失败的测试再次运行,以查看失败是暂时的还是一致的。 -uall 标志允许使用所有可用资源,以便不跳过需要(例如,Internet 访问)的测试。

要检查引用泄漏(仅在你修改了 C 代码时需要),请使用 -R 标志。例如,-R 3:2 将首先运行测试 3 次以稳定引用计数,然后再次运行 2 次以验证是否存在任何泄漏。

你还可以执行 Tools/scripts/run_tests.py 脚本,如在 CPython checkout 中找到的那样。该脚本尝试平衡速度和彻底性。但是,如果你想要最彻底的测试,你应该使用上面显示的严格方法。

区域设置支持

某些测试需要特定的区域设置才能成功运行。这些区域设置通常是非默认、非英语、非 UTF-8 区域设置。如果必要的区域设置不可用,则会跳过测试或在空运行模式下运行。你可能觉得在开发人员的机器或构建机器上设置有用的其他区域设置包括

  • en_US (en_US.utf8, en_US.iso88591) — 标准默认值

  • de_DE (de_DE.UTF-8) 或 fr_FR (fr_FR.utf8, fr_FR.iso88591, fr_FR.iso885915@euro) — 常见的非英语区域设置

  • tr_TR (tr_TR.iso88599) — 土耳其语对 “i” 和 “I” 的大小写有不同的规则。

  • ps_AF — 用于 test_decimal

在 Linux 和 macOS 上,locale 命令可用于列出可用区域设置并更改设置。环境变量 LANG 和以 LC_ 为前缀的变量可用于设置区域设置。

意外跳过

有时在运行测试套件时,您会看到报告的“意外跳过”。这些表示已跳过整个测试模块的情况,但测试套件通常希望在该平台上执行该模块中的测试。

通常,原因是由于缺少构建依赖项而导致未构建可选模块。在这些情况下,在跳过测试时报告的缺少的模块应与在 编译和构建 中报告为构建失败的模块之一相匹配。

在其他情况下,跳过消息应提供足够的详细信息,以帮助找出并解决问题的原因(例如,某些平台上的默认安全设置将不允许某些测试)

编写

为 Python 编写测试与为自己的代码编写测试非常相似。测试需要全面、快速、独立、始终可重复,并且尽可能简单。我们尝试对正常行为和错误条件进行测试。测试位于 Lib/test 目录中,其中包含测试的每个文件都带有 test_ 前缀。

与普通测试的一个区别是,我们鼓励您依赖 test.support 模块。它包含针对 Python 测试套件定制的各种帮助程序,并有助于解决常见问题,例如平台差异、资源消耗和清理或警告管理。该模块不适合在标准库之外使用。

当您向现有测试文件添加测试时,还建议您研究该文件中的其他测试;它将告诉您必须采取哪些预防措施才能使您的测试健壮且可移植。

有关 C API 的测试,请参阅 更改 Python 的 C API 中的测试部分。

基准

基准测试可用于测试更改不会降低性能。

Python 基准套件 为所有 Python 实现收集了一系列基准。有关运行基准的文档位于存储库的 README.txt 中。