Zend Framework - 單元測試



一般來說,我們可以使用**高階除錯工具**或簡單的命令如**echo**和**die**來除錯PHP應用程式。在Web場景中,我們需要測試業務邏輯以及表示層。可以透過輸入相關的測試資料來測試Web應用程式中的表單,以確保表單按預期工作。

網站的設計可以透過瀏覽器手動測試。這類測試過程可以使用單元測試自動化。單元測試在大型專案中至關重要。這些單元測試將有助於自動化測試過程,並在出現問題時提醒開發者。

設定 PHPUnit

Zend框架與PHPUnit單元測試框架整合。要為Zend框架編寫單元測試,我們需要設定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 和斷言

Zend框架提供輔助類來單元測試控制器。**TestCase**是**PHPUnit**框架中編寫測試用例的主要元件,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(); 
}

編寫一個或多個方法,並根據需要呼叫各種assert方法。

 $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)
廣告
© . All rights reserved.