萬物有源_Android自動化測試框架UIAutomator原理淺析

簡介

UIAutomator是一個Android自動化測試框架,是谷歌在Android4.1版本發佈時推出的一款用Java編寫的UI測試框架,它只能用於UI即黑盒方面的測試。因此UIAutomator只能運行在Android4.1以後的版本,其最大的特色是能夠跨進程操做。咱們可使用UIAutomator框架提供的一些方便的API來對Android應用進行一系列的自動化測試操做,如點擊、滑動、鍵盤輸入、長按以及經常使用的斷言方法。能夠代替繁複的手工測試。瀏覽器

優勢:框架

  1. Google自家推出,其穩定性和後續的維護更新能夠獲得保障,運行也有更多的權限。
  2. 能夠跨進程操做,這點比起其餘基於instrumention框架的自動化工具如Robotium是沒法直接作到的。
  3. 運行速度快。

缺點:socket

  1. 不支持Android4.1如下的版本。
  2. 不支持Webview,因此通常沒法對瀏覽器應用進行測試。

原理

首先,Google的UIAutomator參考微軟的UIAutomation提供的一套用在Android上的自動化測試框架。 基於Android AccessilibilityService。 在這裏簡單介紹一下: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指視窗中的組件樹節點。測試

相關文章
相關標籤/搜索