一、环境搭建

  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. Coursera, Deep Learning 5, Sequence Models, week3, Sequence models & Attention mechanism

    Sequence to Sequence models basic sequence-to-sequence model: basic image-to-sequence or called imag ...

  2. MacOS安装Go2Shell

    1 去官网下载安装MacOS最新版本 https://zipzapmac.com/Go2Shell 2 下一步下一步安装 3 设置 打开终端设置, open -a Go2Shell --args co ...

  3. Socket TCP客户端和服务器的实现

    import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...

  4. ==,hashcde, equals(一)

    1.Hash  的属性, 1)bucket 和 list 2.java.lang.object 的 hashcode 和 equal 通过内存地址比较 3.为什么要重写hashcode 和 equal ...

  5. #6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)

    题目链接:https://loj.ac/problem/6284 题目大意:中文题目 具体思路:还是和sqrt那个题的思路相同的,标记每一块的值是不是相同的,注意lazy下标的下放. AC代码: #i ...

  6. vue购物车实战项02

    1.数据循环.绑定 v- 绑定的属性 都是变量 ( 小程序这块需要花括号 不同点) 2.列表点击 当绑定变量为一个对象的时候{} 属性根据里面的属性值 bool 值  是否返回 当前的属性 转化成cl ...

  7. Spring3.2+mybatis3.2+Struts2.3整合

    1.Spring3.2不能用于JDK1.8,只能用于JDK1.7.JDK1.8用spring4.0. 2.导入的jar包 3.目录结构: 4.配置Spring 配置数据库信息: <?xml ve ...

  8. seo 优化排名 使用总结

    SEO 的优化技巧 随着百度对竞价排名位置的大幅减少,SEO优化将自己的网站在首页上有更好的展示有了更多的可能. 本文将系统阐述SEO优化原理.优化技巧和优化流程. 搜索引擎的优化原理是蜘蛛过来抓取网 ...

  9. 2.Python list_常用方法总结

    一.创建列表 只要把逗号分隔的不同数据项,使用方括号[],括起来即可, 下标(角标索引)从0开始,最后一个一个元素下标可以写-1 list = ['1' , '2' , '3'] list = []  ...

  10. Shell-find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

    查找所有的 jpg 文件,并且压缩它们: find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz