淺談測試

什麼是測試

Android官方測試教程java

測試是開發過程當中,很重要的一部分。經過再三運行測試,你能夠提早肯定代碼邏輯是否正確。android

Android官方資料裏,將測試劃分紅三大部分:git

單元測試(Unit Tests):是針對最小代碼單元的測試。面向對象編程,最小的代碼單元就是方法。單元測試,也就是校驗一個類的某個方法,好比在MVP裏,校驗某個Model的某個方法。github

集成測試(Integration Tests):相對於單元測試,測試的範圍進行了擴大。驗證模塊內堆棧級別之間的交互,或相關模塊之間的交互。能夠簡單地理解爲,集成測試,是跨多個代碼單元,跨多個模塊。好比在MVP裏,校驗Presenter層與Model層的交互,又或者校驗View層與View層的交互,好比Fragment之間。編程

端對端測試(End-to-end Test):官方又視其爲UI測試(UI Tests)。相對於集成測試,測試的範圍進一步擴大。主要驗證與用戶的交互。好比用戶在登陸界面,輸入帳戶密碼,點擊跳轉按鈕後,是否正確跳轉到用戶主頁。若是是在MVP裏,這個操做,就同時涉及到了View層與Presenter層、Presenter層與Model層、View層與View層的相互交互。安全

測試目錄

Android Studio中的項目一般包含兩個放置測試的目錄:androidTest、test。app

androidTest:放含有android相關類,須要使用到虛擬機或真機幫助運行的測試代碼。此類測試包括集成測試,端到端測試以及僅JVM沒法驗證應用程序功能的其餘測試。框架

test:放純java,能在jvm上直接運行的測試代碼,例如單元測試。jvm

各種測試的比重

官方建議上述三類測試在項目中的比重:70%單元測試,20%集成測試,10%UI測試。post

爲何須要測試

1)更快的故障反饋

就拿單元測試來講:

假設你須要從水電廠拼接一批水管到住處時,但這批「菜雞出品,常有廢品」的水管,有待檢測。最蠢的方法是一根根拼接好,而後從水電廠注水,查看總體狀況,揪出有問題的水管,修復,最後再注水看看效果,周而復始。但這樣,每注一次水,要耗費的時間太長了。

但若是你有多輛能夠移動的小型水車,它們有注水的能力。你能夠用它們同時給多根水管,分別注水,而後就能快速獲得每根水管的質量情況。一有問題,立刻修復,而後再給有問題的水管單獨注水,看看其修復沒有。這樣一來,效率能夠說是大大提升。

真機,就像水電廠。單元測試,就像數量龐大的水車。而待測試的方法則是咱們的水管。若是沒有對應的單元測試,你可能霹靂啪啦,敲完了一通代碼,而後跑一遍真機,再而後,一個個界面跳轉,跳到你新寫的代碼那裏。哎喲,空指針?小意思,立馬改完。再跑跑看,再一頁頁跳轉。臥槽,堆棧溢出...

更可怕的是,咱們一般一次只能定位到一個錯誤。而後一遍又一遍嘗試跑真機查看修復效果,效率低得使人髮指。

單元測試,最大的特色,就是快,跑一遍測試,快則不到1秒,慢一般也不到10秒。跑幾十次單元測試,可能你的app還沒刷到真機上一次。用它來檢測你寫得沒那麼自信的方法,你就能夠很直觀、迅速地觀察到方法是否按你預想的執行。

2)更全面的檢驗

測試,還能夠模擬各類狀況,就至關於能提供不一樣的「水車」,給你的方法注入不一樣的「水」(方法參數),來檢測你的待測方法是否經得住各類狀況的考驗。

3)更安全的重構

測試,也能讓代碼設計更合理,提升代碼的可維護性。也方便你未來重構代碼。使用單元測試調試修改方法的過程,也算是一次「小重構」。

當你意識到,你要爲一個方法寫單元測試的時候,你會下意識地考慮,怎麼寫才能讓它更易於測試。而易於測試的代碼,一般更加合理,設計更好。由於你是站在維護者的角度,去設計你的代碼的。

4)更好的代碼「註釋」

測試代碼也是很是好的代碼註釋。後來者,也能夠根據之前留下來的測試代碼,更好地理解並調試修改你的代碼,而且經過運行之前留下來的測試,可以更好地避免新增的業務邏輯影響到舊代碼。我想在座各位,應該都嘗試過修改公司的祖傳代碼。沒有詳細代碼註釋,沒有業務流程說明,幾年的代碼迭代下來,各類看不懂的迷之字段和邏輯。問產品,產品可能也一問三不知,由於他可能也是剛來的。而後,你增長了新的業務邏輯,卻不知補了西牆,卻拆了東牆。而後代碼到了測試爸爸們手上,啪啪啪就給你提了一堆Bug。

綜上,搬運一下官方的說法,測試的好處以下:

1)故障快速反饋

2)開發週期中的早期故障檢查

3)更安全的代碼重構,讓你優化代碼而不用擔憂迴歸測試

4)穩定的開發速度,幫助你最小化技術債務

因此,兄dei,學學測試吧。就當可憐你那日益稀疏的頭髮~

必定須要測試嗎

好了。前面吹完,如今來打臉了。

其實我以爲吧。不少時候都用不上。特別是中小公司這種,代碼質量又差,若是中途引入測試,特別是單元測試,過程是很痛苦的。而測試這種東西,是隨着版本迭代,才愈來愈有用。短期內實際上是很難看到收益的。這時候,要是耽誤了發版,誰背鍋?

領導嗎?不闊能。

產品嗎?他負責寫代碼嗎?對不起,他負責找茬。上個版本的需求,下個版本又幹掉的人,你忘記是誰了嗎?

測試小知識

1.測試的代碼,在打包時,不會被編譯進apk裏。因此不須要擔憂會增大apk體積。

2.國外很是流行測試。若是你從github裏下拉RxJava、Retrofit、OkHttp這些著名開源框架的源碼,你會發現它們裏面都有大量的單元測試。而這些單元測試,能幫助你很好地理解做者的意圖,更好地閱讀、學習這些源碼。

因此,在我看來,學習這些框架,特別是RxJava。正確的姿式,不是過多地翻閱各類良莠不齊的博客,而是看源碼,看裏面的測試,甚至本身嘗試寫測試,瞭解RxJava的各類操做符的特性。

測試利器

JUnit、Mockito、PowerMock、Robolectric、Espresso等是如今比較流行的測試框架,爲android測試提供了便利。

其中,JUnit是Java測試裏最基本的框架。Mockito、PowerMock、Robolectric主要用於寫單元測試。Espresso主要用於寫集成測試、端對端測試。

它們的集成、使用以及配合使用,將會在下面的文章進行介紹:

淺談測試之JUnit

淺談測試之Mockito

淺談測試之PowerMock

淺談測試之Robolectric

淺談測試之Espresso

相關文章
相關標籤/搜索