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
Android 測試主要分爲3個類型:android
區分UI代碼和功能代碼在Android開發中尤爲困難。由於有時Activity既有Controller的功能,又有View的功能。Robolectric是一個很優秀的Android測試框架,它提供了一個Android框架的stub,這樣測試運行時其實是在JVM上運行,而不是在Android平臺(好比Robotium和Instrumentation都是在Android平臺運行測試),從而提升了速度。另外請參考Gradle 對 Unit tests的支持。git
這個測試方法使得測試不須要外部依賴和網絡請求。這樣作的主要目的是提升測試速度,減小測試時的外部影響,畢竟網絡調用是相對很慢的。Espresso能夠用來模擬用戶的UI操做。github
Monkey Test 就好像一隻猴子在測試app同樣,沒有任何規律的在你的app上胡按。計算機運行monkey test的時候,每秒鐘能作出幾千個UI動做(能夠配置這個頻率),好比點擊和拖拽。因此這個測試能夠算是一個壓力測試,用來檢測ANR。數據庫
Google+ 團隊總結了一些 UI 測試時的經驗和策略。後端
先看一些定義:UI 測試 是爲了確保對於用戶的UI動做,app能返回正確的UI輸出。End-to-end測試(E2E test) 是經過客戶端和後臺服務器的交互測試整個系統。下面這個圖在展現了測試步驟:服務器
一般作UI測試,你須要後臺服務器,因此可能產生網絡調用。因此UI測試和E2E測試很像。可是在E2E測試中會遇到不少困難:網絡
下面看看如何解決這些問題。app
這個策略中,你能夠經過假的後臺服務器來避免網絡請求,以及其餘外部依賴。技術上,你就須要在app本地提供返回數據了。有不少辦法能夠作到,好比手動作一次網絡請求,把response保存下來,在測試的時候重複這個response。這樣你就作了一個封閉在本地的僞服務器框架
當你有了這個僞服務器,你還須要給這個僞服務器寫測試。因而這是,你的E2E測試就分爲了服務器測試,客戶端測試和集成測試。
如今這樣的解決方案,你須要本身維護僞服務器,本地數據庫和tests了。
下面這是E2E 測試的示例圖:
這是使用了僞服務器的封閉UI測試
其區別在於:Frontend Server的幾個數據源變了。由原來的真實後端,變成了封閉服務器,或者是mock服務器。這個在測試調用網絡API的時候很是有用。
Dependency Injection(依賴注入)能夠幫助生成測試數據。我推薦選擇使用dagger做爲依賴注入框架。
依賴注入在UI test和unit test都中均可以用於生成假數據。在instrumentation test框架中,測試用的apk文件和測試時運行的app,是在同一個進程下面,因此測試代碼能夠調用app代碼。你還能夠覆蓋app的classpath,經過這種方式注入假數據。好比你能夠用依賴注入來僞造一個網絡鏈接的實現,調用這個網絡鏈接的時候就能夠提供假數據。
這個方法能夠更好地模塊化你的app。你的app被分爲更小的類庫以後,你能夠爲這些類庫添加他們本身的UI依賴或gradle庫依賴。
當你有了本身的庫,並提供依賴注入的支持,那麼你能夠爲各個庫寫測試app。最後,能夠寫集成測試來確保類庫直接的合做正確。
好比咱們有一個登錄功能的庫,那麼我能夠寫一個測試app只爲這個登錄功能庫: