什麼樣的測試算是好測試?我們又該怎麼知道如何編寫好測試?
Kent Beck斷定,好的測試應該具備下列條件:
- 互相隔離的(不受其他測試的表現形式、是否存在、執行結果的影響)
- 自動化的
- 編寫快
- 運行快
- 獨一無二(為開發人員提供自信,而不會由其他測試提供信息,與其他測試不相關)
Roy Osherove 補充:好的測試有三個基本屬性:
- 可維護
- 值得信賴
- 易於理解。
Mike Hill的列表要更長:
- 它會很短,通常只有十來行代碼。
- 它不會測試運行程序內部的對象,但是會測試為了測試目的而構建的應用內部的對象。
- 它只會調用很小的一部分代碼,通常是某個函數的某一分支。
- 它是灰盒的形式編寫的。也就是說,它運作的方式像是黑盒,但是有時又會利用白盒的長處。(一般來說,這是避免組合問題的重要因素。)
- 測試要符合生產代碼的編碼標準,比如,團隊目前對於優秀編碼的最佳看法。
- 應用的眾多小測試構成了一個「提交關卡」。這就是說,開發人員可以在所有小測試通過的情況下提交代碼,否則(強烈建議、甚至不惜手段)阻止他們提交。
- 測試應對接受測試的對象有完全的控制權,因此應是自包含的。也就是說,它不會依賴不屬於測試代碼及其依賴圖的任何其他對象。
- 它的運行時間非常短。
- 它會先於要測試的代碼變更之前編寫。
- 通過一系列slip-and-fake技巧,它會避免使用所有「糟糕」的collaborator。
Mike和Ron Jeffries提醒我們:TDD的核心價值是要簡化設計、提升開發效率;代碼質量的提升和bug數量的減少是因此而帶來的重要好處。
Jeremy Miller補充了良好單元測試應該具備:
- 與順序無關,並且是隔離的。運行測試的軟件可以按照以任何順序運行。
- 意圖明確。最好的單元測試應該能夠告訴閱讀者,一個對象的API是如何準備被調用的。
- 易於設置。
最後,Ed Burnette 寫到:要讓你的單元測試在任何方面都可以重複;測試邊界條件,並且要一直保持測試的通過率是100%。
沒有留言:
張貼留言