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

来自天天博客: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. CSS 魔法系列:纯 CSS 绘制图形(各种形状的钻石)

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  2. td中绝对定位div的垂直居中问题

    一.需求 典型的注册页面设计一般是一个三列多行的表格,左列为表单项label,中列为文本框,右列为填写说明和验证提示.如下图 因为整个表单的视觉重心在左中两列,所以在考虑表单整体相对页面水平居中和注册 ...

  3. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  4. linux专题一之文件管理(目录结构、创建、查看、删除、移动)

    在linux系统中一切都是文件./ 在linux中为根目录,是一切文件的根目录.本文将通过linux系统的目录结构和与linux文件操作有关的相关命令(touch.mkdir.cp.mv.mv.les ...

  5. SQL Server获取下一个编码字符实现继续重构与增强

        我在SQL Server获取下一个编码字符实现的博文中,虽然实现了这个问题,但是感觉维护起来比较麻烦,例如如果调整编码字符串的固定长度,就需要变更三个函数,这样的为何成本确实比较大.面向对象编 ...

  6. 用2263份证件照图片样本测试how-old.net的人脸识别

    上一年也就是这个时候微软根据自己的人脸识别API推出了一个识别照片中人脸年龄和性别的网站--http://how-old.net,小伙伴们各种玩耍,一年后的今天突发"奇想"地想测试 ...

  7. ASP.NET MVC系列:从Controller访问Model数据

    在项目解决方案中,添加一个MoviesController控制器,选择对应的模板,和模型类以及数据上下文:关于如何添加模型类和数据上下文,我们在ASP.NET MVC系列:添加模型中已经介绍过

  8. Linux下快速设定ip bond

    在计算机网路普及的初期,很多OS系统都使用的为单网卡方式,即一个网卡使用一个IP地址.随着网络要求的不断提高,我们可以对多个网卡进行绑定聚合当一个逻辑网络接口来使用,从而大幅提升服务器的网络吞吐(I/ ...

  9. .net项目引用C++ 动态链接库.dll

    项目开发时可能需要调用其动态链接库,如C++动态链接库,实现相应功能,那么在C#里怎么调用C++库里的方法呢,如下提供两种方式. 方式一:建立一个C++项目,选择dll动态链接库如下. //stdaf ...

  10. TSwitch 中文简繁显示支持(XE6 Android)

    说明: XE6 的 TSwitch 做了很多改进,包含多语显示处理,但 XE6 似乎只认定一种中文语系「zh」,它无法处理「zh_TW」.「zh_CN」.「zh_HK」.「zh_SG」等语系,不过可以 ...