Zend Framework - 单元测试

  • 简述

    通常,我们可以通过使用高级调试器工具或使用简单的命令(如 echodie)来调试 PHP 应用程序。在 Web 场景中,我们需要测试业务逻辑以及表示层。可以通过输入相关的测试数据来测试 Web 应用程序中的表单,以确保表单按预期方式工作。
    可以使用浏览器手动测试网站的设计。这些类型的测试过程可以使用单元测试实现自动化。单元测试在大型项目中是必不可少的。这些单元测试将有助于自动执行测试过程,并在出现问题时提醒开发人员。
  • 设置 PHPUnit

    Zend Framework 与 PHPUnit 单元测试框架集成。要为 Zend Framework 编写单元测试,我们需要设置 PHPUnit,这可以通过使用以下 Composer 命令轻松完成。
    
    $ composer require --dev phpunit/phpunit
    
    执行上述命令后,您将获得响应,如以下代码块所示。
    
    Using version ^5.7 for phpunit/phpunit 
    ./composer.json has been updated 
    Loading composer repositories with package information 
    Updating dependencies (including require-dev) 
    Nothing to install or update 
    Writing lock file 
    Generating autoload files 
    
    现在,当您打开“composer.json”文件时,您将看到以下更改 -
    
    "require-dev": { 
       "phpunit/phpunit": "^5.7" 
    }
    
  • TestCase 和 Assertions

    Zend Framework 提供了帮助程序类来对控制器进行单元测试。TestCasePHPUnit 框架中编写测试用例的主要组件,而 Zend Framework 提供了TestCase 的抽象实现,称为AbstractHttpControllerTestCase
    AbstractHttpControllerTestCase 提供了各种Assert方法,并可以按功能分组。它们如下所示 −
    • Request Assertions − 用于断言 http 请求。例如,断言控制器名称。
    • CSS Select Assertions − 用于使用 HTML DOM 模型检查响应。
    • XPath Assertions − 基于 X 路径的 CSS 选择断言的替代方法。
    • Redirect Assertions − 用于检查页面重定向。
    • Response Header Assertions − 用于检查响应标头,如状态代码(断言响应状态代码)

    创建测试目录

    可以为每个模块单独编写单元测试。所有与测试相关的编码都需要在模块根目录下的test文件夹中创建。
    例如,要为教程模块下可用的教程控制器编写测试,需要将测试类放在 myapp/module/Tutorial/test/Controller/目录下。

    让我们编写一个测试类来单元测试TutorialController
    首先,我们应该编写一个名为“TutorialController”的类,并将其扩展到抽象Http控制器测试用例。
    下一步是编写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)