Organizing Tests

Organizing Tests

PHPUnit 的目标之一是测试应该是可组合的:我们希望能够运行任意数量或组合的测试,例如整个项目的所有测试,或者测试组件的所有类别的测试该项目,或只是一个班的测试。

PHPUnit 支持组织测试并将它们组合成测试套件的不同方式。本章介绍最常用的方法。

使用文件系统编写测试套件

组成测试套件的最简单方法可能是将所有测试用例源文件保存在测试目录中。PHPUnit 可以通过递归遍历测试目录来自动发现和运行测试。

让我们看看sebastianbergmann / money库的测试套件。查看这个项目的目录结构,我们看到目录中的测试用例类在tests目录中镜像被测系统(SUT)的包和类结构src

src tests `-- Currency.php `-- CurrencyTest.php `-- IntlFormatter.php `-- IntlFormatterTest.php `-- Money.php `-- MoneyTest.php `-- autoload.php

要运行库的所有测试,我们只需要将 PHPUnit 命令行测试运行器指向测试目录即可:

phpunit --bootstrap src/autoload.php tests PHPUnit 6.4.0 by Sebastian Bergmann. ................................. Time: 636 ms, Memory: 3.50Mb OK (33 tests, 52 assertions)

如果您将 PHPUnit 命令行测试运行器指向一个目录,它将查找*Test.php文件。

要仅运行在CurrencyTest测试用例类中声明的测试,tests/CurrencyTest.php我们可以使用以下命令:

phpunit --bootstrap src/autoload.php tests/CurrencyTest PHPUnit 6.4.0 by Sebastian Bergmann. ........ Time: 280 ms, Memory: 2.75Mb OK (8 tests, 8 assertions)

为了更细致地控制运行哪些测试,我们可以使用以下--filter选项:

phpunit --bootstrap src/autoload.php --filter testObjectCanBeConstructedForValidConstructorArgument tests PHPUnit 6.4.0 by Sebastian Bergmann. .. Time: 167 ms, Memory: 3.00Mb OK (2 test, 2 assertions)

这种方法的缺点是我们无法控制测试的运行顺序。这可能会导致测试依赖关系问题,请参阅“测试依赖关系”一节。在下一节中,您将看到如何使用 XML 配置文件来明确测试执行顺序。

使用 XML 配置编写测试套件

PHPUnit 的 XML 配置文件(附录C)也可用于组成测试套件。例5.1显示了一个最小phpunit.xml文件,当目录递归遍历时,它将添加*Test*Test.php文件中找到的所有类tests

例5.1:使用 XML 配置编写测试套件

<phpunit bootstrap="src/autoload.php"> <testsuites> <testsuite name="money"> <directory>tests</directory> </testsuite> </testsuites> </phpunit>

如果phpunit.xmlphpunit.xml.dist(按该顺序)存在于当前工作目录--configuration且未被使用,配置将自动从该文件中读取。

可以明确执行测试的顺序:

例5.2:使用 XML 配置编写测试套件

<phpunit bootstrap="src/autoload.php"> <testsuites> <testsuite name="money"> <file>tests/IntlFormatterTest.php</file> <file>tests/MoneyTest.php</file> <file>tests/CurrencyTest.php</file> </testsuite> </testsuites> </phpunit>