运行测试套件

现在,我们对我们正在进行的测试有了基本的了解,让我们运行测试套件。在运行测试之前,请确保已成功从源代码构建了 php(请参阅 构建 PHP),并且在 sapi/cli/php 中有一个可执行文件。

运行测试套件有两种方法。

直接使用 run-tests.php 运行测试

您可以使用 run-tests.php 直接运行测试套件。至少您需要指定要测试的 php 可执行文件,您可以使用 -p 标志执行此操作。请注意,为了正确运行所有测试,这应该是 PHP 可执行文件的绝对路径。

~/php-src> sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php

您可以使用快捷标志来告诉 run-tests 针对当前调用的 PHP 可执行文件进行测试,即使用 -P 标志。

~/php-src> sapi/cli/php run-tests.php -P

如果您不想每次都设置 -p-P 标志,您可以使用 TEST_PHP_EXECUTABLE 环境变量指定 php 可执行文件,该变量可以在 Linux 机器上使用 export 进行设置。

~/php-src> export TEST_PHP_EXECUTABLE=sapi/cli/php
~/php-src> sapi/cli/php run-tests.php

在 Windows 系统中,可以使用 set 设置环境变量。

C:\php-src> set TEST_PHP_EXECUTABLE=sapi/cli/php
C:\php-src> sapi/cli/php run-tests.php

默认情况下,run-tests.php 会开始运行测试套件中的所有 15000 多个测试,这将耗时很长时间。你可以指定要运行的目标测试文件夹,甚至是单个测试。下面的示例将运行与 PHP 7 的 CSPRNG 相关的所有测试。

~/php-src> sapi/cli/php run-tests.php -P ext/standard/tests/random

您还可以指定运行多个目标文件夹或文件。

~/php-src> sapi/cli/php run-tests.php -P Zend/ ext/reflection/ ext/standard/tests/array/

如果运行了完整的测试套件,但测试失败,脚本会询问您是否要向 PHP QA 团队发送报告。这有时会很烦人。可以通过设置 -q 标志或设置环境变量 NO_INTERACTION=1 来抑制这个问题。

通过 Makefile 运行测试(推荐)

运行测试套件的推荐方法是通过 Makefile 中定义的 test 目标。test 目标会为你指定 PHP 可执行文件(你编译的那个)、设置一些默认 INI 设置并为你指定最佳的运行测试标志。您不必担心设置环境变量或设置其他标志,因此命令非常简单。

~/php-src> make test

与之前一样,run-tests.php 将开始运行整个测试套件。要指定要执行的文件夹或单个测试,您可以传递一个 TESTS 变量。以下示例将测试 PHP 是否可以正确处理二进制文字。

~/php-src> make test TESTS=Zend/tests/binary.phpt

您可以在 TESTS 变量中指定多个要运行的目标文件夹或文件,方法是在每个路径之间用空格隔开。

~/php-src> make test TESTS="Zend/ ext/reflection/ ext/standard/tests/array/"

并行执行测试

自 PHP 7.4 起,您可以通过在 run-tests.php 中传递 -j<workers> 标志来并行运行测试,其中 <workers> 是您想要的并行进程数。例如,-j4 将同时运行 4 个测试。

通过 run-tests.php 运行测试的示例:

run-tests.php -j8

通过 make 运行测试的示例:

make test TESTS="-j8"

更多选项

通过的测试通常并不那么有趣。您可以使用 -g 标志过滤要显示的测试。可能的值是 PASSFAILXFAILSKIPBORKWARNLEAKREDIRECT 例如,仅显示失败的测试:

~/php-src> run-tests.php -g FAIL

要获得 run-tests 支持的选项的完整列表,只需使用 --help 运行它。

~/php-src> sapi/cli/php run-tests.php --help

例如,使用 -x 跳过慢速测试、使用 --offline 跳过在线测试或使用 -m 使用 Valgrind 测试内存泄漏会非常有用。