1. 程式人生 > >Android UiAutomator測試框架

Android UiAutomator測試框架

1. UiAutomator測試框架研究與實踐

1.1 UiAutomator 簡介:

它是一個Android自動化測試框架,是谷歌在Android4.1版本釋出時推出的一款用Java編寫的UI測試框架。它只能用於UI也就是黑盒方面的測試。所以UiAutomator只能執行在4.1以後的版本中。其最大的特點就是可以跨程序操作,我們可以使用uiautomator框架提供的一些方便的API來對安卓應用進行一系列的自動化測試操作,如點選、滑動、鍵盤輸入、長按以及常用的斷言方法等。可以替代以前繁瑣的手工測試。
下面總結一下該框架的幾個優點:

  1. Google自家推出的,其穩定性和後續的維護更新可以得到保障,執行時也有更多的許可權。
  2. 可以跨程序操作,這點比起其它基於instrumentation框架的自動化工具如Robotium是無法直接做到的。
  3. 執行速度快。

缺點:

  1. 不支援Android4.1以下的版本。
  2. 不支援Webview,所以一般無法對瀏覽器應用進行測試。

1.2 UiAutomator 框架原理分析:

首先,UiAutomator是Google參考微軟的UiAutomation提供的一套用在Android上的自動化測試框架。基於Android AccessilibilityService提供。那麼至於什麼是AccessilibilityService,在這裡簡單介紹下:Android AccessilibilityService,是一個可訪問服務,它是一個為增強使用者介面並幫助殘疾使用者的應用程式,或者使用者可能無法完全與裝置的互動。舉個簡單的例子,假如一個使用者在開車。那麼使用者就有可能需要新增額外的或者替代的使用者反饋方式。其應用方式一般有兩種:

  • 第一種方法是:UiAutomatorView + monkey。它與hierachyview + monkey差不多。其區別是:UiAutomatorView通過ADB向裝置側傳送一個dump命令,而不是建立一個socket,下載一個包含當前介面控制元件佈局資訊的xml檔案。相比較hierachyview下載的內容而言,該檔案小很多。因此,從效率上講,這種方法比第一種應用模式快很多。

  • 第二種方法是: 直接呼叫UiAutomator框架對外提供的API,主要有UiDevice、UiSelector、UiObject和 UiScrollable等。其原理與第一種方式即HierachyView + Monkey差不多。其過程大致是:首先,UiAutomator測試框架通過Accessibilityservice,獲取當前視窗的控制元件層次關係及屬性資訊,並查詢到目標控制元件。若是點選事件,則計算出該控制元件的中心點座標。其次,UiAutomator通過 InputManager.getInstance().injectInputEvent隱藏介面來注入使用者事件(點選、輸入類操作),從而實現跨程序自動化的目的。

UiAutomator對外還提供了UiAutomatorTestCase、UiDevice、UiSelector、UiObject、UiCollection、UiScrollable等重要的類,其各自的作用如下:

UiAutomatorTestCase :這個類是繼承自Junit TestCase (Junit),對外提供setup、teardown等,以便初始化用例、清除環境等。所以我們在編寫的UiAutomator 的指令碼時一般都要繼承這個類,這樣就可以直接使用它的一些方法和Junit單元測試框架中的Assert斷言機制。

UiObject :UiObject可以代表頁面的任意元素,但它的各種屬性定位通常是通過UiSelector這個類來輔助完成的。

UiDevice :在測試時可以通過getUiDevice() 來例項化UiDevice物件去對裝置進行各種控制,如喚醒螢幕,鎖屏,點選Home, Back,Menu鍵等等。

UiSelector : 主要是通過一定查詢方式,可以通過UiSelector物件去定位UI元素。如果發現多個滿足條件的控制元件則會返回第一個控制元件,在使用UiSelector的時候可以組合使用多個屬性來定位具體的控制元件,還可以使用childSelector()函式來巢狀UiSelector物件。

UiCollection: UiCollection一般與UiSelector連用,如它的建構函式也要求提供UiSelector: UiCollection(UiSelector selector)。它的API較少,主要用以從Uiselector篩選出的元素集中挑出所要的元素:getChildByDescription(), getChildByInstance(), getChildByText() ,以及統計元素集的個數getChildCount()。

UiScrollable:UiScrollable 用來表示可以滑動的介面元素,其繼承關係為UiObject -> UiCollection ->UiScrollable。但UiAutomator的實現方式與HierachyView+Monkey有很大不一樣。以控制元件點選操作為例,其實現流程大致如下:

  • 定義一個點選物件Object,該物件則通過UiSelector物件定位到具體的控制元件。而UiSelector則通過UiAutomatorBridge(它可看做是UiSelector與AccesibilityService之間的聯結器),將查詢內容(AccessibilityNodeInfo)和輸入事件(AccessibilityEvent)傳給AccessibilityService。實際業務過程比這複雜的多。這樣,就實現了對某個控制元件的查詢或點選操作。備註:AccessibilityEvent,所有可操縱的UI元素都定義為一個AccessibilityEeventt;AccessibilityNodeInfo指視窗中的元件樹節點。