測試驅動開發

測試驅動開發 (Test Driven Development) #

專業人士的必備技能: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 很花時間,請試想「除錯 (Debug)」和「修復被改壞的功能」花了你多少時間?
TDD 是用初期的投入,換取後期的維護成本歸零。