2008-12-26

好的測試應該具備哪些特質?

什麼樣的測試算是好測試?我們又該怎麼知道如何編寫好測試?

Kent Beck斷定,好的測試應該具備下列條件:

  • 互相隔離的(不受其他測試的表現形式、是否存在、執行結果的影響)
  • 自動化的
  • 編寫快
  • 運行快
  • 獨一無二(為開發人員提供自信,而不會由其他測試提供信息,與其他測試不相關)

Roy Osherove 補充:好的測試有三個基本屬性:

  • 可維護
  • 值得信賴
  • 易於理解。

Mike Hill的列表要更長:

  • 它會很短,通常只有十來行代碼。
  • 它不會測試運行程序內部的對象,但是會測試為了測試目的而構建的應用內部的對象。
  • 它只會調用很小的一部分代碼,通常是某個函數的某一分支。
  • 它是灰盒的形式編寫的。也就是說,它運作的方式像是黑盒,但是有時又會利用白盒的長處。(一般來說,這是避免組合問題的重要因素。)
  • 測試要符合生產代碼的編碼標準,比如,團隊目前對於優秀編碼的最佳看法。
  • 應用的眾多小測試構成了一個「提交關卡」。這就是說,開發人員可以在所有小測試通過的情況下提交代碼,否則(強烈建議、甚至不惜手段)阻止他們提交。
  • 測試應對接受測試的對象有完全的控制權,因此應是自包含的。也就是說,它不會依賴不屬於測試代碼及其依賴圖的任何其他對象。
  • 它的運行時間非常短。
  • 它會先於要測試的代碼變更之前編寫。
  • 通過一系列slip-and-fake技巧,它會避免使用所有「糟糕」的collaborator。

Mike和Ron Jeffries提醒我們:TDD的核心價值是要簡化設計、提升開發效率;代碼質量的提升和bug數量的減少是因此而帶來的重要好處。

Jeremy Miller補充了良好單元測試應該具備:

  • 與順序無關,並且是隔離的。運行測試的軟件可以按照以任何順序運行。
  • 意圖明確。最好的單元測試應該能夠告訴閱讀者,一個對象的API是如何準備被調用的。
  • 易於設置。

最後,Ed Burnette 寫到:要讓你的單元測試在任何方面都可以重複;測試邊界條件,並且要一直保持測試的通過率是100%。

原文:
http://www.infoq.com/news/2008/10/qualities_good_test

沒有留言: