原文:http://pauloortins.com/lessons-unit-tests/
翻譯:
在團隊中進行單元測試/TDD的12 條經驗
測試可以幫助項目團隊找出代碼中存在的問題,TDD方式更是將測試放在了開發工作的首位。那麼在團隊中該如何應用單元測試和TDD呢?開發者Paulo Ortins結合自身經歷給出了本文中的12個經驗教訓 。文章翻譯如下。
背景
兩年前,我在一個Web項目開發組中,項目的目標是編寫一個類似Excel的、用來計算產品/服務價格的Web應用程序。項目團隊被分成3部分——開發團隊、需求團隊和QA團隊。隨着項目越做越大,而我們沒有使用任何形式的自動化測試(QA團隊使用手工測試),結果導致項目的測試時間比開發時間還要多。每進行一次小的改動,QA團隊都要花費幾個小時來做測試。
有一天,我參加了一個開發者會議,並與其他程序員談到了這些問題。他們建議我去學習單元測試、驗收測試和TDD (Test-Driven Development,測試驅動開發)。
我的經驗總結
下面是我在學習集成測試/TDD過程中的一些經驗教訓,希望能夠對大家有所幫助。
1. 不要第一次就在真實項目中嘗試TDD
這可能會讓你的項目很難進展。在採用TDD之前,你必須要了解TDD的工作流程以及如何去模擬對象(mock objects)、如何去模擬框架內部、如何組織測試等方面知識。因此,如果你的團隊還沒有準備好,就採用TDD可能會拖慢你的項目,從而錯過最終交付期限。
2. 採用編程道場 (Coding Dojo)方式學習TDD
我們發現編程道場是對新進入團隊的開發者培訓TDD以及提升他們編程技能的最好的方式。
編程道場是一種幫助提高編程技能的訓練方法。一般是在一個會議室裏,有一臺連接投影儀的電腦。每次道場還要有一個挑戰題目。每次有兩個人在電腦前結對編程來試圖解決挑戰的題目,並且由其他參加者提供建議。所有的參加者都要輪換到結對編程裏進行演練。(來自維基百科 )
3. 應用TDD之前嘗試說服你的整個團隊
沒有什麼比團隊中存在“破壞者”角色更令人沮喪的了。如果團隊中大部分人都在朝着TDD努力,而個別開發者所做的工作有可能毀掉這些努力,比如提交失敗的測試代碼等。我曾經就與這類人一起工作過。在團隊開始TDD開發之前,一定要讓所有人明白它的好處,並瞭解如何測試可以使軟件減少bug、如何重構代碼而不用擔心破壞整個項目等等。
4. 寫足夠多的測試
構建一個測試套件,就等於構建了一個bug防護盾。當團隊重構或改進軟件時應該完全信任這個“盾”。如果這個盾有缺口,那麼我們在更改代碼時會增加引入未知bug的風險。不要強求測試套件覆蓋100%的代碼,這是不可能的,而且相當耗時,但是,覆蓋大部分代碼是完全可以實現的。一個好的準則就是測試所有可能會出現問題的地方。
5. 使用覆蓋率工具
覆蓋率工具將會報告測試套件的缺口。藉助這些工具,可以很容易識別哪些代碼沒有測試。這些工具可以給我們一個直觀的認識,比如藍/綠着色線表示正在測試中的代碼,紅色着色線表示沒有測試。如果你是一個.NET程序員,Visual Studio旗艦版會帶有這個功能;如果你是一個Java程序員,你可以使用EclEmma 。
6. 測試速度要快
當在構建軟件時,我們永遠都在追趕最後的交付期限。我們的測試應該幫助我們實現這一目標,而不是耗時和延遲。
如果寫測試用例花費太長時間,在最後期限到來之前,團隊可能不會再花時間寫測試。如果在運行測試上花費太長時間,團隊可能不會在每次更改代碼後都運行它們。
7. 不要忽略失敗的測試
如果你的團隊對第1次失敗的測試不在意,那麼他們對第2、3、4次失敗的測試也不會太在意。這種情況下,測試套件反饋的問題將會被忽略,測試也不會對軟件質量有太大幫助。
8. 結對編程有助於團隊應用TDD
當我們首次試圖採用TDD時,或者最終交付期限臨近時,我們可能會忘了寫測試,而只顧寫生產代碼。結對編程可以阻止這種偷工減料的現象,強制團隊成員編寫測試。
9. 保持你的測試代碼整潔
爲了提高工作效率,我們的測試代碼可能不會像生產代碼一樣整潔。由於軟件發生改變時,測試代碼也必須改變,測試代碼也會越積越多,這樣一來,會導致最終測試代碼也很難維護。
10 測試應該有且只有一個失敗的理由
這個理由就是發現bug。如果你的測試代碼有大量的斷言,你就需要小心。如果生產代碼中的函數和類只有一個響應,那我們的測試代碼也應該只測試這一個事件。通過這種方式,將很容易找出失敗的測試,並弄清楚什麼地方出問題了。
11. 編寫單元測試將節省調試時間
通常在調試代碼、尋找bug時會花費大量的時間,一旦你編寫了單元測試,你將會在代碼的每一塊得到一個實時反饋,這將讓你更容易找到bug,節省調試時間。
12. 持之以恆
應用TDD可以改變我們的心態。對於部分開發者而言,開始寫測試很難,而在寫生產代碼之前寫測試就更難了。重要的是,要持之以恆地寫測試,一旦你的團隊完全適應了這種方法,生產效率會成倍提升。