UI Automator
根据google的文档,Espresso主要用于单个应用的ui测试。UI Automator主要用于多个应用的ui测试。
允许让您在用户流跨越其他应用程序或者系统UI时验证您的应用程序是否正常运行。比如,一个即时通信的app,它允许用户打开联系人并选择要发送消息的人,然后返回app,并发送消息。
UI Automator允许您与设备上的可见元素进行交互,无论哪个Activity的位于前台,它都可以使用方便的描述符来查找UI组件。
使用UI Automator
设置依赖
需要在build.gradle中配置依赖
dependencies {
...
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
}
检测应用程序的UI组件
Android sdk自带的uiautomatorview工具提供了方便的可视界面,用于检查布局层次并查看当前可见的ui属性。这些信息允许您使用UI Automator创建更细微的测试。
启动uiautomatorview工具:
- 打开目标应用程序
- 将设备连接到计算机
- 打开终端窗口并进入
/tools/目录 执行以下命令
$ uiautomatorviewer
查看ui属性:
- 在uiautomatorviewer界面,点击”Device Screenshot”按钮
- 将鼠标悬停在左侧面板的快照上即可查看该uiautomatorviewer工具识别的UI组件。属性位于右下方面板,布局层次结构位于右上方面板。
- 在右上方布局层次结构上方,点击”Toogle NAF nodes”按钮可以查看UI AutomatorViewer无法识别的ui组件。
确保Activity可以访问
UI Automator测试在已经实现了Android辅助功能的应用程序上表现更好。
当使用sdk中包含的view类或这view的子类的时候不用再添加辅助功能,因为这些类已经包含了这些工作。
但是如果要使用自定义的view的时候,这些元素不会提供可访问性支持,所以你要通过以下的步骤添加Android辅助功能。
- 创建一个类extends ExploreByTouchHelper.
- 通过调用将新类的实例与自定义view关联。
创建UI Automator测试类
UI Automator测试类和junit 4的测试类的方法一样。
主要是需要在@Test中实现一下编程模型:
- 获取到UiDevice对象,通过调用getInstance()并且需要传递Instrumentation对象作为参数
- 通过findObject()方法获取当前设备显示的UiObject对象去访问ui组件
- 通过调用UIObject的方法来执行交互,例如模拟多点触控手势,以及编辑文本字段。
- 查看是否达到了预期的状态和行为
指定选择器
如果要访问应用程序中特定的UI组件,请使用UiSelector类。
如果找到了多个匹配元素,则返回匹配元素的第一个元素作为UiObject。构建是可以使用链式编程以优化搜索。如果没有找到匹配元素会抛出异常。
可以使用childSelector去匹配子view
执行UI操作
一旦你获取到UiObject对象,你就可以对该对象执行UI操作。
- click()
- dragTo()
- setText()
- swipeUp()
- swipeRight()
Context context = getInstrumentation().getTargetContext();
Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.xxx");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
device.wait(Until.hasObject(By.pkg("com.xxx").depth(0)), 2000);
对viewgroup进行操作
可以使用UiCollection去获取viewgroup。
对可滑动view进行操作
可以使用UiScrollable类去获取可滑动views
验证结果
你可以使用JUnit的Assert方法测试ui组件的结果是否是预期的结果。
run
与JUnit测试运行方法相同