以下内容为原创,欢迎转载,转载请注明

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html

翻译自 Android Developer 官网:http://developer.android.com/tools/testing-support-library/index.html

Testing Support Library

Android Testing Support Library为Android app的测试提供了一个广泛的框架。 这个库提供了一系列的API可以让你快速build和run你app的代码,它包括了JUnit 4和功能性的用户界面(UI)测试。你可以通过Android Studio IDE或者命令行的方式运行你使用这些API创建的测试。

Android Testing Support Library已经可以通过Android SDK Manager下载使用了。详情可见Testing Support Library Setup

这页中会提供一些关于Android Testing Support Library中所提供的工具的信息,怎样在你的测试环境中使用它们,还有库发布的相关信息。

Testing Support Library的特性

Android Testing Support Library提供包括了以下自动化测试工具:

  • AndroidJUnitRunner:兼容Android的JUnit 4。

  • Espresso:UI测试框架,适用于app内的功能性UI测试。

  • UI Automator:UI测试框架,适用于系统和安装app间跨app的功能性UI测试。

AndroidJUnitRunner

AndroidJUnitRunner 类是一个 JUnit 测试runner,它可以让你在Android设备上运行JUnit 3或者JUnit 4-style的测试类,包括使用了 EspressoUI Automator 测试框架的。test runner处理的事情有 加载你的测试package和需要在设备上测试的app,运行你的测试,还有报告测试结果。这个类会替换掉只支持JUnit 3测试的InstrumentationTestRunner类。

这个test runner的关键特性包括:

需要 Android2.2(API level 8) 或者更高。

JUnit的支持

Rest runner兼容JUnit 3JUnit 4(最高到JUnit 4.10)的测试。不管怎样,你应该避免在一个package中混合使用JUnit 3和 JUnit 4的代码,因为这样做可能会引发一些预料之外的问题。如果你创建了一个JUnit 4的测试类在设备或者模拟器上运行时,你的测试类必须要加上@RunWith(AndroidJUnit4.class)注解作为前缀。

下面的代码片段展示了你应该怎么去编写一个JUnit 4测试来验证CalculatorActivity类中的add操作是正确执行的。

import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2; @RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
extends ActivityInstrumentationTestCase2<CalculatorActivity> { @Before
public void setUp() throws Exception {
super.setUp(); // 当你使用`AndroidJUnitRunner`运行测试时,
// 注入Instrumentation实例是必要的。
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
} @Test
public void typeOperandsAndPerformAddOperation() {
// 调用CalculatorActivity add()方法并传入一些操作数据,
// 然后检查返回值是否是期望值
} @After
public void tearDown() throws Exception {
super.tearDown();
}
}

访问instrumentation信息

你可以使用 InstrumentationRegistry 类来访问你测试的app的相关信息。这个类包含一个 Instrumentation 对象,目标app的 Context 对象,还有你通过命令行传入到该测试的参数。这个数据在你使用UI Automator框架编写测试或者编写一些依赖 Instrumentation 或者 Context 对象的测试的时候是很有用的。

测试过滤

在你的 JUnit 4 测试中, 你可以使用注解来配置你的测试的运行。这会最大限度地减少你测试中需要的模版代码和有条件的代码。除了 JUnit 4 支持的标准注解,test runner也支持一些针对Android的特殊的注解,包括:

  • @RequiresDevice:指明这个测试只能运行的物理设备上面,而不是模拟器上面。

  • @SdkSupress:限制这个测试运行在低于给定的Android API level。举个例子,限制测试运行在API level低于18的环境下,使用注解 @SDKSupress(minSdkVersion=18)

  • @SmallTest@MediumTest,和@LargeTest:对测试需要的时间运行来分类,因此,可以决定是否可以经常运行该测试。

测试拆分

Test runner 支持把一个测试套件分割成多个碎片,所以你可以很简单地运行属于通过碎片分组的所有测试,并且它们使用同一个 Instrumentation 实例。每一个碎片都有一个索引编号(index number)作为它的唯一识别。当运行测试时,使用 -e numShards 选项来指定要创建的碎片的数量和 -e shardIndex 选项来指定哪些碎片运行。

举个例子,把一个测试套件分割成10个碎片,并且只运行被分组的测试中的第二个碎片,使用以下的命令:

adb shell am instrument -w -e numShards 10 -e shardIndex 2

这个 test runner 的更多相关学习,见 API reference

Espresso

Espresso 测试框架提供了一系列的API用于构建UI测试来测试app内用户流操作。这些API让你可以编写简洁可靠的自动化UI测试。Espresso非常适合用来编写白盒测试,其中测试代码的编写是利用了被测试app中程序代码实现细节。

Espresso测试框架的关键特性包括:

  • 提供了灵活的API用于匹配目标app中viewadapter。更多的信息,见 View 匹配

  • 大而全的 行为 api(action APIs) 用于自动化UI交互。更多的信息,见 行为 APIs

  • UI线程同步来提高测试可靠性。更多信息,见 UI 线程同步

需要 Android2.2(API level 8) 或者更高。

View 匹配

Espresso.onView() 方法可以让你访问目标app中的一个UI组件并与它交互。这个方法接收一个 Matcher 作为参数,然后根据我们给定的条件在view的层次结构中搜索出对应相符的View实例。你可以使用如下的条件来优化你的搜索结果:

  • View的类名
  • View内容的描述(content description
  • View的R.id
  • View显示的文本

举个例子,寻找一个ID为my_button的目标button,你可以如以下一样指定一个matcher:

onView(withId(R.id.my_button));

如果搜索是成功的,onView() 方法会返回一个可以让你执行用户行为和测试目标中对view断言的引用。

Adapter 匹配

在一个 AdapterView 的布局中,布局是在运行时根据children动态填充的。如果目标view是在 AdapterView 子类(比如ListView 或者 GridView)的布局中的,onView() 方法可能就不起作用了,因为当前加载的view层次结构可能只是layout的一个子集。

替代方案是使用 [Espresso.onData()] 方法去访问一个目标view元素。[Espresso.onData()] 方法返回一个可以让你执行用户行为和测试目标 AdapterView 中对元素断言的引用。

行为 APIs

典型的,你可以通过对app的用户界面执行一些用户交互来测试app。在你的测试中使用 ViewActions API 可以让你很容易地自动化这些行为。你可以通过以下方式执行这些UI交互:

  • View的点击

  • 滑动

  • 按键和按钮的按下

  • 输入文本

  • 打开一个链接

举个例子,模拟输入一个字符串数据并按下按钮来提交这个值,你可以像这样编写一个自动化测试脚本。 ViewInteraction.preform()DataInteraction.perform() 方法接收一个或者多个ViewAction 参数并且按照提供的顺序执行这些actions

// 在一个EditText中输入文本信息,然后关闭软键盘
onView(withId(R.id.editTextUserInput))
.perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); // 按下按钮来提交改变的文本
onView(withId(R.id.changeTextBt)).perform(click());

UI线程同步

在Android设备上测试可能由于时间的关系会随机性地失败。这个测试问题称为test flakiness(测试片状)。在Espresso之前,变通的办法是在测试中插入足够长的睡眠或者一段时间后超时,或者增加在操作失败之后保持重试的代码。Espresso测试框架会在Instrumentation和UI线程之间保持同步;这样就可以去掉之前因为时间问题使用的变通的方法,并且确保你测试的行为和断言运行更加可靠。

更多Espresso的相关学习,见 API reference针对单个App的UI测试 练习。

UI Automator

UI Automator测试框架提供了一系列的API来构建在用户app和系统app之间的UI测试。UI Automator APIs 允许你在测试设备中执行例如打开设置菜单或者launcher等操作。UI Automator 测试框架非常适合用来写黑盒测试,其中测试代码的编写不需要依赖于目标app的内部实现细节。

UI Automator测试框架的关键特性包括:

需要 Android4.3(API level 18) 或者更高。

UI Automator Viewer

uiautomatorviewer 工具提供了一个方便的GUI来扫描和分析当前在Android设备上显示的UI组件。你可以使用这些工具来检查layout层次结构和查看在设备前台可见的组件的属性。这个信息可以让你使用UI Automator创建更加细粒度的测试,比如创建一个匹配指定的可见性属性的UI选择器。

uiautomatorviewer 工具在 <android-sdk>/tools/ 目录下。

访问设备状态

UI Automator测试框架提供了一个 [UIDevice] 类在目标app运行的设备上访问和执行操作。你可以调用它的方法来访问如当前的设备定向活着显示尺寸等设备属性。 [UIDevice] 类也可以让你执行一些如下的行为:

  • 旋转设备

  • 按下 D-pad

  • 按下返回键、Home键、菜单键

  • 打开通知栏

  • 当前的窗口截图

举个例子,模拟按下Home按钮,调用 UiDevice.pressHome() 方法。

UI Automator APIs

UI Automator APIs 允许你在不需要知道目标app实现细节的情况下去编写强大的测试。你可以使用这些APIs来捕获和操作跨越多个app的UI组件:

  • UiCollection:枚举容器中的UI元素来计数,或者通过子元素的可见text或content-description属性来作为一个目标。

  • UiObject:代表在设备上一个可见的UI元素。

  • UiScrollable:对可滚动的UI容器中搜索UI元素提供支持。

  • UiSelector:代表一个设备上对一个或者多个目标UI元素的查询。

  • Configurator:允许你设置UI Automator测试的关键参数。

举个例子,下面的代码展示了怎么样去编写一个测试脚本来获取默认的app launcher:

// 初始化 UiDevice 实例
mDevice = UiDevice.getInstance(getInstrumentation()); // 在 HOME 按钮上执行一个短暂的按压
mDevice().pressHome(); // 通过匹配启动按钮的content-description来搜索一个UI组件
// 得到默认的launcher
UiObject allAppsButton = mDevice
.findObject(new UiSelector().description("Apps")); // 在得到的launcher 按钮上面执行一个点击
allAppsButton.clickAndWaitForNewWindow();

更多UI Automator相关学习,见 API reference多App的UI测试 练习。

Testing Support Library Setup

Android Testing Support Library package已经包含在最新版本的作为补充库、可在SDK Manager中下载的Android Support Repository中。

通过SDK Manager下载Android Support Repository:

  1. 启动 Android SDK Manager

  2. 在SDK Manager窗口,滚动到Packages列表的最底部,找到Extras目录,如果需要,把它展开显示它的内容。

  3. 找到 Android Support Repository 项。

  4. 点击 Install packages... 按钮。

下载完之后,工具把Support Repository文件安装在存在的Android SDK目录。库文件会被放置在你SDK目录的子目录中:<sdk>/extras/android/m2respository 目录。

Android Testing Support Library 类被放置在android.support.test包下面。

为了在你的Gradle项目中使用Android Testing Support Library,在你的build.gradle文件中增加如下依赖:

dependencies {
androidTestCompile 'com.android.support.test:runner:0.4'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

为了在你的Gradle项目中默认使用AndroidJUnitRunner作为默认的instrumentation runner,在你的build.gradle文件中指定这个依赖:

android {
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}

强烈推荐你与Android Studio IDE一起使用Android Testing Support Library。Android Studio提供了支持测试开发的功能,比如:

  • 灵活并基于Gradle构建系统,支持对你测试代码的依赖管理。

  • 单元和instrumented测试代码与你的app的源代码放置在单个项目结构中。

  • 支持从命令行或者GUI来部署和运行你的测试在虚拟或者物理设备中。

更多Android Studio相关和下载,见 下载Android Studio和SDK Tools

[Espresso.onData()]: http://developer.android.com/reference/android/support/test/espresso/Espresso.html#onData)

[UIDevice]: http://developer.android.com/reference/android/support/test/uiautomator/UiDevice.html

[Android]官网《Testing Support Library》中文翻译的更多相关文章

  1. [Android]官网《UI/Application Exerciser Monkey》中文翻译

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5049041.html 翻译自 Android Develope ...

  2. [Android]官网《monkeyrunner》中文翻译

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5050768.html 翻译自 Android Develope ...

  3. 对石家庄铁道大学官网UI设计的分析

    在这一周周一,老师给我们讲了PM,通过对PM的学习,我知道了PM 对项目所有功能的把握, 特别是UI.最差的UI, 体现了团队的组织架构:其次, 体现了产品的内部结构:最好, 体现了用户的自然需求.在 ...

  4. 一劳永逸搭建android开发环境(android官网reference sample api tutorial全下载)

    [摘要]本文简单介绍了android开发环境的搭建,重点介绍了SDK manager和AVD升级问题:并提供了android reference,sample,api,及docs的下载信息. [1]为 ...

  5. [Android开发教程]Android官网developer training中文版教程 - 1.1.1 创建一个Android项目

    本系列持续更新中.转载请注明来源. 前言:近期打算系统学习一下Android开发,发现Android官网上的developer training也是个非常好的学习资料,于是想到一边学习一边写一个中文版 ...

  6. android官网被封掉了,只好用这个网站进谷歌了!嘎嘎

         http://developer.android.com/sdk/index.html    这个可以进去,但是必须是搜狐 .360,uc都不用特意FQ     http://173.1 ...

  7. android官网被封掉了,仅仅好用这个站点进谷歌了!嘎嘎

         http://developer.android.com/sdk/index.html    这个能够进去.可是必须是搜狐 .360,uc都不用特意FQ     http://173.1 ...

  8. android 官网处理图片 代码

    /** * 获取压缩后的图片 (官网大图片加载对应代码) * * @param res * @param resId * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param ...

  9. android官网文档学习笔记

    1.android的四大组件的了大概功能 activity:负责显示界面,和用户交互. service:运行在后台. content provider:为程序app之间的数据访问提供接口. broad ...

随机推荐

  1. mysql管理知识点

    mysql是完全开原的关系型数据库,在web后端用的比较多,经典的架构有LAMP,LNMP,其中的M就指mysql. 一:安装 新版的linux里默认的已经不是mysql,而是他的一个分支mariad ...

  2. 只用一行代码让你的ASP.NET MVC 跑起来

    只用一行代码让你的ASP.NET MVC 跑起来 MVC框架一直是企业开发绕不过去的东西,先是JavaEE的 Structs, 然后是 Spring MVC, 再到我们今天要讨论的ASP.NET MV ...

  3. 【转】FastCgi与PHP-fpm关系

    刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. ...

  4. Windows Azure Cloud Service (38) 微软IaaS与PaaS比较

    <Windows Azure Platform 系列文章目录> 最近一直想总结Azure IaaS和PaaS的区别与比较,写个博文详细说明一下.建议读者在阅读之前,先熟悉微软PaaS和Ia ...

  5. SQL Server代理(6/12):作业里的工作流——深入作业步骤

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这里系列的前几篇文章所见,SQL ...

  6. SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: .row_number .rank .dense_rank .ntile 下面分别介绍一下这四个 ...

  7. 一道java算法题分析

    最近在面试中遇到这样的一道算法题:       求100!的结果的各位数之和为多少?       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...

  8. IOS系统概述与层次

    一.概述 IOS是apple公司为其自己的移动设备(iPhone,iPod touch,iPad)而开发的操作系统,IOS许多的技术是基于苹果的Mac OSX桌面系统的,如果你开发过苹果的mac系统应 ...

  9. C# POST Https请求的一些坑

    写在前面: 从上次,跟合作方的站点对接开始就产生了这个问题,当时用C#进行POST提交,总是会出现问题,找了很久发现对方的站点居然是TLS 1.2 的. 正文: 然而,在.NET FrameWork ...

  10. Java 读取Properties文件时应注意的路径问题

    1. 使用Class的getResourceAsStream()方法读取Properties文件(资源文件)的路径问题:  InputStream in = this.getClass().getRe ...