UiAutomator 是由 google 推出的 Android UI 自动化测试工具
基于 Accessibility 服务,该工具提供了很多的 api,可以使用这些 api 做一些自动化测试。例如:打开 app,点击,滑动等一系列模拟 ui 操作。
google 提供的例子uiautomator BasicSample
android developer 提供测试入门的教程和如何编写一个uiautomator 测试的入门教程
在app里的build.gradle的dependencies方法中
添加如下依赖,目前需要注意的事情是suppport
库将会慢慢不维护,后续使用androidx
,所有依赖版本可以这里查看
# support
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
# androidx
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
主要使用两个对象device*(操作的设备)
UiObject(节点对象)
,其中UiObject
包含两个版本,理解为 2 代表一个特定查找出来的元素而 1 只是一个查找的工具可以重复使用。详细说明可以查看这里所有的操作都是基于设备或者 ui 节点对象进行操作。 所以如果要想熟练使用需要明白相关的 api。
提供了对有关设备状态信息的访问,你可以使用此类模拟设备上的用户操作,例如键盘,home,menu 等。
方法 | 说明 |
---|---|
pressBack | 返回 |
pressHome | 主页 |
pressKeyCode(KeyEvent.KEYCODE) | 特定按键 |
pressEnter | 回车 |
pressDelete | 删除 |
click | 点击 |
drag | 拖拽 |
swip | 删除 |
还有其他截屏、唤醒屏幕、获取设备信息、dump 页面结构等等
主要用于模拟用操作,都是对于特定的ui元素
操作
方法 | 说明 |
---|---|
click | 点击 |
clickAndWait(EventCondition condition, long timeout) | 主页 |
pressKeyCode(KeyEvent.KEYCODE) | 等待时间内点击,否则抛出异常 |
clear | 清空 |
drag | 拖拽 |
longclick | 长按 |
scroll | 滚动 |
swip | 滑动 |
包括控件的属性,手势操作,app 的信息等等 api,具体信息可以看这里
android 的 ui 自动化测试框架都是对于uiautomator
进行再次的封装,使测试机器可以接收外部的指令直接执行相关操作。
macaca 里面有两个模块负责设备的自动化测试,UIAutomatorWD macaca-adb。后者是对于adb
的命令再次封装,方便 nodejs 调用。而前者是对uiautomator
进行封装,方便用于接收控制指令。
uiautomator-client 我们可以发现init
startServer
sendCommand
分别负责检查是否安装 UIAutomatorWD,启动测试服务,发送测试指令。我们看一下UIAutomatorWD.java可以发现这里启动了一个httpserver
部分代码如下:
@RunWith(AndroidJUnit4.class)
public class UIAutomatorWD {
@Test
public void MacacaTestRunner() throws Exception {
Bundle args = InstrumentationRegistry.getArguments();
int port = 9001;
if (args.containsKey("port")) {
port = Integer.parseInt(args.getString("port"));
}
UIAutomatorWDServer server = UIAutomatorWDServer.getInstance(port);
Utils.print("UIAutomatorWD->" + "http://localhost:" + server.getListeningPort() + "<-UIAutomatorWD");
if (args.containsKey("permissionPattern")) {
JSONArray permissionPatterns = JSON.parseArray(args.getString("permissionPattern"));
skipPermission(permissionPatterns, 15);
}
while (true) {
SystemClock.sleep(1000);
}
}
appium-uiautomator2-driver 和 appium-uiautomator2-server 、appium-android-driver 分别是 uiautomator1 和 2 两个版本的支持库。启动的部分代码如下:
@RunWith(AndroidJUnit4.class)
public class AppiumUiAutomator2Server {
private static ServerInstrumentation serverInstrumentation;
/**
* Starts the server on the device.
* !!! This class is the main entry point for UIA2 driver package.
* !!! Do not rename or move it unless you know what you are doing.
*/
@Test
public void startServer() {
if (serverInstrumentation == null) {
serverInstrumentation = ServerInstrumentation.getInstance();
Logger.info("[AppiumUiAutomator2Server]", " Starting Server");
try {
while (!serverInstrumentation.isServerStopped()) {
SystemClock.sleep(1000);
serverInstrumentation.startServer();
}
} catch (SessionRemovedException e) {
//Ignoring SessionRemovedException
}
}
本文主要分析了 ui 自动化框架如何利用uiautomator
做自动化测试的。其实写这个文章的主要目的是复习相关知识,之前一直知道但是之前面试的时候竟然发现说不出来所以然
。
然后顺便求一个测试开发工程师的岗位。 目标地点杭州。多年安卓开发经验,对测试相关信息有一定的了解,希望在质量领域做点事。