一、环境搭建

  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. Python之线程 2 - Python实现线程

    一 python与线程 1.全局解释器锁GIL(用一下threading模块之后再来看~~) 2.python线程模块的选择 二 Threading模块 1.线程创建 2.多线程与多进程 3.多线程实 ...

  2. Python的参数类型

    参数类型: 1.必填参数,位置参数(positional arguments,官方定义,就是其他语言所说的参数) 2.默认值参数,非必传 3.可变参数,非必传,不限制参数个数,比如说给多个人发邮件,发 ...

  3. MIME 类型

    关于读音 为了防止大家出去丢人,我先示范一下,MIME应该独坐[maim],听起来就好像“男人”的英语法人一样. 浏览器和MIME的关系 浏览器依靠MIME类型解释网页. 每当浏览器请求一个web页面 ...

  4. J - Joyful HDU - 5245 (概率)

    题目链接: J - Joyful  HDU - 5245 题目大意:给你一个n*m的矩阵,然后你有k次涂色机会,然后每一次可以选定当前矩阵的一个子矩阵染色,问你这k次用完之后颜色个数的期望. 具体思路 ...

  5. Palindromic Numbers LightOJ - 1205

    题目大意: 求区间内的回文数个数 题目思路: 数位dp,先枚举前一半数字,然后填上相应的后一半数字. #include<cstdio> #include<cstring> #i ...

  6. hibernate 嵌套事务

    hibernate 嵌套事务,多线程调试.问题麻烦啊,后续有时间补全.

  7. qtcreator 快捷键常用

    F1        查看帮助F2        跳转到函数定义(和Ctrl+鼠标左键一样的效果)Shift+F2    声明和定义之间切换F4        头文件和源文件之间切换Ctrl+1     ...

  8. 20165231 实验一 Java开发环境的熟悉

    实验报告封面 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:王杨鸿永 学号:20165231 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 15:25 ...

  9. HTML5 头部【快速编写】

    <!doctype html> <html><head> <meta charset="utf-8">#设置网页文件展示时使用的字符 ...

  10. [Docker]Docker拉取,上传镜像到Harbor仓库

    需求 因为项目的需求,需要制作一个基于tomcat的镜像.那么前提就是,需要有tomcat的基础镜像. 怎么做 我的思路跑偏了,本来以为是需要将tomcat下载下来,然后通过docker命令,让它成为 ...