單元測試中的“利人”與“利己”

單元測試中,每個測試類,甚至測試方法最好沒有依賴,這樣有很多好處:1.每個測試類都可以單獨運行並能成功;2.修改一個測試類不會對其它類造成影響。這也是爲什麼JUnit中提供setUp()和tearDown()的原因之一。
一般情況下,大家喜歡在setUp()中創建環境,運行完測試,在tearDown()中清除環境,這樣互相不依賴。我把這種情況叫做“利他”,即你相信別人,別人也相信你。這對很多單元測試都沒問題。
但是有時候你是否遇見過這樣的問題:
1.跟其他同事協作開發時,你對自己寫的單元測試瞭然於胸,但是未免不會心裏打鼓:萬一別人tearDown()不正確,並對我的測試有影響了怎麼辦?
一般情況下,大家需要實現商量好,比如都同意在setUp()創建環境,tearDown()清除環境。
2.即使跟其他同事商量好了setUp()、tearDown()的職責,你是否遇到過這樣的情況呢?
在IDE裏面跑某個DAO類所有的測試方法(可能測試方法比較多,需要的時間比較長),剛點了執行,突然發現某些地方寫錯了,或者其它原因,你直接終止了運行。這樣就造成了不希望的後果:下次運行測試也會失敗,因爲你強行終止了進程,沒有來得及tearDown()。於是下一次執行測試之前,你不得不通過sql或者其它辦法先把數據庫裏的數據清理一下。
3.你在運行所有單元測試的過程中,發現某個dao測試失敗了,經過仔細debug,花費了很多時間,發現竟然是前一個dao測試沒有清理完全數據,雖然之前你和同事已經商量過了。
同樣,在功能測試中也可能遇到前面所提的問題。那麼有更好的辦法嗎?

很多人可能已經實踐過這樣寫單元測試(尤其是DAO等代價比較高的測試),把清理環境和創建環境都放到setUp()時做。這樣肯定保證了自己單元測試的順利執行。我認爲這種方式是“利己”的方式,但是在這種情況下卻是非常合適的方式。雖然利己,但是如果大家事先生命,而且人人保證自己沒問題,那麼所有的單元測試一塊跑起來問題也就不大。
發佈了11 篇原創文章 · 獲贊 3 · 訪問量 3279
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章