一.什么是UIAutomator?
UIAutomator是一款Android自动化测试框架,注入原生事件进行模拟用户操作。
优点:支持跨应用操作,不需要对被测应用重新签名,可方便地对事件进行操作与监控,易扩展易上手等。
缺点:SDK16(Android4.1)及其以上才能使用,resourceId控件的获取需要SDK18(Android4.3)以上,对中文的支持较差等。
二.UI2.0与UI1.0的区别
(1)2.0基于 Instrumentation, 可以获取应用Context,可以使用Android服务及接口。
(2)2.0基于 Junit4,测试用例无需继承于任何父类,方法名不限,使用Annotation进行;1.0需要继承UiAutomatorTestCase,测试方法需要以test开头。
(3)2.0采用Gradle进行构建,1.0使用Maven或Ant。
(4)2.0新增UiObject2、Until、By、BySelector等接口。
(5)2.0输出到Logcat,1.0可以使用System.out.print输出到控制台。
(6)2.0输出为APK,1.0输出为JAR。
二.开发环境搭建
JDK1.8
Eclipse(UI1.0)、Android studio(UI2.0)
Android sdk、
Ant(构建脚本,生成jar包)
三.新建测试工程
(1)使用eclipse或idea创建一个工程UIAutomtorPM,File->new ->Project,
(2)添加外部依赖库,android.jar、uiautomator.jar(使用sdk\platforms\android-20下的jar)
(3)添加junit4依赖库;
(4)在src目录下创建包名com.qwert.autotest.simcard,创建类名SimCardTest
代码如下:
package com.qwert.autotest.simcard.testcase;
import android.widget.ImageView;
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 SimCardTest extends UiAutomatorTestCase {
private UiObject airPlane = new UiObject(new UiSelector().description("Airplane mode"));
private UiObject airPlaneIcon = new UiObject(new UiSelector().description("Airplane mode.").className(ImageView.class));
@Override
protected void setUp() throws Exception {
super.setUp();
getUiDevice().pressHome();
}
public void testSwitchToNormalMode() {
// 打开快速设置,打开飞行模式
getUiDevice().openQuickSettings();
setAirplaneMode(true);
// 由飞行模式切换到普通模式
setAirplaneMode(false);
// 验证是否切换成功
assertFalse("close airplane fail", airPlaneIcon.exists());
}
public void testSwitchToAirplaneMode() {
// 打开快速设置,打开飞行模式,验证是否打开成功
getUiDevice().openQuickSettings();
setAirplaneMode(true);
assertTrue("open airplane fail", airPlaneIcon.exists());
// 测试完成,取消飞行模式。恢复手机状态,避免影响后续用例执行。
setAirplaneMode(false);
}
public boolean isAirplaneModeEnabled() {
try {
return "On".equals(airPlane.getText());
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
return false;
}
}
public boolean setAirplaneMode(boolean enabled) {
if (enabled == isAirplaneModeEnabled()) {
return true;
}
try {
airPlane.click();
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
return enabled == isAirplaneModeEnabled();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
}
注:使用ant构建build文件会报错,所以把Java代码中的“import org.junit.Test”和“@Test”删除。
四.生成build.xml并构建jar包
1.创建build文件
(1)找到sdk/tools目录,使用cmd命令 打开tools目录;
(2)输入命令 android list target,查看使用android.jar的id值,比如是3
(3)执行如下命令,生成xml文件
android create uitest-project -n UIAutomatorPM -t 3 -p F:\IdeaProjects\UIAutomatorPM
-n 后面,将要生成的用例jar文件名称;
-t 后面,选择合适的id来匹配“android.jar”和“uiautomator.jar”的版本;
-p 后面,当前项目所在的路径。
命令执行成功后,可看到build.xml文件在项目根目录生成。
注:
android studio使用的sdk版本过高的话,eclipse或idea无法构建jar包,可下载低版本的sdk tools替换android studio sdk的tools目录。
或者安装两套sdk,设置tools目录的临时环境变量。set path=D:\eclipse_sdk\tools;%path%
2.生成jar包
法一:在工程根目录执行命令:ant build
法二:eclipse可修改build.xml文件的default="help"属性为default="build", 鼠标右键点击该文件,Run As -> 1.Ant Build
看到“BUILD SUCCESSFUL”输入后,可到项目的bin目录下查找生成的UIAutomatorPM.jar文件
五.执行测试
(1)将jar包push到手机data/local/tmp目录下
adb push
adb push F:\IdeaProjects\UIAutomatorPM\bin\UIAutomatorPM.jar /data/local/tmp
(2)运行用例
adb shell uiautomator runtest
adb shell uiautomator runtest /data/local/tmp/UIAutomatorPM.jar -c com.qwert.autotest.simcard.testcase.SimCardTest
等待查看测试结果。