PHPUnit 自動化測試大作戰【CH14】

更新 發佈閱讀 9 分鐘

今天要來為大家介紹幾個,在撰寫測試程式碼時可以利用的特殊函數。

setUp() & tearDown()

  • setUp():我們可以在這個函數中,撰寫想要在每個測試案例函數執行前預執行的邏輯。
  • tearDown():我們可以在這個函數中,撰寫想要在每個測試案例函數執行後預執行的邏輯。
  • 範例:
<?php

namespace Tests\Unit;

use App\Services\TestService;

use PHPUnit\Framework\TestCase;

class TestServiceTest extends TestCase{

private $service;

public function setUp(): void {

$this->service = app(TestService::class);

parent::setUp();

} public function testCanCalcuateBmi() {

$bmiActual = $this->service->calculateBmi(1.6, 64.0);

$bmiExpected = 64.0/(1.6*1.6);

$this->assertEquals($bmiExpected, $bmiActual);

} public function tearDown(): void {

parent::tearDown();

$this->service = null;

}}

在以上程式碼中, setUp()會在每個測試案例函數執行前,先初始化 $this→servicetearDown() 則會在每個測試案例函數執行後,清空 $this→service

setUpBeforeClass() & tearDownAfterClass()

  • setUpBeforeClass():與 setUp() 類似,但只會在每個測試類別的第1個測試案例函數執行前執行。
  • tearDownAfterClass():與 tearDonw() 類似,但只會在每個測試類別的第1個測試案例函數執行前執行。
  • 範例:
<?php

namespace Tests\Unit;

use App\Services\TestService;

use PHPUnit\Framework\TestCase;

class TestServiceTest extends TestCase{

private $service;

private static $flag;

public static function setUpBeforeClass(): void {

self::$flag = true;

parent::setUpBeforeClass();

} public function setUp(): void {

$this->service = app(TestService::class);

parent::setUp();

} public function testCanThrowExceptionWhenInvaliHeight() {

$this->expectException(Exception::class);

$this->service->calculateBmi(0.0, 1.0);

} public function testCanThrowExceptionWhenInvaliWeight() {

$this->expectException(Exception::class);

$this->service->calculateBmi(1.0, 0.0);

} public function testCanThrowExceptionWithMessageWhenInvaliData() {

$this->expectExceptionMessage('Invalid');

$this->service->calculateBmi(0.0, 1.0);

} public function testCanThrowExceptionWithMessageRegexMatcchWhenInvaliData() {

$this->expectExceptionMessageMatches('/Invalid/');

$this->service->calculateBmi(0.0, 1.0);

} public function testCanThrowExceptionWithCodeWhenInvaliData() {

$this->expectExceptionCode(1);

$this->service->calculateBmi(0.0, 1.0);

} public function tearDown(): void {

parent::tearDownAfterClass();

$this->service = null;

} public static function tearDownAfterClass(): void {

self::$flag = false;

parent::tearDownAfterClass();

}}

特別要注意的是,setUpBeforeClass() 及 tearDownAfterClass() 都只能宣告為靜態函數。

Data Providers

來到今天的重頭戲了,這個功能與前一天介紹的 @testWith 很像,話不多說,直接來看範例吧!

  • 範例
<?php

namespace Tests\Unit;

use App\Services\TestService;

use Exception;

use PHPUnit\Framework\TestCase;

class TestServiceTest extends TestCase{

/** * @dataProvider bmiProvider */

public function testCanThrowException(float $height, float $weight) {

$service = app(TestService::class);

$this->expectException(Exception::class);

$service->calculateBmi($height, $weight);

} public function bmiProvider() {

return [

[1.0, 0.0],

[0.0, 1.0],

[0.0, 0.0],

]; }}

在以上程式碼中,我們建立了, 1個 Data Provider 函數 bmiProvider(),以及1個測試案例函數 testCanThrowException(),並且註記使用 Data Provider 函數 bmiProvider()。在此測試類別中,testCanThrowException()實際上會執行3次,分別是:

  • testCanThrowException(1.0, 0.0)
  • testCanThrowException(0.0, 1.0)
  • testCanThrowException(0.0, 0.0)

其實它的使用方式與前一天的 @testWith 極為類似,但用起來會更直覺,也比較像在撰寫測試程式。

以上就是今天的介紹了!

下一篇讓我們來研究 Seeder a.k.a 播種器吧。

如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄

參考資料

本系列文章目錄

留言
avatar-img
WilliamP的沙龍
16會員
621內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
WilliamP的沙龍的其他內容
2023/12/18
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
2023/12/18
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
2023/12/18
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
2023/12/18
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
2023/12/18
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資
2023/12/18
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資
看更多