今天我們來寫第一個單元測試吧! 不過在那之前,先讓我們了解單元測試的「3個A」
所謂的「3個A」,是指以下三個英文單字:
一個良好的單元測試案例,應該包含以上的結構, 依序執行 Arrange → Act → Assert, 並顯示驗證結果,這樣就是一個完整的單元測試程式。
事不宜遲,馬上來寫測試吧!
在開始撰寫第一個測試前,先讓我們做一個待測對象, 我們以一個計算BMI的函數為例子吧!
在 app\\Services
資料夾下,建立 TestService.php
:
<?php
namespace App\\Services;
class TestService{
public function calculateBmi(float $height, float $weight): float {
if ($weight <= 0) {
return 0.0;
} return $weight / ($height * $height);
}}
接著馬上來建立測試,在 workspace
容器內,專案資料夾下執行以下指令,建立單元測試:
php artisan make:test TestServiceTest --unit
建立 TestServiceTest.php
後,讓我們來撰寫測試函數吧:
<?php
namespace Tests\\Unit;
use App\\Services\\TestService;
use PHPUnit\\Framework\\TestCase;
class TestServiceTest extends TestCase{
/** * Test calculateBmi */
public function testCalculateBmi() {
// Arrange
// 初始化待測對象
// 以及執行測試所需的資料
$service = app(TestService::class);
$height = 1.6;
$weight = 64.0;
// Act
// 執行欲測試的函數/程式碼區塊/行為
$actualBmi = $service->calculateBmi($height, $weight);
// Assert
// 驗證測試結果
$expectedBmi = 25;
$this->assertEquals($actualBmi, $expectedBmi);
}}
首先,先來解釋各個區塊程式碼邏輯:
// Arrange
// 初始化待測對象
// 以及執行測試所需的資料
$service = app(TestService::class);
$height = 1.6;
$weight = 64.0;
這邊先建立1個 TestService
的實例 $service
, 並初始化稍候執行待測對象時,所需的資料。
// Act
// 執行欲測試的函數/程式碼區塊/行為
$actualBmi = $service->calculateBmi($height, $weight);
這邊就是執行要測試的程式碼區塊。
// Assert
// 驗證測試結果
$expectedBmi = 25;
$this->assertEquals($actualBmi, $expectedBmi);
進行驗證,其中 $this→assertEquals
是目前我們所用到的第一個 Assert 函數, 它用來驗證第一個輸入值(實際值)是否與第二個(期望值)輸入值相等。
待測對象與測試案例都準備好後,就讓我們來執行測試吧:
./vendor/bin/phpunit
應該會看到以下輸出結果:
恭喜完成第一個單元測試! 是不是很簡單呢?
下一篇來介紹常用的 Assert 函數。
如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄