官方文檔鏈接:https://developer.android.google.cn/training/testing/fundamentals.html
1.前言
在之前的文章中大概地描述了進行安卓測試的準(zhǔn)備事項块促,讓大家有個總體的感受歉胶。由于當(dāng)時急著在項目中粗淺地體驗一下铸董,所以了解點皮毛后就沒有繼續(xù)深入了靠抑。直到前不久看了Google I/O大會的資料,才發(fā)現(xiàn)測試驅(qū)動開發(fā)(TDD)是一件很必要的事情微峰,決定好好研究一下伙狐。那從何開始呢?除了大會視頻外痹籍,官方網(wǎng)站的文檔是我最喜歡的學(xué)習(xí)途徑呢铆。
2.測試的重要性
測試應(yīng)用程序是開發(fā)過程的一個組成部分。通過持續(xù)地對應(yīng)用程序進行測試蹲缠,可以在公開發(fā)布之前棺克,驗證它的正確性、功能性和可用性线定。除此之外娜谊,還有以下優(yōu)點:
- 快速反饋問題。
- 在開發(fā)周期的早期發(fā)現(xiàn)問題斤讥。
- 更安全地重構(gòu)代碼纱皆,不用擔(dān)心優(yōu)化代碼時重新引入問題。
- 穩(wěn)定開發(fā)速度芭商,有助于減少技術(shù)債派草。
用戶在按下提交按鈕到向自己設(shè)備下載數(shù)據(jù)的過程中,與應(yīng)用程序的各個層級交互铛楣。因此澳眷,在迭代開發(fā)應(yīng)用程序時,應(yīng)該測試各種用例和交互蛉艾。
3.使用迭代開發(fā)工作流
隨著應(yīng)用程序擴展钳踊,可能會發(fā)現(xiàn)需要從服務(wù)端獲取數(shù)據(jù)、與設(shè)備傳感器交互勿侯、訪問本地存儲或渲染復(fù)雜的用戶界面拓瞪,一個全面的測試策略必不可少。
迭代開發(fā)功能助琐,從寫一個新的測試或給已存在的單元測試添加用例和斷言開始祭埂。由于還沒有實現(xiàn)功能,第一次測試會失敗。在設(shè)計新功能時蛆橡,考慮劃分出的單元的職責(zé)很重要舌界。每個單元,都需編寫相應(yīng)的單元測試泰演,考慮與它所有可能的交互呻拌,包括正常交互、無效輸入和資源無效的情況睦焕。
上圖所示的完整工作流包含嵌套的迭代周期藐握,一個長而慢的UI測試周期集成代碼單元的測試,使用更短垃喊、更快的周期測試這些單元猾普,整個周期持續(xù)到應(yīng)用程序滿足每個用例。
4.了解測試層級
下圖的測試層級本谜,展示了應(yīng)用程序應(yīng)該包括三類測試:小型初家、中型和大型:
- 小型測試指單元測試,可以獨立于生產(chǎn)環(huán)境運行乌助。通常模仿每個主要組件溜在,且在開發(fā)機器上快速運行。
- 中型測試指集成測試眷茁,處于小型和大型測試之間。集成幾個組件纵诞,并在模擬器或真實設(shè)備上運行上祈。
- 大型測試指集成和UI測試,運行完整的UI工作流浙芙。確保關(guān)鍵的用戶交互任務(wù)登刺,按照預(yù)期在模擬器或真實設(shè)備上運行。
雖然小型測試快速和直接嗡呼,允許迅速發(fā)現(xiàn)問題纸俭,但由于低保真和獨立性,讓人很難相信通過測試的應(yīng)用程序能正常工作南窗,而編寫大型測試正好能彌補揍很。因為每個測試類型有不同的特點,應(yīng)該包含所有層級的測試万伤。盡管每個類型的測試所占比例會根據(jù)應(yīng)用程序的使用情況而不同窒悔,通常推薦以下分配方式:小型占70%,中型占20%敌买,大型占10%简珠。
5.編寫小型測試
當(dāng)添加和改變應(yīng)用程序的功能時,確保它們能通過針對地創(chuàng)建和運行的單元測試虹钮。雖然可以在設(shè)備或模擬器上評估單元聋庵,但在開發(fā)環(huán)境測試單元通常更加快捷和簡單膘融,當(dāng)需要與安卓系統(tǒng)交互時添加樁或模擬方法。
5.1.Robolectric
如果應(yīng)用程序的測試環(huán)境要求在單元測試中與安卓框架進行更多的交互祭玉,可以使用Robolectric氧映。這個工具使用對測試友好、基于Java的邏輯樁(由社區(qū)維護)來模擬安卓框架攘宙。它測試的保真度接近于在安卓設(shè)備上運行測試屯耸,同時仍比設(shè)備測試執(zhí)行更快,還支持安卓平臺以下幾個方面:
- Android 4.1(API 16)及以上版本
- Android Gradle插件2.4及以上版本
- 組件的生命周期
- 事件循環(huán)
- 所有資源
Robolectric擁有自己的一套測試API蹭劈,并引入一些新的概念疗绣。 有關(guān)將Robolectric的API與應(yīng)用程序的測試集成的更多信息,請參閱該工具的用戶指南铺韧。
5.2.模擬對象
可以通過針對修改后的android.jar運行單元測試多矮,來管理與應(yīng)用程序交互的安卓框架的元素。這個JAR文件不包含任何代碼哈打,所以應(yīng)用程序調(diào)用安卓框架默認(rèn)會拋出異常塔逃。為了測試與安卓系統(tǒng)交互的代碼元素,使用像Mockito這樣的框架來配置模擬對象料仗。如果代碼中包含對資源的引用或與安卓框架復(fù)雜的交互湾盗,應(yīng)該使用不同形式的單元測試,例如Robolectric立轧。
5.3.設(shè)備的單元測試
也可以在物理機或模擬器上運行設(shè)備的單元測試格粪,不需要任何模擬或站樁的框架。因為這種形式的測試執(zhí)行時間明顯慢于本地單元測試氛改,所以僅當(dāng)必須在真實設(shè)備硬件上評估應(yīng)用程序行為時帐萎,才使用這種方法。
6.編寫中型測試
在開發(fā)環(huán)境下測試完應(yīng)用程序的每個單元后胜卤,應(yīng)該在模擬器或設(shè)備上驗證組件行為的正確性疆导,中型測試可以完成這部分的開發(fā)過程。當(dāng)一些應(yīng)用程序組件依賴于物理硬件時葛躏,這樣測試的創(chuàng)建和運行很重要澈段。
中型測試評估應(yīng)用程序如何協(xié)調(diào)多個單元,并不測試整個應(yīng)用程序舰攒,例如服務(wù)測試均蜜、集成測試和模擬外部行為的單獨UI測試。通常情況下芒率,最好在模擬器或類似Firebase測試平臺等基于云的服務(wù)上測試應(yīng)用程序囤耳,而不是在物理設(shè)備上,這樣可以方便快速地測試多種屏幕尺寸和硬件配置。
7.編寫大型測試
盡管單獨測試應(yīng)用程序每個層級和功能很重要充择,但測試完整工作流程和使用涉及UI德玫、業(yè)務(wù)邏輯和數(shù)據(jù)層的測試用例同樣重要。如果應(yīng)用程序足夠小椎麦,可能只需要一套大型測試來評估整體功能宰僧。否則,應(yīng)該通過團隊組成观挎、垂直功能或用戶目標(biāo)劃分大型測試琴儿。
除了編寫大型、基于工作流的測試嘁捷,也應(yīng)該編寫檢查工作流中每個UI組件功能的中型測試造成。這樣,即使相應(yīng)的大型測試在開始的幾個步驟中一直失敗雄嚣,仍然可以通過用戶的每個關(guān)鍵操作識別潛在問題晒屎。
8.AndroidJUnitRunner
AndroidJUnitRunner類定義一個基于設(shè)備的JUnit測試運行器,可以在安卓設(shè)備上運行JUnit 3或JUnit 4樣式的測試類缓升。測試運行器有助于加載測試包和被測試的應(yīng)用程序到設(shè)備或模擬器上鼓鲁,運行測試和報告結(jié)果。此類還支持安卓測試支持庫(ATSL)中的以下工具和框架:
8.1.JUnit4 規(guī)則
ATSL包含測試中涉及管理應(yīng)用程序關(guān)鍵組件生命周期的代碼港谊,如Activity和Service骇吭。要了解如何定義這些規(guī)則,請參閱JUnit4規(guī)則指南歧寺。
8.2.Espresso
Espresso同步異步任務(wù)燥狰,同時自動執(zhí)行以下應(yīng)用程序內(nèi)交互:
- 在View對象上執(zhí)行操作。
- 在Android 8.0(API 26)及以上版本支持跨應(yīng)用程序進程完成工作流程成福。
- 評估有直接需求的用戶能夠如何使用應(yīng)用程序碾局。
- 定位荆残、激活RecyclerView和AdapterView對象中的items奴艾。
- 驗證傳出意圖的狀態(tài)。
- 驗證WebView對象中DOM的結(jié)構(gòu)内斯。
- 跟蹤應(yīng)用程序中長時間運行的后臺操作蕴潦。
要詳細(xì)了解這些交互及在應(yīng)用程序測試中如何使用它們,請參閱Espresso指南俘闯。
8.3.UI Automator
注意:建議僅當(dāng)應(yīng)用程序必須與系統(tǒng)交互以完成關(guān)鍵的用例時潭苞,使用UI Automator測試。因為它與系統(tǒng)軟件和UI交互真朗,每次系統(tǒng)更新后(包括安卓平臺版本升級和Google Play服務(wù)新版本)此疹,需要重新運行和修復(fù)UI Automator測試。
作為使用UI Automator替代方案,建議增加獨立測試或?qū)⒋笮蜏y試拆分為一系列小型和中型測試蝗碎。尤其是湖笨,每次只關(guān)注應(yīng)用程序內(nèi)一段通信的測試,例如向其它應(yīng)用程序發(fā)送信息和響應(yīng)意圖結(jié)果蹦骑。Espresso-Intents工具有助于編寫這些較小的測試慈省。
UI Automator框架在應(yīng)用程序的支持下,與系統(tǒng)軟件執(zhí)行交互眠菇,例如檢查當(dāng)前顯示UI的層次結(jié)構(gòu)边败、截屏和分析設(shè)備的當(dāng)前狀態(tài)。更多細(xì)節(jié)關(guān)于UI Automator如何才能觀察被測試的應(yīng)用程序捎废,請參閱UI Automator指南笑窜。
8.4.安卓測試控制器
安卓測試控制器讓每個UI測試分別在它們自己的Instrumentation沙盒中運行,通過減少測試和每次獨立測試導(dǎo)致應(yīng)用程序崩潰之間共享的狀態(tài)缕坎,增加測試的可靠性怖侦。更多信息關(guān)于它提供的測試應(yīng)用程序的好處,請參閱安卓測試控制器指南谜叹。
9.總結(jié)
若大家沒用過測試支持庫匾寝,建議認(rèn)真看看官方文檔(上面有提供鏈接,不用擔(dān)心語言問題荷腊,已經(jīng)支持中文了)艳悔,根據(jù)提示安裝相應(yīng)的包,并在項目中配置好Gradle依賴女仰。后面的幾篇文章猜年,將細(xì)細(xì)分析每種測試的使用方式。