建構測試體系 (Building Tests) #
在重構過程中,一套穩固的測試套件是不可或缺的安全網。
Martin Fowler 強調,多數專案的測試往往太過稀疏,而非過於冗長。
重構的首要前提,就是擁有一套 自我驗證(Self-verifying) 的測試程式碼。
測試撰寫的核心原則 #
撰寫測試時,請謹記以下指導原則,讓測試成為開發助力而非阻力:
1. 全自動化與自我驗證 #
- Fully Automate: 測試必須能完全自動化執行。
- Self-Verifying: 每個測試都必須能自行驗證結果(Pass 或 Fail),不需要人工檢查輸出。如果測試不能清楚告訴你「成功」或「失敗」,它就失去了自動化的意義。
2. 測試是強大的偵測器 #
- Bug Detectors: 將測試視為強大的 Bug 偵測器。好的測試套件應該能顯著減少你追蹤與定位錯誤的時間。
- Ensure Failure: 確保測試在該失敗的時候會失敗。一個永遠沈默(永遠顯示通過)的測試,等同於壞掉的測試。
3. 關注風險熱點 #
- Boundary Conditions: 集中火力測試 邊界條件(Boundary Conditions) 與極端情況(Edge Cases)。
- Risk-Based: 你的測試應該集中在那些「最容易出錯」的地方,而非平均分配給所有程式碼。
4. 不要追求完美,但不要放棄 #
- Don’t Skip: 即使你無法捕捉到所有 Bug,也不要因此就放棄撰寫測試。擁有一部分的測試,絕對勝過完全沒有測試。
面對 Bug 的標準作業程序 #
當你在開發過程中收到一個 Bug 回報時,請遵循以下黃金流程:
當 Bug 出現時 (When a bug is reported):
- 先寫測試: 修復程式碼前,先寫個能重現該 Bug 的測試案例
- 確認失敗: 執行該測試,確認它會失敗(這代表你成功捕捉到了問題)
- 修復代碼: 修改程式碼,直到測試通過
這不僅能修復當下問題,還能防止該 Bug 未來再次出現(Regression)