原文:WRITE AWESOME UNIT TESTS
作者:molsjeroen導(dǎo)讀:本文作者主要闡述了應(yīng)該如何做好單元測試胃夏,并給出了三點建議:1.單元測試必須跑得足夠快(秒級);2.每個測試用例只針對一個問題赃蛛;3.避免影響因素陵刹,做到 100% 可靠性。
PS: 文章在個人博客上同步更新银室,敬請關(guān)注磺浙!
如果你會寫代碼护盈,那么你就會寫單元測試堂湖。然而寫好單元測試就是另一個話題了闲先。你以為單元測試代碼是需要你長期維護、重構(gòu)和開發(fā)的產(chǎn)品級代碼无蜂?別傻了伺糠!
本文旨在提供 3 個十分簡單的規(guī)則來幫你玩兒轉(zhuǎn)單元測試。每個規(guī)則之后都會給你提供可輕易實現(xiàn)的實用技巧斥季。
1.要跑的足夠快
寫測試的目的就是為了運行他們训桶。主要有兩個好處:
- 確保程序正常執(zhí)行
- 程序異常是查找原因
總體而言,測試是程序的安全保障泻肯,是避免回歸測試的主要武器。它們使得你可以重構(gòu)代碼而不會引入已經(jīng)修復(fù)的 bug慰照。
然而灶挟,需要注意的是:你需要執(zhí)行它們以使它們正常工作。
每次執(zhí)行測試毒租,它都會給你一個代碼狀況的反饋稚铣。反饋所用的時間越短,你找到問題的速度就越快墅垮,問題也就被修復(fù)的越快惕医。也就是說你希望每做一次改動就執(zhí)行一次測試,而不是在每次發(fā)布版本之前或基于每日的基礎(chǔ)版本執(zhí)行測試算色。
測試執(zhí)行的越頻繁抬伺,你從中得到的信息就越多。
你等待測試執(zhí)行的時間越短灾梦,你經(jīng)常執(zhí)行它們的意愿就越高峡钓。簡而言之妓笙,如果想要頻繁的執(zhí)行測試,那么測試代碼執(zhí)行的速度就必須要快能岩,快到無可復(fù)加寞宫!
整個測試執(zhí)行通過的時間應(yīng)該限制在 1 秒之內(nèi),而不是 10 秒拉鹃,更不能是 1 分鐘辈赋。
這意味著你:
- 要在 Java 虛擬機(JVM)上執(zhí)行測試,而不能是在設(shè)備上
- 要只測試獨立的業(yè)務(wù)邏輯單元
- 不要將 UI膏燕、數(shù)據(jù)庫和網(wǎng)絡(luò)測試包含在你的主測試套件中
- 不要在測試中使用 wait/sleep 語句
2. 編寫小而專的測試
要始終記得編寫測試是為了找出問題钥屈。也就是說你需要明確設(shè)計測試用例的目的是為了捕獲應(yīng)用中的 bug。
假如應(yīng)用中有一個 bug煌寇,你更喜歡哪種測試結(jié)果:
一個 bug -> 多條測試失敗
一個 bug -> 只有一條測試失敗
當(dāng)然是第二個焕蹄!因為這樣比較容易調(diào)試。當(dāng)一個測試失敗時阀溶,你可以根據(jù)測試名稱來查看哪里出了問題腻脏。
@Test
public void logInShouldFailWithWrongPassword() throws Exception {
// Test code
}
每一個 bug 必須只有一個對應(yīng)的測試失敗。失敗的原因需要用測試名來描述银锻。
這樣會強制你針對每個測試只檢查一個點永品,并且會保持測試足夠小而更容易理解,解釋和維護击纬。
這也是為什么一個好的測試應(yīng)該像我們代碼庫中的其他方法一樣鼎姐,小(只有幾行代碼)而專(只測一個點)更振。
要做到這一點炕桨,你需要:
- 在每條測試只包含一條斷言/驗證語句
- 將少量的大測試拆解為大量的小測試
- 在測試名中明確描述失敗的原因
3. 100% 的可靠性
測試是程序的安全保障,所以你需要認真對待失敗的測試肯腕。你需要放下手頭所有的事情去解決問題献宫。
想象一下,程序在你急切的想要添加一個新特性時突然出現(xiàn)了問題实撒,而你不得不放下當(dāng)前工作去修復(fù)出現(xiàn)的問題姊途。這是多么令人沮喪的事情啊V=堇肌!
再想一下负敏,如果你花費了幾個小時的時間去分析問題贡茅,沒有任何頭緒,(絕望中)又執(zhí)行了一次測試其做,所有的測試都通過了...
對開發(fā)者而言友扰,最沮喪的事情莫過于浪費時間在那些清理一下工程或重啟一下 IDE 就被修復(fù)的隨機錯誤彤叉。
如果多個測試都是這樣的原因?qū)е碌模銜φ麄€測試套件失去信任村怪。你不再認真對待失敗的測試秽浇,也將不再從整個測試套件中得到任何幫助。
這也是為什么你要保持測試 100% 的可靠性甚负,并且只在真正出現(xiàn)問題時使測試失敗柬焕。
要做到這一點,你需要:
- 在 JVM 上運行測試(與設(shè)備的連接可能會斷開)
- 在測試中模擬網(wǎng)絡(luò)交互
- 將 UI/集成測試移出單元測試套件
總結(jié)
測試執(zhí)行的越頻繁梭域,你從中得到的信息就越多斑举。好的單元測試依賴于足夠快、專病涨,并且可靠性足夠高富玷。
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=2&id=436514312&auto=1&height=66"></iframe>