Uiautomator 项目搭建与实现原理
Uiautomator 是 Android 原生测试框架,可以用于白盒接口测试也可以用于 UI 自动化测试,Uiautomator 分 1.0 版本与 2.0 版本,它们都是基于 UiAutomation 的测试框架,都是通过 UiAutomation 的接口操作设备, 1.0 权限更高,运行更灵活,2.0 针对 app 定制化更高,在同进程内运行,可以获取被测 app 的运行数据,具体选用哪个框架还是根据业务场景灵活选择。

AndroidStudio 基于 ant 编译 Uiautomator1.0 jar 包
Uiautomator1.0 是基于 Java 的测试框架,它通过 junit 和 Uiautomator 框架执行 Java 测试用例,但是自从 Uiautomator2.0 发布以后,官方不再维护 Uiautomator1.0 的构建。目前无法直接通过 Android Studio 创建 Uiautomator1.0 测试项目,本节介绍通过 AndroidStudio 工具构建 Uiautomator1.0 jar 文件。
构建项目工程
1.AndroidStudio 新构建一普通项目-导入依赖包

2.创建测试类

SDK 支持 ant 编译配置
Android 最新 SDK 已去除 ant 编译工具支持,如果需要通过 ant 构建 uiautomator1.0 测试包那么就需要下载以前的 sdk-tools,并将该文件复制到本机 sdk 中
各平台下载地址:
https://dl.google.com/android/repository/tools_r25.2.5-linux.zip
https://dl.google.com/android/repository/tools_r25.2.5-macosx.zip
https://dl.google.com/android/repository/tools_r25.2.5-linux.zip
根据系统版本下载对应的 sdkTools,下载后解压获取 tools 文件夹,并将 tools/文件夹下所有内容复制到本机/sdk/tools/路径下。
根据项目生成 build.xml
1.打开控制台,切换到/sdk/tools/路径下-执行命令

2.打开项目,在项目路径下已生成 [build.xml]文件,打开[build.xml]文件,找到如下代码,并注释。

AndroidStudio 导入 ant 任务,并构建
1.打开当前 module 的 Gradle 文件,写入如下代码,然后构建一下 gradle,在 moduleName->Tasks->other 下会列出 ant 任务

2.点击[ant-build]即可执行构建任务,等待执行结束后在[module/bin]路径下会生成对应的 Apk 文件。
如果构建过程中报 check-env 错误,是因为 sdk-tools 不支持 ant 编译导致的,需要同步一下 sdk-tools
执行测试用例

Uiautomator1.0 的便捷构建
基于 ant 的 Uiautomator1.0 jar 包构建是比较麻烦的,并且 sdk-tools 必须要支持 ant 编译。那么 jar 包的组成部分是什么?
通过解压 Uiautomator1.0 jar 文件,发现 jar 包主要由.dex 文件和 META-INF 构成,Android 应用 apk 文件内也包含着两个文件,所以是可以把 Uiautomator1.0 源码写在普通 Android 项目中,并用.apk 文件替换.jar 文件执行测试脚本。
jar 包文件构成

apk 文件构成

构建 apk
执行下图 Gradle 任务,获取打包 apk 文件

任务执行完毕可以得到 apk 打包文件

执行脚本

Uiautomator1.0 执行流程解析
下面通过 Uiautomator 命令为入口了解 Uiautomator1.0 测试服务是如何运行的,Uiautomator 进程是如何初始化的。
Uiautomator1.0 执行命令结构如下:

Uiautomator 脚本源码则是一个 shell 脚本,通过 app_process 命令加载类
com.android.commands.uiautomator.Launcher

Launcher 作为 uiautomator 进程的入口,解析参数并调用 RunTestCommand 的 run 方法

RunTestCommand.run()方法将具体的执行业务递交给 UiAutomatorTestRunner 类的 run 方法执行

在 UiAutomatorTestRunner 的 run 方法中初始化执行参数,然后调用 start 方法中初始化 UiAutomationShellWrapper 并执行测试任务。UiAutomationShellWrapper 的 connect 方法连接系统测试服务。

UiAutomationShellWrapper 类的 connect 方法初始化了 UiAutomation 对象,UiAutomation 提供测试所需功能 API。

到此 uiautomator 进程已经获取 UiAutomation 对象,可以通过 UiAutomation 对象获取屏幕元素信息、发送按键事件、滑动屏幕、点击屏幕等。以下代码展示部分重要 API,无论是 Uiautomator1.0 还是 Uiautomator2.0 最终都是通过 UiAutomation 对象来执行测试动作的。

模拟 Uiautomator 实现测试服务
特点
系统-已启动其他测试服务时,可以启动服务;
在系统内做服务时可以动态控制测试服务的注册、注销,实现多服务并存;
API 功能需自己实现,业务亲和度强
创建测试类 MyUiAutomation

创建 Java 接口类,并创建测试连接,调用测试服务方法

构造 apk 文件并执行

更多学习资料戳下方
评论