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

相关文章
相关标签/搜索