Zend Framework - การทดสอบหน่วย

โดยทั่วไปเราสามารถดีบักแอปพลิเคชัน PHP โดยใช้ไฟล์ advanced debugger tool หรือโดยใช้คำสั่งง่ายๆเช่น echo และ die. ในสถานการณ์บนเว็บเราจำเป็นต้องทดสอบลอจิกทางธุรกิจรวมทั้งเลเยอร์การนำเสนอ แบบฟอร์มในเว็บแอปพลิเคชันสามารถทดสอบได้โดยป้อนข้อมูลการทดสอบที่เกี่ยวข้องเพื่อให้แน่ใจว่าแบบฟอร์มทำงานตามที่คาดไว้

การออกแบบเว็บไซต์สามารถทดสอบได้ด้วยตนเองโดยใช้เบราว์เซอร์ กระบวนการทดสอบประเภทนี้สามารถทำได้โดยอัตโนมัติโดยใช้การทดสอบหน่วย การทดสอบหน่วยเป็นสิ่งสำคัญในโครงการขนาดใหญ่ การทดสอบหน่วยเหล่านี้จะช่วยทำให้กระบวนการทดสอบเป็นไปโดยอัตโนมัติและแจ้งเตือนนักพัฒนาเมื่อมีสิ่งผิดปกติเกิดขึ้น

การตั้งค่า PHPUnit

Zend framework ผสานรวมกับกรอบการทดสอบหน่วย PHPUnit ในการเขียน unit test สำหรับ 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 จัดเตรียมคลาสผู้ช่วยเหลือเพื่อทดสอบหน่วยควบคุม TestCase เป็นองค์ประกอบหลักในไฟล์ PHPUnit กรอบการเขียนกรณีทดสอบและ Zend Framework จัดเตรียมการใช้งาน TestCase แบบนามธรรมที่เรียกว่า AbstractHttpControllerTestCase.

AbstractHttpControllerTestCase นี้มีหลากหลาย Assertวิธีการและสามารถจัดกลุ่มตามฟังก์ชันการทำงาน มีดังนี้ -

  • Request Assertions- ใช้เพื่อยืนยันคำขอ http ตัวอย่างเช่น assertControllerName

  • CSS Select Assertions - ใช้เพื่อตรวจสอบการตอบกลับ HTML โดยใช้แบบจำลอง HTML DOM

  • XPath Assertions - อีกทางเลือกหนึ่งของการยืนยันการเลือก CSS ตาม XPath

  • Redirect Assertions - ใช้เพื่อตรวจสอบการเปลี่ยนเส้นทางหน้า

  • Response Header Assertions - ใช้เพื่อตรวจสอบส่วนหัวการตอบสนองเช่นรหัสสถานะ (assertResponseStatusCode)

สร้างไดเรกทอรีการทดสอบ

การทดสอบหน่วยสามารถเขียนแยกกันสำหรับแต่ละโมดูล ต้องสร้างการเข้ารหัสที่เกี่ยวข้องกับการทดสอบทั้งหมดภายในไฟล์test โฟลเดอร์ภายใต้ไดเร็กทอรีรากของโมดูล

ตัวอย่างเช่นในการเขียนการทดสอบสำหรับ TutorialController ที่มีอยู่ภายใต้โมดูลการสอนจำเป็นต้องวางคลาสทดสอบไว้ในไดเร็กทอรี myapp / module / Tutorial / test / Controller /

ตัวอย่าง

ให้เราเขียนคลาสทดสอบเพื่อทดสอบหน่วย TutorialController.

เริ่มต้นด้วยการเขียนคลาสที่เรียกว่า TutorialControllerTest และขยายไปยัง AbstractHttpControllerTestCase

ขั้นตอนต่อไปคือการเขียนไฟล์ Setupวิธีการตั้งค่าสภาพแวดล้อมการทดสอบ ซึ่งสามารถทำได้โดยเรียกไฟล์setApplicationConfig วิธีการและส่งไฟล์ config แอปพลิเคชันหลักของเรา 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'); 
   } 
}

ตอนนี้เปิดพรอมต์คำสั่งไปที่ไดเรกทอรีรากของแอปพลิเคชันและเรียกใช้ไฟล์ phpunit ปฏิบัติการที่มีอยู่ภายในไฟล์ vendor โฟลเดอร์

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)