專業人士的必備技能:TDD#
測試驅動開發(Test Driven Development, TDD)並非新興潮流,而是項已發展十餘年的成熟技術。
作者將 TDD 視為專業人士的指標——如果你不用 TDD,說明你還不夠專業。
TDD 的核心概念如同生物學中的「抗體匹配於抗原」,
每行產品程式碼(抗體)的誕生,都應是為對應一個特定測試案例(抗原)。
1. TDD 的三大法則 (The Three Laws)#
要落實 TDD,須嚴格遵守以下三條法則。這是種紀律,確保測試與開發同步進行。
| 核心規範內容 | 實踐細節與編譯邏輯 | 開發目標 |
|---|---|---|
| 先寫測試再寫程式 | 在尚未撰寫一個會失敗的單元測試前, 不可撰寫任何產品程式 | 確保測試驅動 (Test-Driven) |
| 最小化測試案例 | 只撰寫剛好無法通過的單元測試, 須包含編譯失敗也視為測試失敗 | 快速進入紅燈 (Red) 狀態 |
| 最小化產品代碼 | 只撰寫剛好能通過當前測試失敗的產品程式 | 快速進入綠燈 (Green) 狀態 |
這會讓你進入一個極短週期(幾秒到幾分鐘):寫點測試 ➡️ 寫點程式 ➡️ 通過 ➡️ 再寫點測試。
2. 為什麼需要 TDD?核心優勢解析#
| 優勢 | 說明 | 帶來效益 |
|---|---|---|
| 確定性 (Certainty) 與 隨時交付 | 程式碼被修改後,所有測試跑通, 就能確信沒有破壞任何功能 | 軟體隨時處於「可交付」的狀態, 具備極高的品質確定性 |
| 降低缺陷注入率 | TDD 能顯著降低 Bug 的數量 | 錯誤率下降形成正向循環, 更敢擴大程式碼使用範圍與迭代 |
| 勇氣 (Courage) | 沒有測試,開發者不敢重構; 有 TDD,只要測試通過就無恙 | 給予調整程式碼、優化結構的勇氣, 這被視為最重要的心理優勢 |
| 活生生的文件 (Documentation) | 單元測試就是最好的低階文件 | 不會說謊(失敗的測試會報錯), 用程式碼描述系統該「如何被用」 |
| 設計 (Design) | TDD 強迫你寫程式前先思考, 以便讓程式碼可被測試 | 強迫功能解耦。 若不先寫,程式碼易高度耦合, 最終變成無法測試的混亂 (Big Ball of Mud) |
3. 進攻 vs. 防守#
作者最後用戰略心態總結 TDD 的價值:
| 策略類型 | 做法 | 說明 |
|---|---|---|
| 防守 | 事後寫測試 | 等你寫完程式碼再補測試,只是防守, 且往往會因程式碼難測試而略過某些案例 |
| 進攻 | 先行編寫測試 (TDD) | TDD 是種主動進攻,它引導設計、確保品質, 並由始至終掌握開發主導權 |
如果你覺得 TDD 很花時間,請試想「除錯 (Debug)」和「修復被改壞的功能」花了你多少時間?
TDD 是用初期的投入,換取後期的維護成本歸零。