到目前为止,咱们已经完成了对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