同一個系統要維護兩個版本的對外介面,還要跟一個不受自己控制的外部系統交換資料。這個系列從一套真實運作中的 Laravel 專案的 63 支測試檔案出發,記錄測試分層怎麼設計才有意義:哪一層的失敗該讓你立刻知道是自己程式壞了,哪一層只是外部系統的資料長得跟預期不一樣。涵蓋 Unit/Feature 測試分層、測試替身設計、外部 SOAP 服務的整合測試手法,以及幾次「測試通過但沒有真的驗證到東西」的真實踩坑紀錄。
前言 「測試不是分 Unit 跟 Feature 兩層就好了嗎?為什麼還要另外花 30 天講這件事?」 如果你的專案只有一套對外介面、不用跟任何外部系統交換資料...
前言 「這個專案的測試是用 Pest 寫的還是 PHPUnit 寫的?」 如果你隨手打開這個系統的 tests/ 目錄亂逛,答案看起來很明確:滿眼都是 test...
前言 「每支測試都要先登入一個有權限的使用者,是不是寫一個共用函式,直接把使用者塞進去就好?」 聽起來理所當然,但這句話裡藏著一個容易被忽略的陷阱:如果那個「共...
前言 「User::factory()->create() 建出來的使用者,到底是一般人還是管理員?」 如果你的測試套件裡到處都是這種通用的 factor...
前言 「這筆測試需要的資料,migration 裡本來就有塞了,直接拿來用不就好了?」 這句話聽起來很省事——反正資料已經存在,何必再多寫一段 Factory...
前言 「這支測試要不要用 RefreshDatabase?」 這是一個看起來很小、但每次寫 Unit 測試都會遇到的判斷。今天要用這個系統裡兩支真正的純邏輯 U...
前言 「這段排序邏輯已經跑了很久,應該沒問題吧?」 這句話幾乎是每個維護老專案的人都說過的話。今天要講的案例,剛好打臉了這句話:這個系統的首頁排序邏輯,實際上早...
前言 「這個頁面回傳 200,測試就算過了嗎?」 這是很多人寫 Feature 測試時,不知不覺會停下來的地方——狀態碼是 200,代表伺服器沒有拋出例外、路由...
前言 「後台是用 Filament 這種管理面板套件開發的,測試也要照一般 HTTP 頁面那樣打請求、看回應內容嗎?」 答案是不行——至少不是最有效的方式。Fi...
前言 「同一個元件,有時候要單獨顯示,有時候要嵌在別的頁面裡顯示,這種情況測試該怎麼寫?」 昨天講的是「怎麼測一個 Filament 元件的動作有沒有真的發生」...