使用 shell 脚本运行测试
我们可以使用 shell
脚本来运行测试,这样我们就可以为每个脚本添加额外的配置。运行 PHPUnit 测试时需要运行不同的配置和命令,并且运行单元测试时要考虑不同的目标或意图。到目前为止,在本章中,我们运行了测试来触发 Xdebug
并检查代码,并且我们还使用 PHPUnit 来获取测试覆盖率的报告。为了更好地简化这些测试的执行,我们可以构建一些 shell
脚本来帮助我们封装运行测试的命令和配置。
如果您返回终端并尝试使用带有断点的 Xdebug
,您可能会感到失望。在 PHPStorm 中,在其中一个测试中放置一个断点,如下所示:

在第 16 行的 CalculationTest.php
类中放置断点后,运行以下命令:
/var/www/html/symfony# php bin/phpunit --filter CalculationTest
你注意到什么了吗?断点根本没有被调用。这是因为我们之前运行 export XDEBUG_MODE=coverage
,指定要在覆盖模式下使用 Xdebug
。另一方面,如果我们在调试模式下运行测试,并希望获得覆盖率报告,那么我们就必须再次运行不同的命令。这并没有什么不妥,但如果我们要开发大量代码,并在不同配置下重复运行测试,那么使用 shell
脚本会更有帮助。
我们将创建两个脚本来触发 PHPUnit 并配置我们的环境:
-
runDebug.sh
– 我们将使用它进行调试 -
runCoverage.sh
– 我们将使用它来测试覆盖率报告
在 symfony
的根目录中,创建以下文件:
#!/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 并确保断点有效:

通过使用 ./runDebug.sh
脚本,我们可以动态配置容器并使用 Xdebug
触发 PHPStorm 中的断点。现在,如果我们想获取测试覆盖率报告,我们需要运行不同的脚本以使事情变得更容易。
创建一个名为 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
脚本现在应该生成相应的 代码覆盖率报告:

太好了!现在,我们可以使用不同的配置运行 PHPUnit。最后一次测试执行返回失败,原因是我们之前创建的 ExampleTest.php
测试类故意失败。
你可以根据需要添加自己的脚本,毕竟我们是软件开发人员。我们可以构建工具,让自己的工作更轻松一些。在运行持续集成(CI)时,我们不需要调试能力,也不需要一直运行代码覆盖率报告,因此我们还可以在项目的更下面创建一个脚本,用于 CI 的使用。我们将在 第 9 章 "持续集成" 中详细讨论 CI。
我们现在已经学会了如何编写单元测试,这些测试主要用于测试解决方案代码中的小程序,但如果我们需要测试使用多个类的更复杂功能呢?如果我们能将这些依赖于外部对象或资源的复杂测试分离出来,那就更好了。在下一节中,我们将快速介绍不同类型的自动化测试。