談?wù)劄槭裁磳憜卧獪y試

單元測試是什么

單元測試 是針對 程序的最小單元 來進(jìn)行正確性檢驗的測試工作。程序單元是應(yīng)用的最小可測試部件。一個單元可能是單個程序、類、對象、方法等。 ——維基百科


項目存在問題

2016年之前,我司的Android項目都是用肉眼review + 真機測試做功能測試,對junit、robolectric、espresso望而生畏。其原因是:

  • 缺乏unit test意識 & 實踐經(jīng)驗
  • 框架對單元測試不友好
  • 業(yè)務(wù)繁重
  • 研發(fā)人手不足

當(dāng)時工程面臨問題:

  • 代碼耦合度較高
  • 架構(gòu)落后
  • 各種bug

由于缺乏單元測試認(rèn)識、實踐,導(dǎo)致對框架重構(gòu)迷失目標(biāo)。意識不足是很嚴(yán)重的問題,框架重構(gòu)沒有方向。因此,首要任務(wù),就是對單元測試全面了解。


單元測試意義

  • 減少bug
  • 快速定位bug
  • 提高代碼質(zhì)量
  • 減少調(diào)試時間
    ...

減少bug

一個機器,由各種細(xì)小的零件組成,如果其中某件零件壞了,機器運行故障。必須保證每個零件都按設(shè)計圖要求的規(guī)格,機器才能正常運行。

一個可單元測試的工程,會把業(yè)務(wù)、功能分割成規(guī)模更小、有獨立的邏輯部件,稱為單元。單元測試的目標(biāo),就是保證各個單元的邏輯正確性。單元測試保障工程各個“零件”按“規(guī)格”(需求)執(zhí)行,從而保證整個“機器”(項目)運行正確,最大限度減少bug。

提高代碼質(zhì)量

由于每個單元有獨立的邏輯,做單元測試時需要隔離外部依賴,確保這些依賴不影響驗證邏輯。因為要把各種依賴分離,單元測試會促進(jìn)工程進(jìn)行組件拆分,整理工程依賴關(guān)系,更大程度減少代碼耦合。這樣寫出來的代碼,更好維護,更好擴展,從而提高代碼質(zhì)量。

快速定位bug、減少調(diào)試時間

如果程序有bug,我們運行一次全部單元測試,找到不通過的測試,可以很快地定位對應(yīng)的執(zhí)行代碼。修復(fù)代碼后,運行對應(yīng)的單元測試;如還不通過,繼續(xù)修改,運行測試.....直到測試通過

對于Android項目,要測試某個功能點,不用單元測試的話,必須運行在真機、模擬器上,慢慢debug找到問題點。運行程序到真機,快則半分鐘,慢則幾分鐘。junit只需在本地運行即可,就幾秒的事(robolectric需要十幾秒)。有時,寫那個功能模塊的員工已離職,APP運行出錯(邏輯錯誤,非crash or exception),你根本就不知道調(diào)試哪個類。如果離職的員工之前寫了單元測試,運行一下立馬就找到問題點了。單元測試大大減少調(diào)試時間,從而達(dá)到節(jié)約時間成本的效果。

放心重構(gòu)

重構(gòu),每個開發(fā)者都會經(jīng)歷,重構(gòu)后把代碼改壞了的情況并不少見。以往,寫完一個框架,運行APP,沒什么問題,完事。由于最初的框架并不是你寫的,可謂牽一發(fā)動全身,你改1個方法導(dǎo)致整個框架運行失敗....

如果你有單元測試,情況大不相同。寫完一個類,把單元測試寫了,確保這個類邏輯正確;寫第二個類,單元測試.....寫100個類,道理一樣,每個類做到第一點“保證邏輯正確性”,100個類拼在一起肯定不出問題。你大可以放心一邊重構(gòu),一邊運行APP;而不是整體重構(gòu)完,提心跳膽地run。


誰逼你寫單元測試?

領(lǐng)導(dǎo)要求

有些經(jīng)驗豐富的領(lǐng)導(dǎo),或多或少都會要求團隊寫單元測試。對于有一定工作經(jīng)驗的隊友,這要求挺合理;對于經(jīng)驗尚淺的、畢業(yè)生,恐怕要死要活了,連代碼都寫不好,還要寫單元測試,are you kidding me?

培訓(xùn)新人單元測試用法,是一項艱巨的任務(wù)。新人代碼風(fēng)格未形成,也不知道單元測試多重要,強制單元測試會讓他們感到困惑,沒辦法按自己思路寫代碼。

大牛都寫單元測試

國外很多家喻戶曉的開源項目,都有大量單元測試。例如,retrofit、okhttpbutterknife.... 國外大牛都寫單元測試,我們也寫吧!

很多讀者都有這種想法,一開始滿腔熱血。當(dāng)真要對自己項目單元測試時,便困難重重,很大原因是項目對單元測試不友好。最后只能對一些不痛不癢的工具類做單元測試,久而久之,當(dāng)初美好愿望也不了了之。

保住面子

都是有些許年經(jīng)驗的老鳥,還天天被測試同學(xué)追bug,好意思么?花多一點時間寫單元測試,確保沒低級bug,還能彰顯大牛風(fēng)范,何樂而不為?

心虛

筆者也是個不太相信自己代碼的人,總覺得哪里會突然冒出莫名其妙的bug,也怕別人不小心改了自己的代碼(被害妄想癥),新版本上線提心跳膽......花點時間寫單元測試,有事沒事跑一下測試,確保原邏輯沒問題,至少能睡安穩(wěn)一點。


TDD 測試驅(qū)動開發(fā)

Test-Driven Development, 測試驅(qū)動開發(fā), 是敏捷開發(fā)的一項核心實踐和技術(shù),也是一種設(shè)計方法論。TDD原理是開發(fā)功能代碼之前,先編寫測試用例代碼,然后針對測試用例編寫功能代碼,使其能夠通過。由于TDD對開發(fā)人員要求非常高,跟傳統(tǒng)開發(fā)思維不一樣,因此實施起來相當(dāng)困難。

測試驅(qū)動開發(fā)有好處也有壞處。因為每個測試用例都是根據(jù)需求來的,或者說把一個大需求分解成若干小需求編寫測試用例,所以測試用例寫出來后,開發(fā)者寫的執(zhí)行代碼,必須滿足測試用例。如果測試不通過,則修改執(zhí)行代碼,直到測試用例通過。

好處,通過測試的執(zhí)行代碼,肯定滿足需求,而且有助于接口編程,降低代碼耦合,也極大降低bug出現(xiàn)幾率(如果是極限編程,幾乎是不可能有bug)。壞處,1.投入開發(fā)資源(時間和精力);2.由于測試用例在未進(jìn)行代碼設(shè)計前寫;很有可能限制開發(fā)者對代碼整體設(shè)計;3.可能引起開發(fā)人員不滿情緒,我覺得這點很嚴(yán)重,畢竟不是人人都喜歡單元測試,盡管單元測試會帶給我們相當(dāng)多的好處。


總結(jié)

單元測試確實會帶給你相當(dāng)多的好處,但不是立刻體驗出來。正如買重疾保險,交了很多保費,沒病沒痛,十幾年甚至幾十年都用不上,最好就是一輩子用不上理賠,身體健康最重要。單元測試也一樣,寫了可以買個放心,對代碼的一種保障,有bug盡快測出來,沒bug就最好,總不能說“寫那么多單元測試,結(jié)果測不出bug,浪費時間”吧?

以下是個人對單元測試一些建議:

  • 越重要的代碼,越要寫單元測試;
  • 代碼做不到單元測試,多思考如何改進(jìn),而不是放棄;
  • 邊寫業(yè)務(wù)代碼,邊寫單元測試,而不是完成整個新功能后再寫;
  • 多思考如何改進(jìn)、簡化測試代碼。

作為一名經(jīng)驗豐富的程序員,寫單元測試更多的是對自己的代碼負(fù)責(zé)。有測試用例的代碼,別人更容易看懂,以后別人接手你的代碼時,也可能放心做改動。

多敲代碼實踐,多跟有單元測試經(jīng)驗的工程師交流,你會發(fā)現(xiàn)寫單元測試獲得的收益會更多。


關(guān)于作者

我是鍵盤男。
在廣州生活,在創(chuàng)業(yè)公司上班,猥瑣文藝碼農(nóng)。喜歡科學(xué)、歷史,玩玩投資,偶爾獨自旅行。希望成為獨當(dāng)一面的工程師。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評論 25 709
  • 文章來自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鵬閱讀 9,345評論 2 126
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動和任務(wù)的結(jié)構(gòu)性框架。軟件項目的開發(fā)包括:需求、設(shè)...
    Mr希靈閱讀 22,371評論 7 278
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動和任務(wù)的結(jié)構(gòu)性框架。軟件項目的開發(fā)包括:需求、設(shè)...
    宇文臭臭閱讀 6,852評論 5 101
  • 理財不僅僅是單純的賺錢,其實是對生活的有效管理。 學(xué)習(xí)中學(xué)到的觀點、思維是可以用到生活的方方面面的,從而做事更加的...
    hello貢閱讀 308評論 0 1

友情鏈接更多精彩內(nèi)容