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

閱讀時間約 10 分鐘

指令在現代 Laravel Web Applications 中,也是一個相當常見的應用,而 Laravel 也為此準備許多方便實現測試的函數,以下就來為大家介紹:

artisan()

  • 函數簽名: artisan($command, $parameters = [])
  • 函數說明:這應該是指令測試中最重要的一個!此函數可以在測試程式碼中,執行參數1 $command的指令,並且帶入參數2 $parameters 所附含的指令參數鍵值對。

assertSuccessful()

  • 函數簽名assertSuccessful()
  • 函數說明:此函數需接在 $this→artisan() 之後,它可以驗證指令是否成功執行完畢,並且回應 exit code 0(exit code 0 一般代表程式執行完畢且無錯誤或例外發生)。

assertFailed()

  • 函數簽名assertFailed()
  • 函數說明:此函數需接在 $this→artisan() 之後,它可以驗證指令是否非成功執行完畢,只要指令不是回應 exit code 0 ,就會被當 Failed

expectsConfirmation()

  • 函數簽名expectsConfirmation($question, $answer = 'no')
  • 函數說明:此函數需接在 $this→artisan() 之後,可以驗證是否有預期中的確認訊息輸出。

expectsQuestion()

  • 函數簽名:expectsQuestion($question, $answer)
  • 函數說明:此函數需接在 $this→artisan() 之後,可以驗證是否有預期中的詢問訊息輸出。

expectsOutput

  • 函數簽名expectsQuestion($output)
  • 函數說明:此函數需接在 $this→artisan() 之後,可以驗證是否有預期中的文字詢息輸出。

介紹完指令相關的測試函數,以下就舉個例子,來為大家展示實務應用吧!

  • app/Console/Commands/DeleteUser.php
<?php

namespace App\Console\Commands;

use App\Models\User;

use Illuminate\Console\Command;

use Illuminate\Support\Facades\Log;

class DeleteUser extends Command{

/** * The name and signature of the console command. * * @var string */

protected $signature = 'delete-user {userId}';

/** * The console command description. * * @var string */

protected $description = 'Delete the user of given id';

/** * Execute the console command. * * @return int */

public function handle(): int {

$userId = $this->argument('userId');

$user = User::find($userId);

if (empty($user)) {

$this->warn('User not found!');

return 1;

} if (!$this->confirm('Are you sure to delete this user?')) {

return 1;

} $logOptions = ['Console output', 'Log file'];

$logType = $this->choice(

'Please select log option:',

$logOptions

); $user->delete();

$message = 'User deleted';

if ($logType === $logOptions[0]) {

$this->info($message);

} else {

Log::info($message, ['userId' => $userId]);

} return 0;

}}

在以上程式碼中,我們實作了一個指令 DeleteUser ,當我們在命令列執行 php artisan delete-user {userId} 時,便會執行這個指令。這個指令有1個數入參數 userId ,其為欲刪除的 User 資料 ID。這個指令的功能與行為大致如下:

  • 以給定的 userId 嘗試撈取 User 資料,若無資料則顯示錯誤並結束指令,否則繼續流程。
  • 輸出 Are you sure to delete this user? 文字,讓使用者確認是否繼續執行刪除指令,並依使用者之回應決定提前結束指令或繼續流程。
  • 如使用者決定繼續流程,詢問使用者欲使用何種方式做記錄。
  • 刪除 User 資料
  • 依使用者所選擇的記錄方式執行記錄
  • 結束指令並回應 exit code 0

tests/Feature/CommandTest.php

<?php

namespace Tests\Feature;

use App\Models\User;

use Illuminate\Foundation\Testing\RefreshDatabase;

use Tests\TestCase;

class CommandTest extends TestCase{

use RefreshDatabase;

public function testUserNotFound() {

$this->artisan('delete-user',['userId' => 1])

->expectsOutput('User not found!')

->assertFailed();

} public function testSuccessDeleteUser() {

$user = User::factory()->create();

$userId = $user->id;

$this->artisan('delete-user', ['userId' => $userId])

->expectsConfirmation(

'Are you sure to delete this user?', 'yes'

) ->expectsQuestion('Please select log option:', 0)

->expectsOutput('User deleted')

->assertSuccessful();

$this->assertDatabaseCount('users', 0);

} public function testCancelDeleteUser() {

$user = User::factory()->create();

$userId = $user->id;

$this->artisan('delete-user', ['userId' => $userId])

->expectsConfirmation('Are you sure to delete this user?')

->assertSuccessful();

$this->assertDatabaseHas('users', [

'id' => $userId,

]); }}

以上測試程式碼,共分為3個測試案例情境:

  • 第1個測試案例 testUserNotFound(),測試的是當給定的 userId,無法在資料庫找到對應資料時,指令應有的對應行為與輸出
  • 第2個測試案例 testSuccessDeleteUser(),測試的是當給定的 userId,可在資料庫找到對應資料,且使用者於確認提示時輸入 yes後,指令應有的對應行為與輸出。
  • 第3個測試案例 testCancelDeleteUser(),測試的是當給定的 userId,可在資料庫找到對應資料,且使用者於確認提示時輸入 no 後,指令應有的對應行為與輸出。

以上就是針對指令測試的介紹,希望對各讀者有所幫助。

下一篇來介紹測試「失敗」吧!

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

參考資料

本系列文章目錄

avatar-img
8會員
279內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
WilliamP的沙龍 的其他內容
前一篇我們介紹了在撰寫自動化測試時常使用的 Trait,今天則要來為大家介紹 Auth 相關測試可如何進行,同時為大家示範 RefreshDatabase 與 WithoutMiddleware 這兩個 Trait 的使用。 取得當前登入使用者資料 在以 Laravel 開發 Web 服務時,常
在之前的文章中,我們分別演練了 API 測試與資料庫測試,今天則讓我們停下腳步,來介紹一些 Laravel 提供的,與 自動化測試有關的 Trait 吧! DatabaseMigrations 當我們使用了這個 Trait 後,會在每個測試被執行前,先執行 migrate ,接著在測試被執行後,
前置: Factory & UserRepository 在開始實作資料庫測試之前,先與大家介紹 Factory 這個東西。 Factory 是個 Laravel 的 ORM:Eloquent 提供的功能,它可以讓我們用很簡單的方式,去準備測試資料,在 Laravel 初始化後,預設已經幫我們準
在前幾篇文章中,我們介紹了測試3A原則,也介紹了許多 Assertion 函數,今天就讓我們實際演練吧! 過去的經驗中,最常用自動化測試來測式的對象,大概就是API了,而前後端分離也是目前 Web 開發界常用的模式,因此我們就以 API 測試來演練吧! 驗證HTTP Status Code H
今天會再與大家介紹幾個資料庫 Assertion 函數,與陣列 Assertion 函數。 與前一篇一樣,以下會提到的資料庫 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\\TestCase 。最後面介紹的2個
前一天與大家分享了幾個通用型 Assertion 函數,今天來為大家介紹幾個 HTTP 相關的 Assertion 函數吧! 今天要介紹的各函數,其使用方式和前一天所介紹的略有不同。以下所列各函數,皆是基於 HTTP Response 來做驗證測試,因此大家會看到 $response = $thi
前一篇我們介紹了在撰寫自動化測試時常使用的 Trait,今天則要來為大家介紹 Auth 相關測試可如何進行,同時為大家示範 RefreshDatabase 與 WithoutMiddleware 這兩個 Trait 的使用。 取得當前登入使用者資料 在以 Laravel 開發 Web 服務時,常
在之前的文章中,我們分別演練了 API 測試與資料庫測試,今天則讓我們停下腳步,來介紹一些 Laravel 提供的,與 自動化測試有關的 Trait 吧! DatabaseMigrations 當我們使用了這個 Trait 後,會在每個測試被執行前,先執行 migrate ,接著在測試被執行後,
前置: Factory & UserRepository 在開始實作資料庫測試之前,先與大家介紹 Factory 這個東西。 Factory 是個 Laravel 的 ORM:Eloquent 提供的功能,它可以讓我們用很簡單的方式,去準備測試資料,在 Laravel 初始化後,預設已經幫我們準
在前幾篇文章中,我們介紹了測試3A原則,也介紹了許多 Assertion 函數,今天就讓我們實際演練吧! 過去的經驗中,最常用自動化測試來測式的對象,大概就是API了,而前後端分離也是目前 Web 開發界常用的模式,因此我們就以 API 測試來演練吧! 驗證HTTP Status Code H
今天會再與大家介紹幾個資料庫 Assertion 函數,與陣列 Assertion 函數。 與前一篇一樣,以下會提到的資料庫 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\\TestCase 。最後面介紹的2個
前一天與大家分享了幾個通用型 Assertion 函數,今天來為大家介紹幾個 HTTP 相關的 Assertion 函數吧! 今天要介紹的各函數,其使用方式和前一天所介紹的略有不同。以下所列各函數,皆是基於 HTTP Response 來做驗證測試,因此大家會看到 $response = $thi
你可能也想看
Google News 追蹤
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節旨在介紹如何在不同操作系統上安裝和配置PHP環境,並使用命令行工具進行基礎操作。此外,還介紹了使用Visual Studio Code進行PHP開發的步驟,包括安裝擴展和設置調試環境。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Thumbnail
第一份正職工作 在iot公司擔任後端工程師,一上工就使用先前沒用過的php/laravel,也馬上負責公司產品的架構規劃,先前資料庫只有簡單記載使用者跟使用者的一些設定,很多地方有資料不一致的問題,產品內容還有很多實體的關係沒有被定義進資料庫都是這次改版我要做的事情。 改版納入公司、機器
Thumbnail
PHP是一個功能豐富且靈活的語言,用於開發動態和互動性強的網站。本文介紹了PHP的主要功能和用途,以及它的優點和特性。不論你是一個初學者還是一個專業的開發人員,PHP都是一個值得學習和使用的強大工具。
Thumbnail
這是一篇很精彩的測試文章喔!
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節旨在介紹如何在不同操作系統上安裝和配置PHP環境,並使用命令行工具進行基礎操作。此外,還介紹了使用Visual Studio Code進行PHP開發的步驟,包括安裝擴展和設置調試環境。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Thumbnail
第一份正職工作 在iot公司擔任後端工程師,一上工就使用先前沒用過的php/laravel,也馬上負責公司產品的架構規劃,先前資料庫只有簡單記載使用者跟使用者的一些設定,很多地方有資料不一致的問題,產品內容還有很多實體的關係沒有被定義進資料庫都是這次改版我要做的事情。 改版納入公司、機器
Thumbnail
PHP是一個功能豐富且靈活的語言,用於開發動態和互動性強的網站。本文介紹了PHP的主要功能和用途,以及它的優點和特性。不論你是一個初學者還是一個專業的開發人員,PHP都是一個值得學習和使用的強大工具。
Thumbnail
這是一篇很精彩的測試文章喔!