一、环境搭建

  JDK(java环境)、SDK(adb appt环境),这两个已经不想再叙述了直接看详见-->

  android studio 安装,下载地址:https://developer.android.google.cn/studio/index.html

安装完成,打开后大概是这个样子的:

二、新建测试工程

1.开始新建一个工程:点击上图的“Start a new Android Studio project ”

2.进入创建工程界面,设置app的名称、包名,及工程路径,点击 “Next”

3.选择平台类型及sdk的最小版本,点击 “Next”

4.选择Empty Activity,点击“Next”;选择No Activity,点击“Finish”

5.工程创建完成。(默认是Android目录模式,且有一个默认的Module【app】)

这里附上以下界面的较为详细的介绍>>>>>

三、编写脚本

在编写脚本前说明几点:(实例并非以上新建的工程目录,但并不影响此教程)

  a:脚本实例中将测试脚本写在main中,以便后续build apk后,能在CTS框架中运行。

  b:需先配置AndroidManifest.xml文件、build.gradle(Module:app)文件、以及settings.gradle文件。

1.settings.gradle文件内容

2.AndroidManifest.xml文件中添加Instrumentation标签

3.build.gradle(Module:app)文件中添加测试依赖的包。文件代码如下:

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.zzw.testdemo"
minSdkVersion 24
targetSdkVersion 26
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:26.+'
testCompile 'junit:junit:4.12' compile 'com.android.support.test:runner:0.5'
// Set this dependency to use JUnit 4 rules
compile 'com.android.support.test:rules:0.5'
// Set this dependency to build and run Espresso tests
compile 'com.android.support.test.espresso:espresso-core:2.2.2'
// Set this dependency to build and run UI Automator tests
compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
// Add uiTestHelper
compile project(':uiTestHelper') }

 4.接下来就是代码的编写了,这里贴出一个例子

package com.zzw.testdemo;

import android.graphics.Rect;
import android.os.Environment;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiScrollable;
import android.support.test.uiautomator.UiSelector; import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import java.io.File;
import java.io.IOException;
import java.util.Locale; /**
* Created by zzw on 2017/12/19.
*/ public class TestPermission2 {
private UiDevice mDevice;
private static long LONG_TIMEOUT = 5000;
private static long SHORT_TIMEOUT = 3000;
private static String TEST_PACKAGE_NAME ="com.android.settings";
private static String TEST_MAIN_ACTIVITY="com.android.settings/.Settings"; @Before
public void setUp() throws IOException {
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mDevice.executeShellCommand("pm clear "+TEST_PACKAGE_NAME);
} @After
public void tearDown(){
mDevice.pressHome();
} /**
* Case : 打开设置->点击语言&输入法->点击语言->切换语言(en || cn)
*
*/
@Test
public void test01_a()throws Throwable {
try {
// Launch settings application
mDevice.executeShellCommand("am start -n " + TEST_MAIN_ACTIVITY);
// Sleep 5s
SystemClock.sleep(LONG_TIMEOUT);
// Setting list interface
UiScrollable settingList = new UiScrollable(new UiSelector().resourceId("com.android.settings:id/dashboard_container"));
// Sliding lookup "Languages & input" or "语言和输入法"
UiObject languageInput = mDevice.findObject(new UiSelector().textMatches("Languages & input|语言和输入法"));
settingList.scrollIntoView(languageInput); //UiObject languageInput = settingList.getChildByText(new UiSelector().textMatches("Languages & input|语言和输入法")
// ,Locale.getDefault().getLanguage().equals("en")?"Languages & input":"语言和输入法"); // Click "Languages & input" or "语言和输入法"
languageInput.clickAndWaitForNewWindow();
// Click "Languages" or "语言"
mDevice.findObject(new UiSelector().textMatches("Languages|语言")).clickAndWaitForNewWindow();
// Add language control
UiObject addLanguage = mDevice.findObject(new UiSelector().resourceId("com.android.settings:id/add_language"));
// Language list interface control
UiObject dragList = mDevice.findObject(new UiSelector().resourceId("com.android.settings:id/dragList"));
// The first language displayed rect
Rect rect = dragList.getChild(new UiSelector().className("android.widget.RelativeLayout").index(0)).getBounds();
// Language cn control
UiObject cn = dragList.getChild(new UiSelector().textMatches(".*中文(中国)"));
// Language en control
UiObject en = dragList.getChild(new UiSelector().text("English (United States)"));
// Add language list interface control
UiScrollable findList = new UiScrollable(new UiSelector().className("android.widget.ListView"));
// If language cn and en exists in the language list interface
if (cn.exists() && en.exists()) {
UiObject first = dragList.getChild(new UiSelector().className("android.widget.RelativeLayout").index(0))
.getChild(new UiSelector().className("android.widget.TextView")); if (first.getText().equals("English (United States)")) {
// if the first language displayed "English (United States)" , Switch to cn
cn.dragTo(rect.centerX(), rect.top, 500);
} else if (first.getText().matches(".*中文(中国)")) {
// if it displayed ".*中文(中国)" , Switch to en
en.dragTo(rect.centerX(), rect.top, 500);
} else {
// else none of them , Switch to en
en.dragTo(rect.centerX(), rect.top, 500);
}
} else if (cn.exists() && !en.exists()) {
// if cn exists and en not exists , add en and switch to en
addLanguage.clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("English"), "English").clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("United States"), "United States").clickAndWaitForNewWindow();
SystemClock.sleep(SHORT_TIMEOUT);
en.dragTo(rect.centerX(), rect.top, 500);
} else if (en.exists() && !cn.exists()) {
// if en exists and cn not exists , add cn and switch to cn
addLanguage.clickAndWaitForNewWindow();
UiObject chinese = mDevice.findObject(new UiSelector().textMatches(".*中文"));
findList.scrollIntoView(chinese);
chinese.clickAndWaitForNewWindow();
UiObject china = mDevice.findObject(new UiSelector().text("中国"));
if (china.exists()) {
china.clickAndWaitForNewWindow();
}
SystemClock.sleep(SHORT_TIMEOUT);
cn.dragTo(rect.centerX(), rect.top, 500);
} else {
// else none of them , add en and switch to en
addLanguage.clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("English"), "English").clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("United States"), "United States").clickAndWaitForNewWindow();
SystemClock.sleep(LONG_TIMEOUT);
en.dragTo(rect.centerX(), rect.top, 500);
}
SystemClock.sleep(LONG_TIMEOUT);
}catch (Throwable e){
// if error exist ,print stack trace log and screenshot to sdcard/test01_a.png
e.printStackTrace();
mDevice.takeScreenshot(new File(Environment.getExternalStorageDirectory(),this.getClass().getName()+".png"));
}finally {
mDevice.pressBack();
mDevice.pressBack();
mDevice.pressBack();
}
} @Test
public void test02_a() { } @Ignore
public void test03_a() { }
}

四、运行测试

1.首先来看下在哪里运行测试,及怎么运行测试。步骤见图解

2.编辑运行测试的配置

3.运行测试

实际上测试执行是这样的:(1~4:安装主程序和测试程序; 5:执行测试)

adb push E:\Androids\AndroidStudioProjects\TestDemo\calculator\build\outputs\apk\calculator-debug.apk /data/local/tmp/ com.zzw.testdemo

adb shell pm install  -r /data/local/tmp/com.zzw.testdemo 

adb push E:\Androids\AndroidStudioProjects\TestDemo\calculator\build\outputs\apk\calculator-debug-androidTest.apk /data/local/tmp/ com.zzw.testdemo.test

adb shell pm install -r /data/local/tmp/com.zzw.testdemo.test

adb shell am instrument -r -e debug false -e class com.zzw.testdemo.TestPermission2#test01_a com.zzw.testdemo.test/android.support.test.runner.AndroidJUnitRunner

五、生成报告

六、使用CTS框架运行测试脚本

  要使用CTS测试框架进行测试生成报告:需要将测试脚本写在main中(编写脚本处也提到过),然后将生成的主程序 app-debug.apk放置CTS的testcase目录下,配置完成后即可运行测试。详见 《Android UiAutomator - CTS Frame》cts 7.0以上部分=>>>>

Android UiAutomator2.0的更多相关文章

  1. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

  2. UiAutomator2.0 - Toast信息的验证

    目录 问题:在做UI自动化测试时,偶尔会碰到 Toast 这种提示信息(如图),通过Uiautomatorviewer 无法获该类控件的信息.所以无法验证,该条case不能实现.然后就没然后了... ...

  3. UiAutomator2.0 - 与AccessibilityService的关联

    目录 一.Android中的 Accessibility 二.UiAutomator2.0 与 AccessibilityService 三.验证与 AccessibilityService的关联 A ...

  4. UiAutomator2.0 - 控件实现点击操作原理

    目录 一.UiObject 二.UiObject2 穿梭各大技术博客网站,每天都能看到一些的新的技术.突然感觉UiAutomator 2.0相对于现在来说已经是个很久远的东西了ε=(´ο`*))).写 ...

  5. UiAutomator1.0 与 UiAutomator2.0

      在使用2.0之前,对android自动化框架也做过一些了解<Android 自动化测试框架>.使用UiAutomator2.0也有一段时间,这里将1.0与2.0进行一个对比总结. Ui ...

  6. 初探UiAutomator2.0中使用Xpath定位元素

    J 今天的主题是讲一下在使用过程中遇到的一个问题,如何在UiAutomator2.0中使用Xpath定位元素? 背景 现在的app在打包成apk的时候都是有加固处理的,各种混淆加固,所以已经破坏了或扰 ...

  7. uiautomator2.0框架

    1.   Uiautomator1.0 Uiautomator2.0 date 2012 2015 super class UiAutomatorTestCase InstrumentationTes ...

  8. Uiautomator1.0与Uiautomator2.0测试项目搭建与运行原理

    Uiautomator是Android原生测试框架,可以用于白盒接口测试也可以用于UI自动化测试,Uiautomator分1.0版本与2.0版本,它们都是基于UiAutomation的测试框架,都是通 ...

  9. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

随机推荐

  1. 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号

    迅为iMX6UL开发板多路串口开发平台迅为i.MX 6UL开发板基于ARM Cortex-A7内核,主频高达528 MHz,内存:512MDDR3存储:8G EMMC,支持2路CAN,2路百兆以太网, ...

  2. byte数组和int之间相互转化的方法

    Java中byte数组和int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送者接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形in ...

  3. 03-13_static关键字

    static主要作用 常见定义结构:public static void main(): static关键字可以用于定义属性及方法: static定义属性 在一个类之中,主要的组成就是属性和方法(分为 ...

  4. 剑指Offer-把数组排成最小的数

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 可以看 ...

  5. 编写blog第一天

    今天玩的比较嗨,离开学还剩半个月了,之前在网上搜集了一些blog制作方面的资料,并且在博客园注册了一个账号,今天才打开了申请已久的blog,现在已经对blog具有的基本功能和界面布局有了比较全面的掌握 ...

  6. k64 datasheet学习笔记35---Analog-to-Digital Converter (ADC)

    0.前言 本文主要介绍K64的ADC部分的特性,内部架构,信号描述及操作接口等 1.简介 1.1.ADC模块特性 线性逐次逼近算法,达16bit分辨率 达到4对差分和24个单端模拟量输入 输出模式 差 ...

  7. awk输出单引号,双引号【转】

    双引号: awk '{print "\""}'        #放大:awk '{print "  \"  "}' 使用“”双引号把一个双引 ...

  8. VB中的冒号——bug

    关于VB中的冒号,给许多人的印象都是:“一行可书写几句语句”.这么说是对的,但是有一种情况是不对的,那就是在条件语句中.这也是做一个VB项目升级的时候遇到,因为这个问题我查了好长时间程序,一直在找VB ...

  9. unity制作背景

  10. c++ 值转换

    1.double,float 四舍五入,保留小数位数. void MainWindow::on_pushButton_clicked() { double number=3.141592; ); qD ...