Skip to main content

什麼是 Pest

Pest 是建構於 PHPUnit 之上的測試框架,自 Laravel 11 以後於新專案中預設採用。可繼續使用 PHPUnit 豐富的斷言集,同時以 closure 為基礎的簡潔語法撰寫測試。 與 PHPUnit 的主要差異:
Pest 的測試由 PHPUnit 執行,因此可與既有的 PHPUnit 測試共存。以 php artisan testvendor/bin/pest 執行。

describe / it / test 的區別

test()

最單純的定義。將測試名稱直接作為說明文使用。

it()

可以類似「it should…」的英文文體,寫出接近自然語言的敘述。

describe()

將相關的測試分組。用於共享 beforeEach() 或於檔案內的邏輯整理。
describe() 可以巢狀。但過深的巢狀會使測試難以閱讀,建議以 2 層為限。

Expectation API

expect() 是 Pest 特有的斷言語法。可以方法鏈累積條件。

基本斷言

對模型的斷言

and()

each() 驗證陣列各元素

使用 Dataset 的參數化測試

若要以多個輸入值測試相同邏輯,可使用 dataset() 或 inline 的 with()

Inline Dataset

具名 Dataset

tests/Datasets 目錄定義 Dataset。

使用 Closure 的動態 Dataset

使用 Mockery 的單元測試

服務的 Mock

Spy

Spy 與 Mock 不同,會呼叫實作並留下呼叫紀錄。

部分 Mock

僅 mock 部分方法,其餘使用實際實作。

以 HTTP Fake 進行外部 API 呼叫的測試

使用 Http::fake() 可以不實際送出 HTTP 請求即 stub 回應。

基本 Fake

錯誤回應的測試

網路故障的模擬

事件、Mail、Notification 的 Fake

Event::fake()

亦可僅 fake 特定事件,其餘實際處理。

Mail::fake()

Notification::fake()

Artisan 指令的測試

互動式指令的測試

RefreshDatabaseLazilyRefreshDatabase

RefreshDatabase

於各測試後將資料庫 rollback,保持乾淨狀態。於測試 suite 開始時執行 migration。

LazilyRefreshDatabase

RefreshDatabase 會於所有測試中確認 migration,而 LazilyRefreshDatabase 會將 migration 延遲至實際會變更資料庫的測試被執行為止。若有大量不觸及資料庫的測試,可以加速。
對大多數專案而言 RefreshDatabase 為安全的選擇。若測試 suite 龐大且有大量無資料庫操作的測試時,可考慮 LazilyRefreshDatabase

程式碼覆蓋率的量測

需要 Xdebug 或 PCOV。
程式碼覆蓋率的量測會大幅增加測試執行時間。於 CI 環境建議分割至專用 job,或設定為僅於 pull request 時執行。

相關頁面

測試入門

確認 Laravel 中測試的基本撰寫方式與 php artisan test 的使用方式。
最後修改於 2026年8月2日