[譯]如何寫好 Android 單元測試

原文:WRITE AWESOME UNIT TESTS
作者:molsjeroen

導(dǎo)讀:本文作者主要闡述了應(yīng)該如何做好單元測試胃夏,并給出了三點建議:1.單元測試必須跑得足夠快(秒級);2.每個測試用例只針對一個問題赃蛛;3.避免影響因素陵刹,做到 100% 可靠性。
PS: 文章在個人博客上同步更新银室,敬請關(guān)注磺浙!

unittests.png

如果你會寫代碼护盈,那么你就會寫單元測試堂湖。然而寫好單元測試就是另一個話題了闲先。你以為單元測試代碼是需要你長期維護、重構(gòu)和開發(fā)的產(chǎn)品級代碼无蜂?別傻了伺糠!

本文旨在提供 3 個十分簡單的規(guī)則來幫你玩兒轉(zhuǎn)單元測試。每個規(guī)則之后都會給你提供可輕易實現(xiàn)的實用技巧斥季。

1.要跑的足夠快

寫測試的目的就是為了運行他們训桶。主要有兩個好處:

  1. 確保程序正常執(zhí)行
  2. 程序異常是查找原因

總體而言,測試是程序的安全保障泻肯,是避免回歸測試的主要武器。它們使得你可以重構(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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市既穆,隨后出現(xiàn)的幾起案子赎懦,更是在濱河造成了極大的恐慌,老刑警劉巖幻工,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件励两,死亡現(xiàn)場離奇詭異,居然都是意外死亡囊颅,警方通過查閱死者的電腦和手機当悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踢代,“玉大人盲憎,你說我怎么就攤上這事「炜妫” “怎么了饼疙?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長串远。 經(jīng)常有香客問我宏多,道長儿惫,這世上最難降的妖魔是什么澡罚? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮肾请,結(jié)果婚禮上留搔,老公的妹妹穿的比我還像新娘。我一直安慰自己铛铁,他們只是感情好隔显,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布却妨。 她就那樣靜靜地躺著,像睡著了一般括眠。 火紅的嫁衣襯著肌膚如雪彪标。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天掷豺,我揣著相機與錄音捞烟,去河邊找鬼。 笑死当船,一個胖子當(dāng)著我的面吹牛题画,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播德频,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苍息,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壹置?” 一聲冷哼從身側(cè)響起竞思,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒸绩,沒想到半個月后衙四,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡患亿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年传蹈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步藕。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡惦界,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咙冗,到底是詐尸還是另有隱情沾歪,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布雾消,位于F島的核電站灾搏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏立润。R本人自食惡果不足惜狂窑,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桑腮。 院中可真熱鬧泉哈,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烫沙,卻和暖如春匹层,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锌蓄。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工又固, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煤率。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓仰冠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝶糯。 傳聞我的和親對象是個殘疾皇子洋只,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容