Google+ 團隊的 Android UI 測試

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9%98%9F%E7%9A%84%20Android%20UI%20%E6%B5%8B%E8%AF%95html

 

 

Google+ 團隊的 Android UI 測試

Android 測試主要分爲3個類型:android

單元測試(Unit Test)

區分UI代碼和功能代碼在Android開發中尤爲困難。由於有時Activity既有Controller的功能,又有View的功能。Robolectric是一個很優秀的Android測試框架,它提供了一個Android框架的stub,這樣測試運行時其實是在JVM上運行,而不是在Android平臺(好比Robotium和Instrumentation都是在Android平臺運行測試),從而提升了速度。另外請參考Gradle 對 Unit tests的支持git

封閉UI測試 (Hermetic UI Test)

這個測試方法使得測試不須要外部依賴和網絡請求。這樣作的主要目的是提升測試速度,減小測試時的外部影響,畢竟網絡調用是相對很慢的。Espresso能夠用來模擬用戶的UI操做。github

Monkey Test

Monkey Test 就好像一隻猴子在測試app同樣,沒有任何規律的在你的app上胡按。計算機運行monkey test的時候,每秒鐘能作出幾千個UI動做(能夠配置這個頻率),好比點擊和拖拽。因此這個測試能夠算是一個壓力測試,用來檢測ANR數據庫


Google+ 團隊總結了一些 UI 測試時的經驗和策略。後端

策略1: 不要使用 End-to-end 測試做爲UI測試

先看一些定義:UI 測試 是爲了確保對於用戶的UI動做,app能返回正確的UI輸出。End-to-end測試(E2E test) 是經過客戶端和後臺服務器的交互測試整個系統。下面這個圖在展現了測試步驟:服務器

一般作UI測試,你須要後臺服務器,因此可能產生網絡調用。因此UI測試和E2E測試很像。可是在E2E測試中會遇到不少困難:網絡

  • 測試速度緩慢
  • 網絡請求會失敗
  • 難以Debug

下面看看如何解決這些問題。app

策略2:使用僞服務器作封閉UI測試

這個策略中,你能夠經過假的後臺服務器來避免網絡請求,以及其餘外部依賴。技術上,你就須要在app本地提供返回數據了。有不少辦法能夠作到,好比手動作一次網絡請求,把response保存下來,在測試的時候重複這個response。這樣你就作了一個封閉在本地的僞服務器框架

當你有了這個僞服務器,你還須要給這個僞服務器寫測試。因而這是,你的E2E測試就分爲了服務器測試,客戶端測試和集成測試。

如今這樣的解決方案,你須要本身維護僞服務器,本地數據庫和tests了。

下面這是E2E 測試的示例圖:

這是使用了僞服務器的封閉UI測試

其區別在於:Frontend Server的幾個數據源變了。由原來的真實後端,變成了封閉服務器,或者是mock服務器。這個在測試調用網絡API的時候很是有用。

策略3:使用Dependency Injection

Dependency Injection(依賴注入)能夠幫助生成測試數據。我推薦選擇使用dagger做爲依賴注入框架。

依賴注入在UI test和unit test都中均可以用於生成假數據。在instrumentation test框架中,測試用的apk文件和測試時運行的app,是在同一個進程下面,因此測試代碼能夠調用app代碼。你還能夠覆蓋app的classpath,經過這種方式注入假數據。好比你能夠用依賴注入來僞造一個網絡鏈接的實現,調用這個網絡鏈接的時候就能夠提供假數據。

策略4:把app分爲小的libraries

這個方法能夠更好地模塊化你的app。你的app被分爲更小的類庫以後,你能夠爲這些類庫添加他們本身的UI依賴或gradle庫依賴。

當你有了本身的庫,並提供依賴注入的支持,那麼你能夠爲各個庫寫測試app。最後,能夠寫集成測試來確保類庫直接的合做正確。

好比咱們有一個登錄功能的庫,那麼我能夠寫一個測試app只爲這個登錄功能庫:

總結:

  1. 不要用E2E測試來代替UI測試。更好的作法是用單元測試 + 集成測試 + UI測試。
  2. 使用封閉測試策略
  3. 使用依賴注入
  4. 把app分爲不一樣的小組件小類庫,並分別寫測試,而後再寫集成測試來確保各組件之間的交互正確。
  5. 模塊化 UI 測試已經被證實了比E2E測試快,而且十分穩定。這樣的測試又能極大的提升開發效率。
相關文章
相關標籤/搜索