測試驅動開發
以垂直切片方式建構功能與修復錯誤,使用測試作為回饋循環。
核心原則
測試透過公開介面驗證行為,而非實作細節。如果你重構後測試因行為未改變而失敗,表示測試有問題。
反模式:水平切片
不要先寫完所有測試再進行所有實作。寫一個測試,讓它通過,然後重複。
錯誤: RED 測試1, 測試2, 測試3 -> GREEN 實作1, 實作2, 實作3
正確: RED 測試1 -> GREEN 實作1 -> RED 測試2 -> GREEN 實作2 -> ...
工作流程
1. 規劃
- 與使用者確認介面變更。
- 確認要測試哪些行為。你無法測試所有項目。
- 將行為列為可觀察的結果,而非實作步驟。
- 在撰寫程式碼前取得使用者核准。
2. 追蹤子彈
為一個行為撰寫一個測試。觀察它失敗。撰寫最簡短的程式碼讓它通過。
3. 增量循環
對於其餘每個行為:
- 撰寫下一個測試。
- 用最簡短的程式碼讓它通過。
- 不要預測未來的測試。
4. 重構
在所有測試通過後:
- 提取重複部分。
- 深化模組:小介面、深層實作。
- 每次重構步驟後執行測試。
切勿在 RED 狀態下重構。
每個循環的檢查清單
- 測試描述的是行為,而非實作。
- 測試使用公開介面。
- 測試能在內部重構後存活。
- 程式碼對應此測試是最簡短的。
- 未新增推測性功能。
規則
- 對於新行為,在實作之前撰寫測試。
- 使用型別提示與清晰的名稱。
- 保持函式小而單一目的。
- 快速失敗並提供明確的錯誤訊息。