使用 shell 脚本运行测试

我们可以使用 shell 脚本来运行测试,这样我们就可以为每个脚本添加额外的配置。运行 PHPUnit 测试时需要运行不同的配置和命令,并且运行单元测试时要考虑不同的目标或意图。到目前为止,在本章中,我们运行了测试来触发 Xdebug 并检查代码,并且我们还使用 PHPUnit 来获取测试覆盖率的报告。为了更好地简化这些测试的执行,我们可以构建一些 shell 脚本来帮助我们封装运行测试的命令和配置。

如果您返回终端并尝试使用带有断点的 Xdebug,您可能会感到失望。在 PHPStorm 中,在其中一个测试中放置一个断点,如下所示:

image 2023 10 23 16 21 07 757
Figure 1. Figure 5.10 – Adding a breakpoint

在第 16 行的 CalculationTest.php 类中放置断点后,运行以下命令:

/var/www/html/symfony# php bin/phpunit --filter CalculationTest

你注意到什么了吗?断点根本没有被调用。这是因为我们之前运行 export XDEBUG_MODE=coverage,指定要在覆盖模式下使用 Xdebug。另一方面,如果我们在调试模式下运行测试,并希望获得覆盖率报告,那么我们就必须再次运行不同的命令。这并没有什么不妥,但如果我们要开发大量代码,并在不同配置下重复运行测试,那么使用 shell 脚本会更有帮助。

我们将创建两个脚本来触发 PHPUnit 并配置我们的环境:

  • runDebug.sh – 我们将使用它进行调试

  • runCoverage.sh – 我们将使用它来测试覆盖率报告

symfony 的根目录中,创建以下文件:

codebase/symfony/runDebug.sh
#!/bin/bash
export XDEBUG_CONFIG="idekey=PHPSTORM"
export PHP_IDE_CONFIG="serverName=phptdd"
export XDEBUG_MODE="debug"

XDEBUGOPT=
if [ "x$NODEBUG" = "x" ]; then
  XDEBUGOPT="-d xdebug.start_with_request=yes"
fi

php $XDEBUGOPT bin/phpunit --color=always --debug $@

在前面的脚本中,我们正在配置环境,以便使用 Xdebug 运行测试。这在开发过程中非常重要,因为它可以让我们使用断点,而不必总是考虑配置。

请确保您创建的文件是可执行的,运行以下命令即可:

/var/www/html/symfony# chmod u+x runDebug.sh

现在,我们可以尝试使用此脚本来执行 CalculationTest.php 类,并查看第 16 行中的断点是否被调用:

/var/www/html/symfony# ./runDebug.sh

运行上述命令后,返回 PHPStorm 并确保断点有效:

image 2023 10 23 16 27 53 508
Figure 2. Figure 5.11 – Using runDebug.sh with Xdebug

通过使用 ./runDebug.sh 脚本,我们可以动态配置容器并使用 Xdebug 触发 PHPStorm 中的断点。现在,如果我们想获取测试覆盖率报告,我们需要运行不同的脚本以使事情变得更容易。

创建一个名为 runCoverage.sh 的新文件:

codebase/symfony/runCoverage.sh
#!/bin/bash
export XDEBUG_CONFIG="idekey=PHPSTORM"
export PHP_IDE_CONFIG="serverName=phptdd"
export XDEBUG_MODE="coverage"

php bin/phpunit --color=always --coverage-text $@

前面的脚本将配置我们的环境并附加 --coverage-text 选项,以便我们在运行此脚本时可以轻松获得测试覆盖率报告。

运行以下命令:

/var/www/html/symfony# ./runCoverage.sh

运行 ./runCoverage 脚本现在应该生成相应的 代码覆盖率报告

image 2023 10 23 16 32 01 033
Figure 3. Figure 5.12 – Using the runCoverage.sh script

太好了!现在,我们可以使用不同的配置运行 PHPUnit。最后一次测试执行返回失败,原因是我们之前创建的 ExampleTest.php 测试类故意失败。

你可以根据需要添加自己的脚本,毕竟我们是软件开发人员。我们可以构建工具,让自己的工作更轻松一些。在运行持续集成(CI)时,我们不需要调试能力,也不需要一直运行代码覆盖率报告,因此我们还可以在项目的更下面创建一个脚本,用于 CI 的使用。我们将在 第 9 章 "持续集成" 中详细讨论 CI

我们现在已经学会了如何编写单元测试,这些测试主要用于测试解决方案代码中的小程序,但如果我们需要测试使用多个类的更复杂功能呢?如果我们能将这些依赖于外部对象或资源的复杂测试分离出来,那就更好了。在下一节中,我们将快速介绍不同类型的自动化测试。