標籤:
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%95
Google+ 團隊的 Android UI 測試
- 原文連結:How the Google+ Team Tests Mobile Apps
- 譯者:allenlsy
- 譯者博文地址:http://allenlsy.com/android-ui-tests-in-google-plus-team/
- 校對者:
Android 測試主要分為3個類型:
單元測試(Unit Test)
區分UI代碼和功能代碼在Android開發中尤其困難。因為有時Activity既有Controller的功能,又有View的功能。Robolectric是一個很優秀的Android測試架構,它提供了一個Android架構的stub,這樣測試回合時實際上是在JVM上運行,而不是在Android平台(比如Robotium和Instrumentation都是在Android平台運行測試),從而提高了速度。另外請參考Gradle 對 Unit tests的支援。
封閉UI測試 (Hermetic UI Test)
這個測試方法使得測試不需要外部依賴和網路請求。這樣做的主要目的是提高測試速度,減少測試時的外部影響,畢竟網路調用是相對很慢的。Espresso可以用來類比使用者的UI操作。
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測試中會遇到很多困難:
下面看看如何解決這些問題。
策略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只為這個登陸功能庫:
總結:
- 不要用E2E測試來代替UI測試。更好的做法是用單元測試 + 整合測試 + UI測試。
- 使用封閉測試策略
- 使用依賴注入
- 把app分為不同的小工具小類庫,並分別寫測試,然後再寫整合測試來確保各組件之間的互動正確。
- 模組化 UI 測試已經被證明了比E2E測試快,並且十分穩定。這樣的測試又能極大的提高開發效率。
Google+ 團隊的 Android UI 測試