測試驅動開發指南

Jeffrey Palermo

2006年5月

摘要:通過本文,讀者可以瞭解如何結合Visual Studio Team System應用敏捷開發方法學裏所強調的重點——測試驅動開發。

內容
簡介
應用案例
測試驅動開發的優點
一個好的單元測試應具備的特點
結論
參考資料

簡介
測試驅動開發(TDD)是一種先進的技術,通過使用自動化單元測試來驅動軟件設計並強制依賴的鬆耦合。使用這一技術的結果是一整套單元測試集合,而且這些單元測試可以在任何時間被運行,以驗證軟件是否還正常工作。這一技術被那些應用敏捷開發方法學的人士推崇備至。爲了在Visual Studio Team System裏面使用該技術,你必須理解下面幾個地方:
• 在VSTS IDE裏面創建並運行自動化測試
• 在面向對象世界裏將依賴抽象化
• 重構新老特性以清楚代碼中的冗餘
• 如何寫單元測試?
• 如何組織測試列表?
• 如何運行選擇的測試?

單元測試開發的箴言就是“紅、綠、重構”

• 紅:創建測試,但無法通過
• 綠:使測試被任何必要的方法驗證通過
• 重構:修改代碼以清楚你項目中的冗餘,在確保所有測試仍然可以通過的情況下修正軟件的設計

紅/綠/重構圈在每個新的代碼單元出現時不停地被重複使用。


應用案例
在你使用VSTS時,下面的幾個步驟在你處理一個業已提供給你的工作項時會被遇到:

• 確保在你要創建新測試的解決方案裏有一個VSTS測試項目。

依照以下步驟執行(對不同的TDD開發者可能稍有不同):
1.理解故事、工作項或者現在使用的特性的需求。
2.紅:創建一個測試,但無法通過。
a.想象一下新代碼是如何被調用的,然後寫一個測試,就好像這段代碼已經存在一樣。這兒你不會得到只能提示,因爲新方法還不存在。
b.創建新產品代碼段。只需要能夠編譯就可以了。
c.運行測試。肯定會失敗。這是一個標準方法,用來確保測試調用了正確的代碼,或者錯誤的代碼不會偶然正常工作。這是一個有意義的失敗,你也希望它是失敗的。

3.綠:使測試被任何必要的方法驗證通過。
a. 寫產品代碼並測試通過。注意要簡潔。
b.. 有些人認爲先驗證期望返回值的硬代碼,這樣測試成功檢測會好一些。這一點因人而異。
c. 如果你寫的代碼如期通過測試,那麼你的工作可以告一段落了,不需要再費勁腦汁繼續寫了。測試是“完成”的客觀定義。俗語“夠用就好”經常被用來杜絕那些不必要的工作。如果還需要新功能,那就再寫一個測試。測試通過後繼續。
d. 當測試通過後,也許此時你想要運行所有的測試,以確保一切運轉正常。

4.重構:修改代碼以清楚你項目中的冗餘,在確保所有測試仍然可以通過的情況下修正軟件的設計。
d. 清楚由新增功能造成的冗餘。
e. 修正設計以優化整體方案。
f. 每次重構後,重新運行所有測試以確保仍被通過。

5.重複這一過程。每次重複應該非常短,一個典型的開發時間段內應該包含許多紅/綠/重構過程。

測試驅動開發的優點
• 單元測試集合提供持久的每個組件仍正常工作的反饋。
• 單元測試扮演同步更新的文檔,保證隨時可用。
• 當測試通過,產品代碼被重構清楚過冗餘時,表明這段代碼完成,開發者可以轉戰下一個測試。
• 測試驅動開發強制嚴肅的分析和設計,因爲開發者在沒有正確理解什麼是想要的結果和如何測試的情況下不能創建產品代碼。
• 軟件傾向去更好的設計,也就是說“鬆耦合和健壯性”,因爲開發者可以自由地做設計決定並在任何情況下重構,以保證軟件仍在正常工作。
• 測試集扮演一個Bug的回溯安全網:如果發現了一個Bug,開發者應該創建一個測試來看看這個Bug怎麼產生的,然後修改產品代碼,這樣就可以消除Bug而且其他的測試一切正常。在每一個後來的測試運行時,以前的Bug修復都會被驗證。
• 減少調試時間。

一個好的單元測試應具備的特點
一個好的單元測試應該具備以下特點:
• 跑得快,跑得快,跑得快。如果測試運行很慢,他們就不會經常被運行。
• 隔離或者模擬環境依賴,比如數據庫、文件系統、網絡及隊列等等。有依賴的測試運行的不會很快,而且一個失敗不會給出問題真正所在的有意義反饋。
• 限制範圍。如果測試失敗,很快就能知道到哪兒查找問題。使用幾個斷言就可以找出錯誤的代碼所在。在一個測試裏面測試一件事情是很重要的。
• 在獨立的環境下運行和通過。如果測試需要特殊的環境配置或者失敗的不明就裏,那麼就不是好的單元測試。修改的更簡單和可靠一些。測試應該可以在任何機器上運行和通過。“在我機子上可用”的辯解是無用的。
• 經常使用樁和鉤子對象。如果被測試的代碼調用一個數據庫或者文件系統,一定要模仿出那些依賴。一般情況下,可以通過使用接口抽象掉這些依賴。
• 明確表示測試意圖。其他的開發者可以看到這個測試並且理解產品代碼想達到一個什麼目的。

結論
測試驅動開發是一種先進的技術,通過使用單元測試可以驅動軟件的設計。本文提綱挈領地講述了這一技術,但市面上已經有了許多關於這個話題的書籍。

你可以使用VSTS在使用或者不使用測試驅動開發的情況下設計單元測試軟件。團隊應該知道那種方法更適用於他們。

參見James Newkirk的Test-Driven Development in Microsoft .NET一書,微軟出版社出版。

參考
• 單元測試概覽
• 創建單元測試
• 微軟.NET平臺上的測試驅動開發:主頁

關於作者
Jeffrey Palermo是DataCert公司(應用敏捷開發方法學的一家ISV)的高級軟件開發人員。他是奧斯丁.NET用戶組的指導者,還是南方Texas的INETA會員經理。Jeffrey擁有MCSD的.NET認證。他的Blog是:http://codebetter.com/blogs/jeffrey.palermo/。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章