iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

同一套 Laravel 系統,測試怎麼寫才不會說謊 系列

同一個系統要維護兩個版本的對外介面,還要跟一個不受自己控制的外部系統交換資料。這個系列從一套真實運作中的 Laravel 專案的 63 支測試檔案出發,記錄測試分層怎麼設計才有意義:哪一層的失敗該讓你立刻知道是自己程式壞了,哪一層只是外部系統的資料長得跟預期不一樣。涵蓋 Unit/Feature 測試分層、測試替身設計、外部 SOAP 服務的整合測試手法,以及幾次「測試通過但沒有真的驗證到東西」的真實踩坑紀錄。

參賽天數 23 天 | 共 23 篇文章 | 1 人訂閱 訂閱系列文 RSS系列文
DAY 11

Day 11:使用者與角色測試——一個權限改動拆成兩支獨立測試檔各自驗證

前言 「這次改動同時影響了使用者管理跟角色管理兩個頁面,測試要寫在同一支檔案裡嗎?」 今天要看的案例,是這個系統一次真實的權限改動——一次調整同時影響了兩個不同...

2026-09-12 ‧ 由 recca0120 分享
DAY 12

Day 12:這個專案沒有 Policy 的 unit test——為什麼「測行為」有時候比「測實作」更有效

前言 「授權邏輯這麼重要,應該要有專門的 unit test 才對吧?」 這是我一開始也有的直覺:Policy 決定誰能看什麼、誰能做什麼,理論上應該是整個系統...

2026-09-13 ‧ 由 recca0120 分享
DAY 13

Day 13:表單與表格測試分離——跟著架構重構一起發生的測試結構調整

前言 「重構程式碼結構的時候,測試也要跟著大改嗎?」 很多時候答案是「不用,測試驗證的是外顯行為,內部怎麼組織不影響測試怎麼寫」。但今天要講一個例外:這個系統有...

2026-09-14 ‧ 由 recca0120 分享
DAY 14

Day 14:一支被 skip() 掉的登入測試——測試覆蓋率數字 vs 實際保護力落差

前言 「這支功能有寫測試,而且測試都是綠燈,應該可以放心吧?」 這句話聽起來很合理,但今天要拆一個真實案例,證明這個推論不一定成立。這個系統的登入功能確實「有測...

2026-09-15 ‧ 由 recca0120 分享
DAY 15

Day 15:附件測試——同一支 class 要吃三種舊系統資料格式,怎麼用 dataset 一次測完

前言 「同一段解析邏輯要處理好幾種輸入格式,測試該怎麼寫才不會變成複製貼上三份幾乎一樣的程式碼?」 這個系統有一個很典型的場景:外部系統回傳的新聞附件資訊,可能...

2026-09-16 ‧ 由 recca0120 分享
DAY 16

Day 16:Fake 測試替身設計——同一份錄影帶,兩支不同協定的 Fake 各自挑自己看得懂的部分播放

前言 「要 mock 兩種不同通訊協定的外部服務,是不是要各自準備一份假資料?」 這個系統要跟外部校務系統交換資料,走的是兩種不同的技術路徑:一般的 HTTP...

2026-09-17 ‧ 由 recca0120 分享
DAY 17

Day 17:VCR 測試法總覽——23 個 cassette 檔案怎麼分類組織

前言 「錄一次真實流量當測試資料,聽起來很方便,但錄下來的檔案越積越多,怎麼避免亂成一團?」 昨天講了兩支測試替身怎麼共用同一份錄製資料,今天要把鏡頭拉遠一點,...

2026-09-18 ‧ 由 recca0120 分享
DAY 18

Day 18:SOAP Client 測試——不真的打外部系統也能驗證邏輯

前言 「要測試一個包著 SOAP 協議的 Client 類別,是不是一定要連上真實的外部服務才能驗證?」 前兩天講了測試替身的設計理念跟錄影帶的組織方式,今天要...

2026-09-19 ‧ 由 recca0120 分享
DAY 19

Day 19:SSO 登入的單元測試很紮實——但要跟 Day 14 對照著看

前言 「這段邏輯的單元測試寫得很仔細,代表這個功能整體是安全的嗎?」 今天要看的這支測試,品質其實不差——針對單一登入(SSO)底層元件的驗證相當完整。但如果把...

2026-09-20 ‧ 由 recca0120 分享
DAY 20

Day 20:Crawler 測試——目前只有 happy path,這代表什麼風險

前言 「這段爬蟲邏輯有測試,是不是就代表它夠穩固了?」 今天要誠實面對一個沒那麼漂亮的案例。這個系統負責從外部網頁抓取新聞資料的 Crawler 類別,目前只有...

2026-09-21 ‧ 由 recca0120 分享