鍍金池/ 教程/ Android/ Android UI 自動化測試
原文鏈接
Issue #185
Issue #181
Issue #161
Issue #192
Issue #174
Issue #190
RecyclerView FastScroll – Part 2
僅作為Android 調(diào)試模式工具的Stetho
Issue #150
Issue #167
Issue #180
Issue #151
Issue #188
Issue #159
Issue #189
Issue #160
Issue #168
Issue #146
Issue #173
Issue #198
Issue #179
延期的共享元素轉(zhuǎn)換(3b)
Yahnac:RxJava Firebase&內(nèi)容提供
Issue #162
游戲性能:規(guī)劃限定條件
分析清單:測量和尋找哪些方面
Issue #148
Issue #166
Issue #158
Issue #178
Issue #193
Issue #145
Issue #170
Issue #169
Issue #196
Issue #186
Issue #172
Issue #171
附加Android工件和Gradle的檔案
Issue #147
自定義顏色范圍
根據(jù) Material 設(shè)計導(dǎo)航制圖工具樣式
Issue #187
Issue #184
Issue #175
在Android Lollipop上使用JobScheduler API
Android性能案例追蹤研究
使用安卓Wear API創(chuàng)建watchface—第2部分
在谷歌市場上創(chuàng)造更好的用戶體驗
映射與包的神秘關(guān)系
Issue #165
用Robolectric進行參數(shù)化測試
Issue #155
Issue #149
MVC / MVP中的M -模型
歡迎為 Android 和 iOS 嵌入 API
Issue #164
Android UI 自動化測試
Issue #182
Issue #191
Issue #183
Issue #163
Issue #157
響應(yīng)式編程(Reactive Programming)介紹
Issue #197
原文鏈接
Issue #153
Issue #152
Issue #176
原文地址
Android Material 支持庫:Electric Boogaloo的提示與技巧
Issue #156
Issue #154
Android的模糊視圖
Issue #194
Issue #177
Issue #195
針對Jenkins的谷歌商店安卓出版插件

Android UI 自動化測試

概述

這篇文章回顧了 Android UI 測試的四個策略,目的是創(chuàng)建快速、可靠和容易調(diào)試的 UI 測試。

開始之前,請不要忘記導(dǎo)入的規(guī)則:可以單元測試的要單元測試。Robolectric 和 gradle unit tests support 就是 Android 單元測試框架的很好的例子。UI 測試,從另一方面來說,是用來驗證你的應(yīng)用程序能否返回與設(shè)備中一系列的用戶動作相呼應(yīng)的正確的 UI 輸出。Espresso 是一個很好的框架,用來在同一進程中運行 UI 操作和驗證。更多關(guān)于 Espresso 和 UI Automator 工具,請參閱:test support libraries。

Google+ 團隊實現(xiàn)許多 UI 測試的迭代。接下來我們討論在每一個 UI 測試的策略中的經(jīng)驗教訓(xùn)。請繼續(xù)關(guān)注帶有更多的細節(jié)和代碼示例的文章。

策略1:使用端對端的測試作為UI測試

讓我們從一些定義開始。UI測試確保你的應(yīng)用程序會返回與設(shè)備中一系列的用戶動作相呼應(yīng)的正確的 UI 輸出。端對端(E2E)測試提出了應(yīng)用程序的全系統(tǒng)服務(wù),包括所有后端服務(wù)器和客戶端應(yīng)用程序。E2E 測試將保證數(shù)據(jù)正確地發(fā)送到客戶端應(yīng)用程序,保證整個系統(tǒng)正確地運行。

通常,為了使應(yīng)用程序 UI 功能化,你需要來自后端服務(wù)器的數(shù)據(jù),所以 U I測試需要模擬數(shù)據(jù),但不一定必需從后端服務(wù)器模擬。在許多情況下,U I測試與 E2E 測試混淆,這是因為 E2E 測試非常類似于手動測試場景。然而,由于許多變量的存在,如網(wǎng)絡(luò)薄片,真實服務(wù)器的認證,系統(tǒng)的大小等等,使調(diào)試 E2E 測試及使 E2E 測試穩(wěn)定非常困難。

http://wiki.jikexueyuan.com/project/android-weekly/images/issue-145/image04.png" alt="Android UI" />

當(dāng)你將 UI 測試用作 E2E 測試時,你將面臨以下的問題:

  • 非常龐大以及緩慢的測試。
  • 由于超時和內(nèi)存問題導(dǎo)致的高片狀率。
  • 認證問題(如:自動化測試的認證是非常棘手的)

讓我們看看使用以下策略是怎樣修復(fù)這些問題的。

策略2:密封的UI測試使用假的服務(wù)器

在這個策略中,你避免了使用網(wǎng)絡(luò)電話和外部依賴,但是你需要提供你的應(yīng)用程序和驅(qū)動UI的數(shù)據(jù)。更新你的應(yīng)用程序使它與本地服務(wù)器而不是外地服務(wù)器來通信,并創(chuàng)建一個假的服務(wù)器,它能夠為你的應(yīng)用程序提供數(shù)據(jù)。接下來,你需要一種機制通來生成你的應(yīng)用程序所需的數(shù)據(jù)。這可以通過使用不同的方法來實現(xiàn),你使用的方法取決于你的系統(tǒng)設(shè)計。一種方法是記錄服務(wù)器響應(yīng),并在假的服務(wù)器中回放這些服務(wù)器響應(yīng)。

一旦你將密封的 UI 測試與本地假的服務(wù)器相連,那么你也應(yīng)該進行 server hermetic tests。這樣你把你的 E2E 測試劃分為一個服務(wù)器端測試,一個客戶端測試和一個集成測試,來驗證服務(wù)器和客戶是否同步(關(guān)于集成測試更多的細節(jié),請參閱 blog 的后端測試部分)。

現(xiàn)在,客戶端測試流看起來如下所示:

http://wiki.jikexueyuan.com/project/android-weekly/images/issue-145/image02.png" alt="Android UI" />

雖然這種方法大大減小了測試規(guī)模和片狀率,但是你仍然為你的測試保留一個單獨的假服務(wù)器。調(diào)試仍然不容易,因為有兩個移動的部分:測試和本地服務(wù)器。雖然通過這種方法,測試穩(wěn)定性會大大的提高,但是本地服務(wù)期會導(dǎo)致一些薄片。

讓我們看看這一問題如何改善…

策略3:應(yīng)用程序的依賴注入設(shè)計

為了刪除運行在 Android 中假服務(wù)器的額外的依賴,你需要在應(yīng)用程序中使用依賴注入,用真實的模塊實現(xiàn)來交換假的。例如 Dagger,或者如果需要的話,你可以創(chuàng)建你自己的依賴注入。

這將提高你的應(yīng)用程序的單元測試和 UI 測試的可測試性。為你提供有模擬依賴關(guān)系的能力的測試。在 instrumentation testing 中,測試程序和被測試的應(yīng)用程序被裝載在同一進程中,所以測試代碼運行時訪問應(yīng)用程序的代碼。不僅如此,你還可以使用類路徑覆蓋(事實是測試類路徑優(yōu)先于被測試的應(yīng)用程序)來覆蓋某一類或在那里注入虛偽。例如,為了使你的測試密封,你的應(yīng)用程序應(yīng)該支持網(wǎng)絡(luò)實現(xiàn)的注入。在測試過程中,測試在你的應(yīng)用程序中注入一個假的網(wǎng)絡(luò)實現(xiàn),這個假的實現(xiàn)將提供成熟的數(shù)據(jù),而不是與后端服務(wù)器進行通信。

http://wiki.jikexueyuan.com/project/android-weekly/images/issue-145/image03.png" alt="Android UI" />

策略4:在更小的庫中構(gòu)建應(yīng)用程序

如果你想將你的應(yīng)用程序擴展到許多模塊和視圖中,并計劃添加更多的功能,同時保持穩(wěn)定性和快速構(gòu)建/測試,那么你應(yīng)該在小組件/庫中構(gòu)建應(yīng)用程序。每個庫應(yīng)該有自己的UI資源和用戶依賴關(guān)系管理。這種策略不僅使為密封測試而構(gòu)建的庫的模擬依賴關(guān)系成為可能,并且能夠作為你應(yīng)用程序的各種組件的實驗平臺來服務(wù)。

一旦你有依賴注入支持的小組件,你就可以為每個組件構(gòu)建一個測試應(yīng)用程序。

測試應(yīng)用程序提供了庫的實際 UI,需要的假數(shù)據(jù),以及模擬依賴關(guān)系。Espresso 測試將針對這些測試應(yīng)用程序運行。這使得在隔離條件下測試更小的庫成為可能。

例如,我們可以考慮為登錄和應(yīng)用程序的設(shè)置構(gòu)建更小的庫。

http://wiki.jikexueyuan.com/project/android-weekly/images/issue-145/image00.png" alt="Android UI" />

現(xiàn)在,設(shè)置組件測試看起來如下所示:

http://wiki.jikexueyuan.com/project/android-weekly/images/issue-145/image01.png" alt="Android UI" />

總結(jié)

為 Android 中大量應(yīng)用程序進行 UI 測試是非常具有挑戰(zhàn)性的。關(guān)于 Google+ 團隊,這里有一些 UI 測試的經(jīng)驗教訓(xùn):

  1. 不要用 E2E 測試來代替UI測試。除了 UI 測試,還可以寫入單元測試和集成測試。
  2. 可以采用密封測試的方式。
  3. 在設(shè)計你的應(yīng)用程序時,使用依賴注入。
  4. 在小庫/模塊中構(gòu)建你的應(yīng)用程序,并單獨進行測試。然后你可以得到一些集成測試來驗證組件間的集成是否正確。
  5. 組件化的 UI 測試被證明比 E2E 快的多,并且比它穩(wěn)定 99%+。快速性和穩(wěn)定性測試證明大大提高開發(fā)人員的生產(chǎn)力。