Skip to main content

什麼是測試

測試是自動驗證程式碼是否如預期運作的機制。 撰寫測試後,加入功能或修改時能迅速確認既有行為是否被破壞。 在團隊開發中,有測試就能安心變更程式碼與 review。 Laravel 從一開始就內建測試支援,可使用 PestPHPUnit 兩者。 全新安裝時已自動準備 phpunit.xml 設定檔與 tests/ 目錄。
Pest 建構於 PHPUnit 之上,能以更簡潔易讀的語法撰寫測試。初次開始寫測試建議選 Pest。

tests/ 目錄結構

  • Feature/ — 放功能測試。用於包含 HTTP 請求等較大單位的測試。適合驗證多個物件協作、API 端點等接近整體應用的測試。多數測試都會放這裡。
  • Unit/ — 放單元測試。用於單一類別或方法等小單位的測試。不會啟動 Laravel 應用,因此不能使用資料庫或其他框架功能。

建立測試

make:test Artisan 指令產生新的測試類別。
會產生 tests/Feature/TodoTest.php

執行測試

php artisan test 指令執行測試。
直接執行 vendor/bin/pestvendor/bin/phpunit 也能得到相同結果,但 php artisan test 有較易讀的輸出,較推薦。 要只執行特定測試套組時可用選項:

基本測試撰寫

簡單斷言的範例。

常用斷言

HTTP 測試

Laravel 的 HTTP 測試無需實際啟動 HTTP 伺服器即可模擬對路由的請求。 這是 Feature/ 目錄下測試類別中可用的強大功能。

確認頁面顯示

get() 方法送 GET 請求並驗證回應。

ToDo 應用的 HTTP 測試範例

以有 Todo model 的應用為例,測試 CRUD 各項操作。

常用回應斷言

使用 RefreshDatabase trait 會在每次測試執行後重設資料庫。用於避免測試間資料互相干擾。

測試環境

phpunit.xml 的設定

在專案根目錄的 phpunit.xml 中做測試環境設定。 預設 session 與 cache 都設為 array driver,測試執行中不會留下資料。
資料庫通常使用不留檔的 SQLite in-memory 資料庫:

.env.testing 檔案

在專案根目錄建立 .env.testing,執行測試時會取代 .env 讀入。 可用於分開測試專用的資料庫連線或外部服務設定。
若設定被快取,請執行 php artisan config:clear 後再執行測試。否則舊快取可能造成設定未反映。

平行測試

測試數量增加後執行時間會拉長。 用 --parallel 選項可用多個 process 平行執行測試以縮短時間。 先安裝 brianium/paratest 套件。
之後加上 --parallel 選項執行:
預設會啟動 CPU 核心數的 process。要指定 process 數,用 --processes 選項。
使用平行測試時,各 process 需使用獨立的資料庫。搭配 RefreshDatabase trait 與 phpunit.xml 的 in-memory SQLite 設定即可正常運作。

後續步驟

HTTP 測試

可確認請求模擬、附帶認證的測試、JSON 斷言等更詳細的 HTTP 測試方式。
最後修改於 2026年8月2日