絕對是一個很好的清單。這裏有幾點想法:
先寫測試,然後是代碼。
我同意,在高層次。但是,我會更具體一些:「先寫一個測試,然後寫出只需要代碼來通過測試,然後重複。」否則,我會擔心我的單元測試看起來更像集成或驗收測試。
使用依賴注入的設計類。
同意。當一個對象創建它自己的依賴關係時,你無法控制它們。反轉控制/依賴注入爲您提供了該控件,允許您使用mocks/stubs /等隔離被測對象。這就是你如何獨立地測試對象。
使用Model-View-Controller或Model-View-Presenter從其行爲中分離出UI代碼。
同意。請注意,即使是演示者/控制器也可以使用DI/IoC進行測試,方法是將其呈現爲殘留/模擬視圖和模型。查看Presenter First TDD瞭解更多。
不要編寫靜態方法或類。
不確定我是否同意這一點。可以在不使用mock的情況下對靜態方法/類進行單元測試。所以,也許這是你提到的那些Rhino Mock特定規則之一。
編程接口,而不是類。
我同意,但原因稍有不同。接口爲軟件開發人員提供了極大的靈活性 - 除了支持各種模擬對象框架之外。例如,無法在沒有接口的情況下正確支持DI。
隔離外部依賴關係。
同意。使用界面隱藏外部依賴關係(如適用)。這將允許您將軟件與外部依賴關係隔離,無論是Web服務,隊列,數據庫還是其他內容。這是,尤其是當你的團隊不控制依賴(a.k.a. external)時很重要。
標記爲您想要模擬的方法。
這是Rhino Mocks的侷限性。在一個喜歡手工編碼存根的模擬對象框架環境中,這不是必需的。
而且,一對夫婦的新需要考慮的要點:
使用造物設計模式。這將有助於DI,但它也允許您隔離該代碼並獨立於其他邏輯進行測試。
使用Bill Wake's Arrange/Act/Assert technique編寫測試。這項技術非常清楚需要什麼配置,實際測試的內容以及期望的內容。
不要害怕推出自己的嘲笑/存根。通常,您會發現使用模擬對象框架會讓您的測試難以理解。通過滾動你自己,你可以完全控制你的模擬/存根,並且你將能夠保持你的測試可讀性。 (請參閱前一點。)
避免將單元測試中的重複重構爲抽象基類或設置/拆卸方法的誘惑。這樣做會隱藏來自開發人員的配置/清理代碼,以嘗試單元測試。在這種情況下,每個單獨測試的清晰度比重構重複更重要。
實施持續集成。在每個「綠色欄」上籤入您的代碼。構建您的軟件並在每次簽到時運行全套單元測試。 (當然,這本身並不是一種編碼習慣,但它是保持軟件清潔和完全集成的一個令人難以置信的工具。)
這是一個有用的列表。我們目前正在使用NUnit和Rhino.Mocks,對於不太熟悉單元測試這一方面的團隊成員來說,明確這些標準是很好的。 – 2008-09-24 13:38:02