测试驱动开发(TDD)

测试驱动开发是指在开发过程中对应用程序的各个方面进行测试的过程。要么在开发前定义测试,然后使开发通过这些测试;要么先构建类和库,然后进行测试。测试应用程序是非常重要的,没有测试就启动应用程序,就好比从 30 层高的大楼跳下时没有降落伞一样。

PHP 没有提供任何内置的测试功能,但有其他测试框架可用于此目的。PHPUnit 是使用最广泛的框架或库之一。它是一个非常强大的工具,提供了许多功能。现在,让我们来看看它。

安装 PHPUnit 非常简单。只需下载并将其放在项目根目录下,这样就可以通过命令行访问它了。

PHPUnit 安装和基本详细信息(包括功能和示例)可以在 https://phpunit.de/ 上找到。

让我们举一个简单的例子。我们有一个 Book 类,如下:

class Book
{
    public $title;
    public function __construct($title)
    {
        $this->title = $title;
    }
    public function getBook()
    {
        return $this->title;
    }
}

这是一个简单类的示例,该类在实例化时初始化了 title 属性。当调用 getBook 方法时,它会返回该书的标题。

现在,我们要做一个测试,检查 getBook 方法是否返回 PHP 7 作为标题。因此,请执行以下步骤创建测试:

  1. 在项目根目录下创建测试目录。在测试目录下创建 BookTest.php 文件。

  2. 在 BookTest.php 文件中加入以下代码:

    include (__DIR__.'/../Book.php');
    
    class BookTest extends PHPUnit_Framework_TestCase
    {
        public function testBookClass()
        {
            $expected = 'PHP 7';
            $book = new Book('PHP 7');
            $actual = $book->getBook();
            $this->assertEquals($expected, $book);
        }
    }
  3. 现在,我们编写了第一个测试。请注意,我们把类命名为 BookTest,它扩展了 PHPUnit_Framework_TestCase 类。我们可以随心所欲地给测试类命名。不过,名称应易于识别,以便我们知道这是为需要测试的类编写的。

  4. 然后,我们添加了一个名为 testBookClass 的方法。我们也可以给这个方法取任何名字,但必须以 test 开头。否则,PHPUnit 将不执行该方法,并发出警告—​在我们的例子中,针对前面的测试类—​没有找到任何测试。在 testBookClass 方法中,我们创建了一个 Book 类对象,并将 PHP 7 作为标题。然后,我们使用 Book 类的 getBook 方法获取标题。重要的部分是 testBookClass 方法的最后一行,它执行断言并检查 getBook 返回的数据是否是所需的数据。

  5. 现在,我们准备运行第一个测试。在项目根目录下打开命令行或终端,然后发出以下命令:

    php phpunit.phar tests/BookTest.php

    执行该命令时,我们将得到类似于以下屏幕截图的输出:

    image 2023 11 06 09 24 35 445

    我们的测试成功执行,因为它符合我们测试中定义的标准。

  6. 现在,让我们稍微修改一下我们的类,将 PHP 传递给 Book 类,如下代码所示:

    public function testBookClass()
    {
        $book = new Book('PHP');
        $title = $book->getBook();
        $this->assertEquals('PHP 7', $book);
    }
  7. 现在,我们正在寻找 PHP 7,而我们的 Book 类返回 PHP,因此它不能通过我们的测试。执行该测试后,我们将出现失败,如下截图所示:

image 2023 11 06 09 26 25 817

从前面的截图中可以看出,我们的预期值是 PHP 7,而实际结果是 PHP 7。符号 - 表示预期值,符号 + 表示实际值。

在上一主题中,我们讨论了如何对库进行测试。我们只讨论了一个简单的基本测试。PHPUnit 并不局限于这些简单的测试,但完全介绍 PHPUnit 并不在本书的讨论范围之内。关于 PHPUnit 的一本很好的书是 Packt Publishing 出版的《PHPUnit Essentials》。