为什么选择UiAutomator
作为亲儿子UiAutomator随Android同步推出,随Android版本同步升级,经过多次迭代目前已经相当稳定。
相比MonkeyRunner,UiAutomator接口丰富易用,可以支持所有Android事件操作,事件操作不依赖于控件坐标,可以通过断言和截图验证正确性,非常适合做UI测试。
UIAutomator不需要测试人员了解代码实现细节,属于功能和黑盒测试。测试代码结构简单,编写容易,学习曲线低。基于JAVA,一次编译可以运行于所有Android设备。
注: UIAutomator不适合OpenGL和HTML为主的程序,因为这类程序未使用Android的view体系。
UIAutomator的使用准备
1.首先介绍UIAutomator测试框架的UI工具:uiautomatorviewer
uiautomatorviewer位于sdk/tools目录下,可以扫描、分析待测试应用界面,分析结果可以导出为xml与截图。通过该工具可以分析出UI控件的id,text,focusable等等各种属性,甚至布局上的层次关系。
可以在DDMS中启动,如下:
上图uiautomatorviewer的运行截图,左侧为手机当前画面截图,右侧上部为view控件的层次关系,下部为当前选中控件的各种信息。在左侧屏幕上选择一个组件,可以查看到该控件的属性,在我们写脚本的时候则可以根据对应的属性信息找到该控件然后对控件进行操作,或者根据某些属性进行判断,比如是否可点击等~
2.uiautomator简介
uiautomator是一个包含一套UI测试API,和支持运行测试程序的JAR包。该JAR包位于sdk/platforms/android-*/uiautomator.jar.
使用时需要注意自己的SDK版本需要大于16, SDK Tools版本需要大于21。
uiautomator的使用说起来其实很简单,根据属性找到控件,然后对该控件进行操作,大概如下图:
uiautomator的使用步骤
下面用一个例子介绍uiautomator的使用。在该例子中我们将模拟APP的登录并退出。
以Eclipse为例:
1.创建一个Java工程
File-->New-->Java Project 输入工程名称,例如MessageTsetCase. 点击Finish
2.添加必要的Jar包
在Project Explorer中右击刚刚创建的这个工程,选择 Properties-->Java build Path添加如下JAR包
a.选择Add library -->JUnit选择Junit3
b.选择Add External JARS, 选择sdk/platforms/android-*/目录下的uiautomator.jar和android.jar,路径中的*请使用自己以下载的最新版本。
3.File-->new-->Class创建一个新的文件。
4.编写测试用例,通常可以为一个测试用例编写一个单独的方法:
package com.iflytek.test;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class MessageTestCase extends UiAutomatorTestCase {
public void testDemo() throws UiObjectNotFoundException {
// 模拟 HOME 键点击事件
getUiDevice().pressHome();
// 找到 Apps tab 按钮
UiObject appsTab = new UiObject(new UiSelector().text("智慧社区"));
appsTab.click();
//按返回键退出
getUiDevice().pressBack();
getUiDevice().pressBack();
getUiDevice().pressBack();
getUiDevice().pressBack();
sleep(2000);
// 打开APP
if (appsTab.exists()) {
appsTab.clickAndWaitForNewWindow();
sleep(5000);
}
// 进入我的页面
UiObject myTab = new UiObject(new UiSelector().text("我的"));
myTab.clickAndWaitForNewWindow();
//设置循环次数
for(int i =20; i > 0; i--){
// 进入登录页
UiObject Login = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/mine_login_layout"));
if (Login.exists()) {
Login.clickAndWaitForNewWindow();
// 输入用户名密码
UiObject username = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/login_editUser"));
username.clearTextField();
username.setText("18019900009");
UiObject passwd = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/login_editPassword"));
passwd.clearTextField();
passwd.setText("111111");
//点击登录按钮
UiObject login = new UiObject(new UiSelector().text("登录"));
login.clickAndWaitForNewWindow();
}
//登出
UiObject myinfo = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/mine_head_layout"));
myinfo.click();
UiObject loginout = new UiObject(new UiSelector().resourceId("com.iflytek.smartzone:id/person_info_exitlogin"));
loginout.click();
UiObject okbt = new UiObject(new UiSelector().text("确认退出"));
okbt.clickAndWaitForNewWindow();
}
}
}
5.编译测试用例
在编译之前我们先要生成build.xml,生成方法如下:
<android-sdk>/tools/android create uitest-project -n <name> -t 3 -p <path>
其中<name>是包含uiautomator测试源文件的测试项目名称,<path> 是对应的测试项目目录的路径。
-t 后面的参数是android版本在当前sdk中的target值,通常一个sdk中我们会下载多个版本的android platform
可以通过一下命令查看:
<android-sdk>/tools/android list
输出如下:
view plain copy to clipboard print ?
- </pre><pre name="code" class="html">Available Android targets:----------id: 1 or "android-16" Name: Android 4.1.2 Type: Platform API level: 16 Revision: 4 Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in Tag/ABIs : default/armeabi-v7a----------id: 2 or "android-19" Name: Android 4.4.2 Type: Platform API level: 19 Revision: 3 Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in Tag/ABIs : default/armeabi-v7a----------id: 3 or "android-20" Name: Android 4.4W Type: Platform API level: 20 Revision: 1 Skins: WQVGA400, WSVGA, WXGA800, HVGA, WVGA854, QVGA, WVGA800 (default), WQVGA432, WXGA720, WXGA800-7in, AndroidWearRound, AndroidWear Square, AndroidWearRound, AndroidWearSquare Tag/ABIs : android-wear/armeabi-v7a, android-wear/x86
这里应该和之前添加Library选择的一致或更新,所以-t 后面我写的是1.
运行后输出如下:
Updated file D:\Users\qxb-810\workspace\MessageTestCase\build.xml
到此,build.xml已经生成完毕,下面我们进入到工程目录下进行编译:
然后将这个jar文件拷贝到手机的 /data/local/tmp/ 目录中:
adb push D:\Users\qxb-810\workspace\MessageTestCase\bin\MessageTestCase.jar /data/local/tmp
adb shell uiautomator runtest MessageTestCase.jar -c com.iflytek.test.MessageTestCase
写uiautomate测试脚本时常用的一些类见下篇: android自动化测试-UiAutomator常用类