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秒,慢一般也不到10秒。跑幾十次單元測試,可能你的app還沒刷到真機上一次。用它來檢測你寫得沒那麼自信的方法,你就能夠很直觀、迅速地觀察到方法是否按你預想的執行。
測試,還能夠模擬各類狀況,就至關於能提供不一樣的「水車」,給你的方法注入不一樣的「水」(方法參數),來檢測你的待測方法是否經得住各類狀況的考驗。
測試,也能讓代碼設計更合理,提升代碼的可維護性。也方便你未來重構代碼。使用單元測試調試修改方法的過程,也算是一次「小重構」。
當你意識到,你要爲一個方法寫單元測試的時候,你會下意識地考慮,怎麼寫才能讓它更易於測試。而易於測試的代碼,一般更加合理,設計更好。由於你是站在維護者的角度,去設計你的代碼的。
測試代碼也是很是好的代碼註釋。後來者,也能夠根據之前留下來的測試代碼,更好地理解並調試修改你的代碼,而且經過運行之前留下來的測試,可以更好地避免新增的業務邏輯影響到舊代碼。我想在座各位,應該都嘗試過修改公司的祖傳代碼。沒有詳細代碼註釋,沒有業務流程說明,幾年的代碼迭代下來,各類看不懂的迷之字段和邏輯。問產品,產品可能也一問三不知,由於他可能也是剛來的。而後,你增長了新的業務邏輯,卻不知補了西牆,卻拆了東牆。而後代碼到了測試爸爸們手上,啪啪啪就給你提了一堆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主要用於寫集成測試、端對端測試。
它們的集成、使用以及配合使用,將會在下面的文章進行介紹: