1. UiAutomator測試框架研究與實踐
1.1 UiAutomator 簡介:
最近在工作中偶爾接觸到了UiAutomator這個自動化測試框架,所以就順便學習了一下並寫了一些case在工作投入了使用。這里就將UiAutomator做一個簡單的記錄:
它是一個Android自動化測試框架,是谷歌在Android4.1版本發布時推出的一款用Java編寫的UI測試框架。它只能用於UI也就是黑盒方面的測試。所以UiAutomator只能運行在4.1以后的版本中。其最大的特點就是可以跨進程操作,我們可以使用uiautomator框架提供的一些方便的API來對安卓應用進行一系列的自動化測試操作,如點擊、滑動、鍵盤輸入、長按以及常用的斷言方法等。可以替代以前繁瑣的手工測試。
下面總結一下該框架的幾個優點:
- Google自家推出的,其穩定性和后續的維護更新可以得到保障,運行時也有更多的權限。
- 可以跨進程操作,這點比起其它基於instrumentation框架的自動化工具如Robotium是無法直接做到的。
- 運行速度快。
缺點:
- 不支持Android4.1以下的版本。
- 不支持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指視窗中的組件樹節點。
未完待續。。。有空會再繼續更新部分內容並添加圖片進來。