1. 程式人生 > >Espresso:快速的Android UI自動化測試

Espresso:快速的Android UI自動化測試

在我和很多Android開發者聊天的時候,我注意到他們在開發的過程中並不注重測試這一環節,原因是他們認為Android測試太難實現,或者難以整合到現有的工程中等等。但是實際上寫一個 Espresso並不是一件很難的事情,而且它能夠非常方便地整合到你的工程之中。

容易實現

Espresso測試是非常容易實現的,它由三部分組成:

  • ViewMachers:尋找用來測試的View。
  • ViewActions:傳送互動事件。
  • ViewAssertions:檢驗測試結果。

舉個例子,接下來這部分程式碼向id為name_field的EditText輸入”Steve”,並點選id為greet_button的按鈕,最後檢查螢幕上是否有”Hello Steve!”字樣。

  1. @Test
  2. publicvoid testSayHello() {  
  3.   onView(withId(R.id.name_field)).perform(typeText("Steve"));  
  4.   onView(withId(R.id.greet_button)).perform(click());  
  5.   onView(withText("Hello Steve!")).check(matches(isDisplayed()));  
  6. }  

是不是很簡單?我們再來看看在多執行緒情況下如何進行測試。

整合測試

Espresso官方文件有這樣一段話:

Espresso測試有個很強大的地方是它在多個測試操作中是執行緒安全的。Espresso會等待當前程序的訊息佇列中的UI事件,並且在任何一個測試操作中會等待其中的AsyncTask結束才會執行下一個測試。這能夠解決程式中大部分的執行緒同步問題。

我一般使用 Retrofit來處理我的Http請求,而不是AsyncTask(雖然大多數人還是使用AsyncTask),在這種情況下也有別的辦法來實現執行緒安全的測試。Espresso中有個API叫做registerIdlingResource,它可以讓你使用自定義的執行緒安全邏輯。

通過IdlingResource,我們可以通過以下這段程式碼來實現執行緒同步的Retrofit介面:

  1. publicclass MockApiService implements ApiService, IdlingResource {  
  2.   privatefinal ApiService api;  
  3.   privatefinal AtomicInteger counter;  
  4.   privatefinal List<ResourceCallback> callbacks;  
  5.   public MockApiService(ApiService api) {  
  6.       this.api = api;  
  7.       this.callbacks = new ArrayList<>();  
  8.       this.counter = new AtomicInteger(0);  
  9.   }  
  10.   @Override
  11.   public Response doWork() {  
  12.       counter.incrementAndGet();  
  13.       return decrementAndNotify(api.doWork());  
  14.   }  
  15.   @Override
  16.   public String getName() {  
  17.       returnthis.getClass().getName();  
  18.   }  
  19.   @Override
  20.   publicboolean isIdleNow() {  
  21.       return counter.get() == 0;  
  22.   }  
  23.   @Override
  24.   publicvoid registerIdleTransitionCallback(ResourceCallback resourceCallback) {  
  25.       callbacks.add(resourceCallback);  
  26.   }  
  27.   private <T> T decrementAndNotify(T data) {  
  28.       counter.decrementAndGet();  
  29.       notifyIdle();  
  30.       return data;  
  31.   }  
  32.   privatevoid notifyIdle() {  
  33.       if (counter.get() == 0) {  
  34.           for (ResourceCallback cb : callbacks) {  
  35.               cb.onTransitionToIdle();  
  36.           }  
  37.       }  
  38.   }  
  39. }  

這個類告訴了Espresso你的應用將會在(doWork())方法呼叫後才能夠進入下一個步驟。但是你看完這段程式碼應該馬上意識到一件事情:這樣的寫法太過囉嗦了,你需要實現很多方法才能做到這執行緒同步一個小功能。一定有其他更好的辦法來實現(接下來就是了!)。

實際上技巧就隱藏在之前的官方文件中,“Expresso會等待UI事件……並等待AsyncTask的結束才會執行下一個測試”。 實際上我們只要在AsyncTask的ThreadPoolExecutor中執行Retrofit請求就可以了!

幸運的是Retrofit的BaseAdapter.Builder類提供了這樣一種方法:

  1. new RestAdapter.Builder()  
  2.    .setExecutors(AsyncTask.THREAD_POOL_EXECUTOR, new MainThreadExecutor())  
  3.    .build();  

如此簡單,你還有理由不寫Espresso測試嗎?

相關推薦

Espresso快速Android UI自動化測試

在我和很多Android開發者聊天的時候,我注意到他們在開發的過程中並不注重測試這一環節,原因是他們認為Android測試太難實現,或者難以整合到現有的工程中等等。但是實際上寫一個 Espresso並不是一件很難的事情,而且它能夠非常方便地整合到你的工程之中。 容易實現

Android UI 自動化測試之UiObject

UiObject 類介紹 代表一個元件物件,物件有許多模擬實際操作手機的方法與屬性 點選與長按物件 (1)元件區域位置關係 (2)點選長按相關 api public void testClick() throws UiObjectN

Android UI自動化測試最佳實踐

轉載地址:http://qa.baidu.com/blog/?p=985 一. 概述 Android系統測試和Web的測試類似,有兩類自動化的方式:錄製回放與基於頁面元素操作的手工開發。由於錄製回放在長期維護與程式碼重用方面存在問題,這裡主要的方式還是後者,這也是Web

轉載狠狠地聊一下UI自動化測試

target 設計 action com 用例設計 ati web測試 ui自動化 web 狠狠地聊一下UI自動化測試 用例設計 功能測試 性能測試 單元測試 WEB測試 其他相關 轉載:狠狠地聊一下UI自動化測試

解放雙手,Android開發應該嘗試的UI自動化測試

困境 你在南方的豔陽裡,手指紛飛;我在北方的寒夜裡,喝杯咖啡。 接下來我將說到這種情況並非個例——作為一個Android開發者,當我實現了一個介面的一些功能,或者對介面上某些功能進行了修改,我該如何去查收我想要的結果呢? 最簡單的方式就

android常用自動化測試框架

window 自動 瀏覽器 資料 對比 移動 ppi des 選擇 目錄: Monkey MonkeyRunner Instrumentation UiAutomator Espresso Selendroid Robotium Athrun Appi

python專項測試——Android App自動化測試框架

selenium sdk str ase val 測試環境 self ron app自動化 1 為什麽需要框架? 代碼混亂,難閱讀; 重復編碼,效率低;需求變化,難維護; 一 自動化實例 1 準備測試的app;準備測試環境;實現腳本; 2 測試app:只有登錄功能

Robot Framework使用Phantomjs進行無界面UI自動化測試

com 程序 linux版本 -c 框架 data 我們 img 必須 Robot Framework 是一款關鍵字驅動的驗收自動化測試框架,現在在國內使用的越來越廣泛了。一種通用的Web UI自動化測試解決方案是Robot Framework+Selenium2Lib

ui自動化測試的意義與理解

方法 慢慢 lin 線上 效果 fff 效率 場景 答案 分層測試的思想 分層測試(有的也叫測試金字塔)是最近幾年慢慢流行、火熱起來的,也逐漸得到了大家的認可,大家應該已經比較熟悉分層測試的思想了,不太了解的可以自行找一些相應的渠道去補充一下上下文的知識。 總的來說測試需要

UI 自動化測試1-環境配置

在哪裏 表示 配置環境 我們 環境變量 sta 正常 通過 mage 一.安裝Eclipse:1. 安裝Eclipse2. 打開Eclipse(這個時候你會發現無法打開會提示….) 原來是我們沒有裝JDK和JRE (肯定有人又疑惑了,jdk和jre是什麽有

UI自動化測試4-公共類和調用

沒有 element 問題 drive bdr 導致 mage man del 1. 作業解答 上節課給大家的作業是find element by.cssSelector. 我簡單舉一個例子 WebElement email = driver.findElement(By

Windows 下搭建 Appium + Android+python 自動化測試環境

細節 事情 android view package 效果 框架 比較 framework 前言 本來並不打算寫這麽一篇文章,但是實踐下來發現網上的各種教程裏大致有兩個問題。一是文章有些跟不上時代,目前android開發和測試的技術更新都比較快,內容有些過期。二是細節部分不

UI自動化測試簡介及Selenium工具的介紹和環境搭建

版本 ebe 需求分析 核心 nis rep color 基於 多語 自動化測試簡介 1.1何為自動化測試?   是把以人為驅動的測試轉化為機器執行的一種過程,它是一種以程序測試程序的過程。換言之,就是以程序實現的方式來代替手工測試。 1.2自動化測試分類   分為功能自動

UI自動化測試(二)瀏覽器操作及對元素的定位方法(xpath定位和css定位詳解)

cli 刷新 ota api enter 版本 ror apache 窗口 Selenium下的Webdriver工具支持FireFox(geckodriver)、 IE(InternetExplorerDriver)、Chrome(ChromeDriver)、 Opera

UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作

rop 並保存 cto 右鍵 自動化測試 nqa files 安裝 存在 AutoIT簡介 AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/

Robot Framework進行web ui自動化測試,瀏覽器配置說明

org .html open fire img row sele title cnblogs 轉載請註明出處,謝謝; chrome瀏覽器: 1、從如下地址下載與本地瀏覽器版本號一致的chromedriver.exe驅動文件; http://chromedriver.stor

UI自動化測試之selenium(1)——selenium中的常用api

selenium api 目錄 1 對瀏覽器操作1.1 用webdriver打開一個瀏覽器1.2 最大化瀏覽器&關閉瀏覽器1.3 設置瀏覽器窗口大小1.4 打開測試頁面1.5 處理瀏覽器彈出的新窗口2 頁面元素定位3 如何對頁面元素進行操作3.1 WebElement相關方法3.2 iFram

Appium做Android功能自動化測試

做了 指標 並不會 return 啟動 target socket cor enter 前言 做Android端功能自動化已有2年多的時間了,使用過的功能自動化框架有Robotium、Uiautomator、Appium。最近研究自動化case復用的方案,調研了Appium

基於python+appium+yaml安卓UI自動化測試分享

是否 作者 exceptio sts http def pen ogr 技術 結構介紹 之前分享過一篇安卓UI測試,但是沒有實現數據與代碼分離,後期維護成本較高,所以最近抽空優化了一下。不想看文章得可以直接去Github,歡迎拍磚大致結構如下: 結構.png

UI自動化測試POM設計之-maven工程

絕對路徑 pro 解決 unit 是否 分享 根據 osi ren 為了更好的管理UI自動化測試項目,介紹一下Maven項目創建以及應用 一. 配置Maven環境 1. 下載並安裝Maven 下載地址:http://maven.apache.org/downlo