專業人士的必備技能: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 是用初期的投入,換取後期的維護成本歸零。