什麼是 Pest
Pest 是建構於 PHPUnit 之上的測試框架,自 Laravel 11 以後於新專案中預設採用。可繼續使用 PHPUnit 豐富的斷言集,同時以 closure 為基礎的簡潔語法撰寫測試。 與 PHPUnit 的主要差異:Pest 的測試由 PHPUnit 執行,因此可與既有的 PHPUnit 測試共存。以
php artisan test 或 vendor/bin/pest 執行。describe / it / test 的區別
test()
最單純的定義。將測試名稱直接作為說明文使用。
it()
可以類似「it should…」的英文文體,寫出接近自然語言的敘述。
describe()
將相關的測試分組。用於共享 beforeEach() 或於檔案內的邏輯整理。
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()
Mail::fake()
Notification::fake()
Artisan 指令的測試
互動式指令的測試
RefreshDatabase 與 LazilyRefreshDatabase
RefreshDatabase
於各測試後將資料庫 rollback,保持乾淨狀態。於測試 suite 開始時執行 migration。
LazilyRefreshDatabase
RefreshDatabase 會於所有測試中確認 migration,而 LazilyRefreshDatabase 會將 migration 延遲至實際會變更資料庫的測試被執行為止。若有大量不觸及資料庫的測試,可以加速。
程式碼覆蓋率的量測
需要 Xdebug 或 PCOV。相關頁面
測試入門
確認 Laravel 中測試的基本撰寫方式與
php artisan test 的使用方式。