UiAutomator UIAutomator 之常规 ui 自动化测试原理分析

花开 · 2019年09月30日 · 2768 次阅读

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'

api

主要使用两个对象device*(操作的设备) UiObject(节点对象),其中UiObject包含两个版本,理解为 2 代表一个特定查找出来的元素而 1 只是一个查找的工具可以重复使用。详细说明可以查看这里所有的操作都是基于设备或者 ui 节点对象进行操作。 所以如果要想熟练使用需要明白相关的 api。

UiDevice

提供了对有关设备状态信息的访问,你可以使用此类模拟设备上的用户操作,例如键盘,home,menu 等。

方法 说明
pressBack 返回
pressHome 主页
pressKeyCode(KeyEvent.KEYCODE) 特定按键
pressEnter 回车
pressDelete 删除
click 点击
drag 拖拽
swip 删除

还有其他截屏、唤醒屏幕、获取设备信息、dump 页面结构等等

UiObject

主要用于模拟用操作,都是对于特定的ui元素操作

方法 说明
click 点击
clickAndWait(EventCondition condition, long timeout) 主页
pressKeyCode(KeyEvent.KEYCODE) 等待时间内点击,否则抛出异常
clear 清空
drag 拖拽
longclick 长按
scroll 滚动
swip 滑动

其他

包括控件的属性,手势操作,app 的信息等等 api,具体信息可以看这里

测试原理

android 的 ui 自动化测试框架都是对于uiautomator进行再次的封装,使测试机器可以接收外部的指令直接执行相关操作。

macaca

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

appium-uiautomator2-driverappium-uiautomator2-serverappium-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做自动化测试的。其实写这个文章的主要目的是复习相关知识,之前一直知道但是之前面试的时候竟然发现说不出来所以然

然后顺便求一个测试开发工程师的岗位。 目标地点杭州。多年安卓开发经验,对测试相关信息有一定的了解,希望在质量领域做点事。

参考信息

Macaca 测试 Android 原理解析
android 测试最佳实践

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册