Item 42: Use Unit Tests#

如果你正在除錯的缺陷沒有出現在軟體的 unit testing 中,代表測試不足或完全缺失。考慮加入能暴露該缺陷的 unit tests。

從基礎開始#

如果軟體尚未使用 unit testing framework:

  1. 下載符合需求的 unit testing package
  2. 調整 build 設定以包含測試函式庫
  3. 在應用程式啟動碼中加入幾行來執行測試
  4. 設定基礎設施,在編譯和提交時自動執行測試

這將為專案帶來改善的文件化、集體所有權、便利的重構和簡化的整合。

撰寫測試的策略#

  • 識別可能與故障相關的函式,撰寫驗證其功能的 unit tests
  • 透過 top-downbottom-up 推理來找出要測試的函式
  • 盡量不看函式實作來撰寫測試,改為依據介面文件或呼叫端程式碼
  • 這可降低在 unit test 中重複錯誤假設的機率

執行測試後的分析#

  • 如果測試成功:擴大測試覆蓋率或驗證正確性
  • 如果多個測試失敗:專注於 dependency tree 底部的函式(被最少其他函式呼叫的那些)
  • 修復缺陷後,重新執行所有測試確保全部通過

為既有程式碼加入測試的挑戰#

為既有程式碼加裝 unit tests 並不容易,因為測試和程式碼通常需要一起開發才能讓程式碼易於測試。你可能需要重構程式碼

  • 將大型元素拆分為小型部件
  • 最小化函式之間的依賴
  • 簡化測試的呼叫方式

關於這個主題的優秀參考書籍是 Michael Feathers 的 Working Effectively with Legacy Code (Prentice Hall, 2004)。

重點回顧#

  • 用 unit tests 探測可疑函式來精確定位缺陷
  • 採用 unit testing framework、重構程式碼以容納測試、自動化測試執行,以提升除錯效率