Zend Framework - 单元测试

一般来说,我们可以使用高级调试工具或使用echodie等简单命令来调试 PHP 应用程序。在 Web 场景中,我们需要测试业务逻辑以及表示层。可以通过输入相关测试数据来测试 Web 应用程序中的表单,以确保表单按预期工作。

可以使用浏览器手动测试网站的设计。可以使用单元测试自动执行这些类型的测试过程。单元测试在大型项目中必不可少。这些单元测试将有助于自动化测试过程并在出现问题时提醒开发人员。

设置 PHPUnit

Zend 框架与 PHPUnit 单元测试框架集成。要为 Zend 框架编写单元测试,我们需要设置 PHPUnit,这可以通过使用以下 Composer 命令轻松完成。

$ composer require --dev phpunit/phpunit

执行上述命令后,您将获得如以下代码块所示的响应。

Zend Framework - 单元测试

一般来说,我们可以使用高级调试工具或使用echodie等简单命令来调试 PHP 应用程序。在 Web 场景中,我们需要测试业务逻辑以及表示层。可以通过输入相关测试数据来测试 Web 应用程序中的表单,以确保表单按预期工作。

可以使用浏览器手动测试网站的设计。可以使用单元测试自动执行这些类型的测试过程。单元测试在大型项目中必不可少。这些单元测试将有助于自动化测试过程并在出现问题时提醒开发人员。

设置 PHPUnit

Zend 框架与 PHPUnit 单元测试框架集成。要为 Zend 框架编写单元测试,我们需要设置 PHPUnit,这可以通过使用以下 Composer 命令轻松完成。

$ composer require --dev phpunit/phpunit

执行上述命令后,您将获得如以下代码块所示的响应。

使用 ^5.7 版 phpunit/phpunit
./composer.json 已更新
使用包信息加载 composer 存储库
更新依赖项(包括 require-dev)
无需安装或更新
编写锁定文件
生成自动加载文件

现在,当您打开"composer.json"文件时,您将看到以下更改

现在,当您打开"composer.json"文件时,您将看到以下更改 −

"require-dev": { 
   "phpunit/phpunit": "^5.7" 
}

TestCase 和断言

Zend 框架提供了辅助类来对控制器进行单元测试。TestCasePHPUnit 框架中用于编写测试用例的主要组件,Zend 框架提供了 TestCase 的抽象实现,称为 AbstractHttpControllerTestCase

此 AbstractHttpControllerTestCase 提供了各种 Assert 方法,可按功能分组。它们如下 −

  • 请求断言 − 用于断言 http 请求。例如,assertControllerName。

  • CSS 选择断言 −用于使用 HTML DOM 模型检查响应 HTML。

  • XPath 断言 − 基于 XPath 的 CSS 选择断言的替代方案。

  • 重定向断言 − 用于检查页面重定向。

  • 响应标头断言 − 用于检查响应标头,如状态代码 (assertResponseStatusCode)

创建测试目录

可以为每个模块单独编写单元测试。所有测试相关的代码都需要在模块根目录下的 test 文件夹中创建。

例如,要为 Tutorial 模块下的 TutorialController 编写测试,测试类需要放在 myapp/module/Tutorial/test/Controller/ 目录下。

示例

让我们编写一个测试类来对 TutorialController 进行单元测试。

首先,我们应该编写一个名为 TutorialControllerTest 的类并将其扩展为 AbstractHttpControllerTestCase。

下一步是编写 Setup 方法来设置测试环境。这可以通过调用 setApplicationConfig 方法并传递我们的主要应用程序配置文件 myapp/config/application.config.php 来完成

public function setUp() { 
   $configOverrides = [];  
   $this->setApplicationConfig(ArrayUtils::merge( 
      include __DIR__ . '/../../../../config/application.config.php', 
         $configOverrides 
   )); 
   parent::setUp(); 
}

根据需求编写一个或多个方法并调用各种断言方法。

$this->assertMatchedRouteName('tutorial');

我们已经编写了测试类,完整清单如下 −

<?php  
namespace TutorialTest\Controller;  
use Tutorial\Controller\TutorialController; 
use Zend\Stdlib\ArrayUtils; 
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;  

class TutorialControllerTest extends AbstractHttpControllerTestCase { 
   public function setUp() { 
      $configOverrides = [];  
      $this->setApplicationConfig(ArrayUtils::merge( 
         include __DIR__ . '/../../../../config/application.config.php', 
            $configOverrides 
      ));  
      parent::setUp(); 
   }  
   public function testIndexActionCanBeAccessed() { 
      $this->dispatch('/tutorial', 'GET'); 
      $this->assertResponseStatusCode(200); 
      $this->assertModuleName('tutorial'); 
      $this->assertControllerName(TutorialController::class); 
      $this->assertControllerClass('TutorialController'); 
      $this->assertMatchedRouteName('tutorial'); 
   } 
} 

现在,打开命令提示符,转到应用程序根目录并执行 vendor 文件夹中的 phpunit 可执行文件。

cd /path/to/app  
./vendor/bin/phpunit ./vendor/bin/phpunit module/
   Tutorial/test/Controller/TutorialControllerTest.php 

结果将如下面的代码块所示 −

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.  
.1 / 1 (100%)  
Time: 96 ms, Memory: 8.00MB  
OK (1 test, 5 assertions)