仲林霖
摘要:本文主要介绍了一个可以执行安卓自动化测试的方法,使用adb命令调试手机。通过adb命令获取手机界面元素,发送动作指令给手机。
关键词:安卓 adb 自动化
1. 引言
Android系统已经占据智能移动设备市场80%以上的份额,所以相应的对于app的测试也尤为重要,而自动化测试又是一个效率高、及其节省人力的方法。现在市场上的测试框架用的比较多的是Appium。虽然Appium框架功能相对比较齐全,但是Appium的框架比较重,相关的文档指导比较少,所以使用起来,学习成本也高。本文所描述框架,主要是简化测试框架、提高执行效率。
2. 关于adb的基础
Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:
客户端,该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
后台程序,该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
服务器,该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。
3. 自动化框架
此框架只支持测试安卓app,是基于adb命令功能的封装,在执行效率上有了很大提升。
1)寻找目标控件
控件属性包含:text、resource-id、class、package、content-desc、checkable、checked、clickable、enable、focusable、focused、scrollable、long-clickable、password、selected、bounds。寻找的条件可以是上面列出屬性的其中一个,或者多个组合。用java代码举例:
Map
condition.put("text", "valueText");
condition.put("resource-id", "valueResourceid");
condition.put("content-desc", "valueContentDesc");
根据条件寻找控件,这里首先把手机界面的结构dump出来,在进行XML解析,然后再逐个和寻找目标条件比对。
2)点击目标控件,输入文本,返回、home、menu
a. 获取目标控件的信息后,取得位置,然后使用adb发送点击位置的指令。用java代码举例:
String bounds = targetElement.attributeValue("bounds");
ArrayList
String number = "";
for (int i = 0; i < bounds.length(); i++) {
if (Character.isDigit(bounds.charAt(i))) {
number += bounds.charAt(i);
} else {
if (!number.equalsIgnoreCase("")) {
listInt.add(Integer.valueOf(number));
number = "";
}
}
}
int left = listInt.get(0);
int top = listInt.get(1);
int right = listInt.get(2);
int bottom = listInt.get(3);
String cmd = "adb shell input tap " + String.valueOf(right - left) + " " + String.valueOf(bottom - top);
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
b. 往控件里面输入文本,需要输入框首先获取光标,然后再使用adb命令发送输入文本指令。用java代码举例:
String cmd = "adb shell input text " + text;
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd})
c. 输入返回、Home、Menu实体按键,使用adb命令发送按键指令。用java代码举例:
返回键:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "adb shell input keyevent 4"});
Home键:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", adb shell input keyevent 3});
Menu键:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", adb shell input keyevent 1});
4. 实例分析
自动化框架的点击、输入文本、实体按键直接封装成方便方法,比如需要点击某个resource-id为“abc”的控件,可以使用方法“clickByResId("abc")”来实现功能,一行代码就足够,可以使大大减少自动化脚本的编辑成本。
在运行自动化脚本的过程中,会存在要操作的控件还没有出现在安卓手机上,这时候需要有一个循环等待的机制来解决这个问题,在控件没有找到的时候,就一直等待,直到目标控件。这种循环等待机制会大大增加脚本的鲁棒性。
在测试安卓手机的过程中,会出现很多权限请求的弹窗,影响脚本继续往下执行,即使有循环等待机制,也会因为弹窗不处理而无限等待下午。针对这个问题,可以在执行测试脚本的同时,新开一个线程轮训地去检查安卓手机界面是否有弹窗,一旦发现弹窗就点击授权跳过。因为主测试进程没有找到目标控件会一直等待,所以弹窗点击授权之后,就可以继续进行测试。以java代码举例:
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (hasObject("权限请求"){
clickByText("允许");
}
Thread.sleep(1000);
}
}
}).start();
5. 结语
通过自动化框架,可以提高编辑脚本的效率,降低脚本出错的概率,帮助缺少开发经验的软件测试人员更容易地书写测试脚本,推进自动化测试。
参考文献
[1] 郑婷婷,黄英持,Android应用的多设备自动化测试实现[J].软件导刊,2016(02)