Android自動化測試-從入門到入門(7)UI Automator

到目前爲止,咱們已經完成了對Espresso的介紹。從以前的文章咱們能夠看到,Espresso對Android APP的自動化測試提供了一系列很是強大的工具和方法。android

如今試想這樣一個場景:咱們在APP中有一個更改頭像的功能,此時咱們須要調用系統相機進行拍照,而後再回到APP提交拍好的照片。在這種場景下,咱們須要從本身的APP跳轉到其餘的APP,而這種跳轉的交互在產品中是常常會發生的。segmentfault

Espresso並無對這種跨APP的交互測試提供支持。咱們沒法在腳本中經過Espresso獲取到非本身APP以外其餘APP(或者系統界面)的UI組件。這時,咱們就須要用到Android提供的UI Automator來進行自動化測試。工具

配置

想要使用UI Automator,只須要添加以下依賴:佈局

dependencies {
    ...
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}

UI Automator僅支持Android 4.3(API Level 18)及以上版本。測試

可行性探索

在使用UI Automator編寫測試腳本以前,咱們須要對當前測試用例是否能夠用UI Automator進行測試作一些探索。簡單來講,就是要確保咱們須要的界面元素是否都能找到、但願出發的操做是否都支持。ui

肯定可行性的方法也很簡單,只要確保咱們須要操做的UI元素有能夠進行匹配的屬性(這一點相似於Espresso),好比惟一的ID,text等等。咱們能夠按照該系列第四篇對uiautomatorviewer的介紹來使用Android提供的uiautomatorviewer工具,對測試用例中的各個頁面,尤爲是跨APP交互的頁面中的各個UI元素進行分析,確保每一個咱們須要操做的元素都有相應能夠匹配的屬性值,以便於咱們能夠經過腳本找到相應的元素。this

對此,Android官方對咱們開發者也提出了一些針對自動化測試的建議,便於咱們在開發時採用:code

  • 對於ImageView, ImageButton, CheckBox這些控件,對其設置android:contentDescription屬性。對象

  • 對於EditText,設置其android:hint屬性。接口

  • 對於其餘有交互做用但沒有顯式文本的控件(比方說能夠點擊的icon之類),設置其android:hint屬性。

以上這些建議的目的,無非就是可讓咱們經過自動化測試API去找到頁面上的控件。

UI Automator測試流程

使用UI Automator進行腳本編寫的一些前置條件和Espresso基本相似,實際上,咱們基於以前幾篇文章的配置就能夠直接進行UI Automator的編寫。

採用UI Automator的過程以下:

  • 得到一個UiDevice對象,表明咱們正在執行測試的設備。該對象能夠經過一個getInstance()方法獲取,入參爲一個Instrumentation對象:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
  • 經過findObject()方法獲取到一個UiObject對象,表明咱們須要執行測試的UI組件。

  • 對該UI組件執行一系列操做。

  • 檢查操做的結果是否符合預期。

整個流程和Espresso基本相似,除了增長了第一項:首先得到一個UiDevice對象。這一點也容易理解,爲了要支持跨APP的測試,咱們就不能只從APP層面而是須要從整個設備層面來進行測試了,所以也是首先須要獲取設備對象,再執行相關的操做。

獲取UI組件

根據如上所說,咱們是經過UiDevice來調用findObject()方法來獲取到咱們想要執行操做的UI組件。咱們來看一下這個方法的聲明:

/**
 * Returns a UiObject which represents a view that matches the specified selector criteria.
 *
 * @param selector
 * @return UiObject object
 */
public UiObject findObject(UiSelector selector) {
    return new UiObject(this, selector);
}

從如上聲明能夠看出,findObject()方法接受了一個UiSelector對象,返回了咱們須要的UiObject對象。在這裏,UiSelector相似於Espresso中的Matcher,也是指定了某種匹配規則,UI Automator會按照UiSelector指定的規則從當前UI上進行控件的查找。不一樣於Espresso的是,若是找到多個知足規則的控件,則會返回第一個控件。若是沒有控件知足當前指定的規則,則會拋出一個UiAutomatorObjectNotFoundException異常。

Espresso相似,咱們能夠經過IDtext等屬性來進行控件的查找,同時也能夠指定目標控件的類型。能夠指定一個規則,也能夠經過鏈式調用指定多個規則。好比:

UiObject mCameraSureBtn = mDevice.findObject(new UiSelector().resourceId("com.android.camera:id/v6_btn_done")
                .className("android.widget.ImageView"));

這行代碼的UiSelector構建就是採用了以下兩個組合規則:

  • 控件ID"com.android.camera:id/v6_btn_done",這個ID是從某個MIUI版本系統的系統相機獲取的,對應於拍照按鈕;

  • 控件類型爲ImageView

除了UiObject以外,UI Automator還提供了其餘的UI對象,好比UiCollection對象能夠對一組控件之間進行操做,對佈局之間的包含關係作了支持;好比UiScrollable對象支持了對可滑動組件的支持。這些組件的用法大同小異,能夠自行參考API接口。

執行操做

找到了咱們須要的控件,接下來該對控件進行操做了!

UiObject提供了一系列方法用來執行各類各樣的操做。好比:

  • click():點擊控件中心;

  • dragTo():拖動控件到指定位置;

  • setText():對可輸入控件設置文本;

  • swipeUp():對控件執行上滑操做。相似地,swipeDown(), swipeLeft()swipeRight()能夠執行相應的操做

這一部分也是比較簡單,和Espresso的用法大致相似,只是API層面的區別。具體的能夠在使用的時候查看API文檔。

檢查結果

執行一系列操做以後,咱們須要對操做的結果進行驗證了!
對於結果的驗證,咱們可使用以前說到的一系列Assert方法了。好比說,咱們須要檢測某個控件的文字:

assertEquals(TargetText, mUiObject.getText())

即可以這樣進行執行。

總結

從該篇文章來看,UI Automator的使用方法和Espresso基本相同,總體的思路也是徹底一致,只是一個對APP內部提供了很好的支持,另外一個對跨APP提供了支持。你們在實際編寫自動化測試腳本時能夠靈活選用。

附錄

Android自動化測試-從入門到入門(1) Hello Testing!
Android自動化測試-從入門到入門(2) Testing APIs
Android自動化測試-從入門到入門(3) Espresso入門
Android自動化測試-從入門到入門(4) uiautomatorviewer
Android自動化測試-從入門到入門(5) AdapterView的測試
Android自動化測試-從入門到入門(6) 會玩的Espresso
Android自動化測試-從入門到入門(7) UI Automator

相關文章
相關標籤/搜索