android 自动化测试UiAutomator 坑
使用原因
公司需要自动化测试一些功能,上级说这个可以有效debug一些功能bug,so让我看看。但是这个技术貌似也已经挺久了。
安装
我使用的IDE是as,eclipse等也可以。
首先在app根目录的build.gradle文件中加入依赖:
// AS默认配置,如果如果没有记得加上
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
其次配置一下testInstrumentation为AndroidJunitRunner:
defaultConfig {
...
// 这个AS会为我们默认配置,如果没有记得加上
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
第一个坑:
1.这是网上老早的代码改过的,我的sdk不符合所以直接复制到gradle了,记得同步一波;
2.还有targetSdkVersion和compileSdkVersion一致;
3.把出错的包改成正确一致的版本就ok
4.但是我的layout文件里的layout报错,直接改为简单的LinearLayout就ok了。(大概就是远古时期的sdk没有这些包所以导致的)
android {
compileSdkVersion 25
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.yl.uiautomatordemo"
minSdkVersion 18
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.0.0'
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
好了,gradle配置好了以后,就到了测试了(这之前你的项目代码已经写好),我用的是简单的按钮点击事件来测试。直观简单。
简单的测试
这个步骤只是为了了解功能,不是实际操作。
步骤:
1.把要测试的App安装到手机中。 2.打开UI分析工具uiautomatorviewer.bat(在android sdk/tools/bin路径),分析当前UI的界面元素,确保App的各个控件可以被测试工具获取到。 3.根据App使用流程编写测试用例。 4.运行测试用例进行测试,定位bug,解决bug。
在打开bat以后,获取到界面元素后,就可以用获取到的元素id之类的写测试用例了。
3.在以下的目录下创建新的TestUi类,之后在内部创建方法(命名要是test开头)
至于测试的方法具体内容涉及到的api是关键,但先不具体说,他们其实很简明。
以下放testButton代码
public void testButton() throws UiObjectNotFoundException {
// 获取设备对象
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
UiDevice uiDevice = UiDevice.getInstance(instrumentation);
// 获取上下文
Context context = instrumentation.getContext();
// 启动测试App
Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.yl.uiautomatordemo");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
// 打开CollapsingToolbarLayout,此处的resourceId在bat中可以查看
String resourceId = "com.yl.uiautomatordemo:id/butt";
UiObject button = uiDevice.findObject(new UiSelector().resourceId(resourceId));
button.click();
for (int i = 0; i < 5; i++) {
button.click();
}
}
其实,这个bat只是提供查询各个控件的名称之类信息,结合api的使用就可以用ui测试了。
第二坑:(之前看到的代码太老,已经过时了。)
要使用muiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
不能使用UiDevice.getInstance()或者getUiDevice()。