Item 42: Use Unit Tests#
如果你正在除錯的缺陷沒有出現在軟體的 unit testing 中,代表測試不足或完全缺失。考慮加入能暴露該缺陷的 unit tests。
從基礎開始#
如果軟體尚未使用 unit testing framework:
- 下載符合需求的 unit testing package
- 調整 build 設定以包含測試函式庫
- 在應用程式啟動碼中加入幾行來執行測試
- 設定基礎設施,在編譯和提交時自動執行測試
這將為專案帶來改善的文件化、集體所有權、便利的重構和簡化的整合。
撰寫測試的策略#
- 識別可能與故障相關的函式,撰寫驗證其功能的 unit tests
- 透過 top-down 或 bottom-up 推理來找出要測試的函式
- 盡量不看函式實作來撰寫測試,改為依據介面文件或呼叫端程式碼
- 這可降低在 unit test 中重複錯誤假設的機率
執行測試後的分析#
- 如果測試成功:擴大測試覆蓋率或驗證正確性
- 如果多個測試失敗:專注於 dependency tree 底部的函式(被最少其他函式呼叫的那些)
- 修復缺陷後,重新執行所有測試確保全部通過
為既有程式碼加入測試的挑戰#
為既有程式碼加裝 unit tests 並不容易,因為測試和程式碼通常需要一起開發才能讓程式碼易於測試。你可能需要重構程式碼:
- 將大型元素拆分為小型部件
- 最小化函式之間的依賴
- 簡化測試的呼叫方式
關於這個主題的優秀參考書籍是 Michael Feathers 的 Working Effectively with Legacy Code (Prentice Hall, 2004)。
重點回顧#
- 用 unit tests 探測可疑函式來精確定位缺陷
- 採用 unit testing framework、重構程式碼以容納測試、自動化測試執行,以提升除錯效率