编写测试套件

你可能已经注意到了,在阅读完前面的事例后,手动运行phpunit并指定测试类和PHP文件名会很快变得乏味。尤其是在处理有几十个甚至上百个类和文件的应用程序时,这种情况更加明显。PHPUnit 项目有一个内置的功能,可以用一条命令处理多个测试。这样一组测试被称为测试套件。

如何做…

1.最简单的是,你需要做的就是把所有的测试移到一个单独的文件夹里。

  1. mkdir tests
  2. cp *Test.php tests
  1. 你需要调整包含或需要外部文件的命令,以说明新的位置。所示的例子(SimpleTest)是在前面的事例中开发的。
  1. <?php
  2. use PHPUnit\Framework\TestCase;
  3. require_once __DIR__ . '/../chap_13_unit_test_simple.php';
  4. class SimpleTest extends TestCase
  5. {
  6. // etc.
  1. 然后你可以简单地以目录路径为参数运行phpunit。PHPUnit 会自动运行该目录下的所有测试。在这个例子中,我们假设有一个测试子目录。
  1. phpunit tests
  1. 你可以使用--bootstrap选项来指定一个在运行测试之前执行的文件。这个选项的一个典型用途是启动自动加载。
  1. phpunit --boostrap tests_with_autoload/bootstrap.php tests
  1. 这里是实现自动加载的示例bootstrap.php文件。
  1. <?php
  2. require __DIR__ . '/../../Application/Autoload/Loader.php';
  3. Application\Autoload\Loader::init([__DIR__]);
  1. 另一种可能性是使用 XML 配置文件定义一个或多个测试集。下面是一个只运行Simple*测试的例子。
  1. <phpunit>
  2. <testsuites>
  3. <testsuite name="simple">
  4. <file>SimpleTest.php</file>
  5. <file>SimpleDbTest.php</file>
  6. <file>SimpleClassTest.php</file>
  7. </testsuite>
  8. </testsuites>
  9. </phpunit>
  1. 下面是另一个基于目录运行测试的例子,也指定了一个引导文件。
  1. <phpunit bootstrap="bootstrap.php">
  2. <testsuites>
  3. <testsuite name="visitor">
  4. <directory>Simple</directory>
  5. </testsuite>
  6. </testsuites>
  7. </phpunit>

如何运行…

确保所有的测试都已经定义好了,在前面的 “编写一个简单的测试 “中已经讨论过了,然后你可以创建一个测试文件夹,并将所有的Test.php文件移动或复制到这个文件夹中。然后你可以创建一个测试文件夹,并将所有Test.php文件移动或复制到这个文件夹中。然后你需要调整_`_require_once`语句中的路径,如步骤2所示。

  1. phpunit tests

你应该看到以下输出。

编写测试套件 - 图1

为了演示通过bootstrap文件来使用自动加载,创建一个新的test_with_autoload目录。在这个文件夹中,定义一个bootstrap.php文件,代码如步骤5所示。在 tests_with_autoload 中创建两个目录。DemoSimple

从包含本章源代码的目录中,将该文件(在前面的第12步中讨论过)复制到test_with_autoload/Demo/Demo.php中。在开头的<?php标签后,添加这行。

  1. namespace Demo;

接下来,复制SimpleTest.php文件到 tests_with_autoload/Simple/ClassTest.php。(注意文件名的变化!). 你需要将前几行修改为以下内容:

  1. <?php
  2. namespace Simple;
  3. use Demo\Demo;
  4. use PHPUnit\Framework\TestCase;
  5. class ClassTest extends TestCase
  6. {
  7. protected $demo;
  8. public function setup()
  9. {
  10. $this->demo = new Demo();
  11. }
  12. // etc.

之后,创建一个 tests_with_autoload/phpunit.xml 文件,把所有的东西整合在一起。

  1. <phpunit bootstrap="bootstrap.php">
  2. <testsuites>
  3. <testsuite name="visitor">
  4. <directory>Simple</directory>
  5. </testsuite>
  6. </testsuites>
  7. </phpunit>

最后,改到包含本章代码的目录。现在你可以运行一个单元测试,其中包含一个bootstrap文件,以及自动加载和命名空间,如下所示。

  1. phpunit -c tests_with_autoload/phpunit.xml

输出结果应如下所示:

编写测试套件 - 图2

更多…

关于编写PHPUnit测试套件的更多信息,请看这个文档页:https://phpunit.de/manual/current/en/phpunit-book.html\#organizing-tests.xml-configuration。