到目前爲止,咱們已經完成了對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
進行腳本編寫的一些前置條件和Espresso
基本相似,實際上,咱們基於以前幾篇文章的配置就能夠直接進行UI Automator
的編寫。
採用UI Automator
的過程以下:
得到一個UiDevice
對象,表明咱們正在執行測試的設備。該對象能夠經過一個getInstance()
方法獲取,入參爲一個Instrumentation
對象:
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
經過findObject()
方法獲取到一個UiObject
對象,表明咱們須要執行測試的UI組件。
對該UI組件執行一系列操做。
檢查操做的結果是否符合預期。
整個流程和Espresso
基本相似,除了增長了第一項:首先得到一個UiDevice
對象。這一點也容易理解,爲了要支持跨APP的測試,咱們就不能只從APP層面而是須要從整個設備層面來進行測試了,所以也是首先須要獲取設備對象,再執行相關的操做。
根據如上所說,咱們是經過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
相似,咱們能夠經過ID
、text
等屬性來進行控件的查找,同時也能夠指定目標控件的類型。能夠指定一個規則,也能夠經過鏈式調用指定多個規則。好比:
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