如下内容为原创,欢迎转载,转载请注明
来自每天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html
html
翻译自 Android Developer 官网:http://developer.android.com/tools/testing-support-library/index.htmljava
Android Testing Support Library
为Android app的测试提供了一个普遍的框架。 这个库提供了一系列的API可让你快速build和run你app的代码,它包括了JUnit 4
和功能性的用户界面(UI)测试。你能够经过Android Studio IDE或者命令行的方式运行你使用这些API建立的测试。android
Android Testing Support Library
已经能够经过Android SDK Manager
下载使用了。详情可见Testing Support Library Setupshell
这页中会提供一些关于Android Testing Support Library
中所提供的工具的信息,怎样在你的测试环境中使用它们,还有库发布的相关信息。api
Android Testing Support Library
提供包括了如下自动化测试工具:app
AndroidJUnitRunner:兼容Android的JUnit 4。框架
Espresso:UI测试框架,适用于app内的功能性UI测试。工具
UI Automator:UI测试框架,适用于系统和安装app间跨app的功能性UI测试。布局
AndroidJUnitRunner 类是一个 JUnit 测试runner,它可让你在Android设备上运行JUnit 3
或者JUnit 4-style
的测试类,包括使用了 Espresso 和 UI Automator 测试框架的。test runner
处理的事情有 加载你的测试package和须要在设备上测试的app,运行你的测试,还有报告测试结果。这个类会替换掉只支持JUnit 3
测试的InstrumentationTestRunner类。学习
这个test runner
的关键特性包括:
须要 Android2.2(API level 8) 或者更高。
Rest runner
兼容JUnit 3
和JUnit 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(); } }
你可使用 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 测试框架提供了一系列的API用于构建UI测试来测试app内用户流操做。这些API让你能够编写简洁可靠的自动化UI测试。Espresso很是适合用来编写白盒测试,其中测试代码的编写是利用了被测试app中程序代码实现细节。
Espresso测试框架的关键特性包括:
提供了灵活的API用于匹配目标app中view
和adapter
。更多的信息,见 View 匹配
大而全的 行为 api
(action APIs) 用于自动化UI交互。更多的信息,见 行为 APIs
UI线程同步来提升测试可靠性。更多信息,见 UI 线程同步
须要 Android2.2(API level 8) 或者更高。
Espresso.onView()
方法可让你访问目标app中的一个UI组件并与它交互。这个方法接收一个 Matcher
做为参数,而后根据咱们给定的条件在view的层次结构中搜索出对应相符的View
实例。你可使用以下的条件来优化你的搜索结果:
content description
)R.id
举个例子,寻找一个ID为my_button
的目标button,你能够如如下同样指定一个matcher:
onView(withId(R.id.my_button));
若是搜索是成功的,onView()
方法会返回一个可让你执行用户行为和测试目标中对view断言的引用。
在一个 AdapterView
的布局中,布局是在运行时根据children动态填充的。若是目标view是在 AdapterView
子类(好比ListView
或者 GridView
)的布局中的,onView()
方法可能就不起做用了,由于当前加载的view层次结构可能只是layout的一个子集。
替代方案是使用 Espresso.onData()
方法去访问一个目标view元素。Espresso.onData()
方法返回一个可让你执行用户行为和测试目标 AdapterView
中对元素断言的引用。
典型的,你能够经过对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());
在Android设备上测试可能因为时间的关系会随机性地失败。这个测试问题称为test flakiness(测试片状)。在Espresso以前,变通的办法是在测试中插入足够长的睡眠或者一段时间后超时,或者增长在操做失败以后保持重试的代码。Espresso测试框架会在Instrumentation
和UI线程之间保持同步;这样就能够去掉以前由于时间问题使用的变通的方法,而且确保你测试的行为和断言运行更加可靠。
更多Espresso的相关学习,见 API reference 和 针对单个App的UI测试 练习。
UI Automator测试框架提供了一系列的API来构建在用户app和系统app之间的UI测试。UI Automator APIs 容许你在测试设备中执行例如打开设置菜单或者launcher等操做。UI Automator 测试框架很是适合用来写黑盒测试,其中测试代码的编写不须要依赖于目标app的内部实现细节。
UI Automator测试框架的关键特性包括:
检查layout层次结构的Viewer。更多信息,见 UI Automator Viewer
。
一个用于在目标设备上获取状态信息和执行操做的API。更多信息,见 访问设备状态
跨app的UI测试APIs。更多信息,见 UI automator APIS
须要 Android4.3(API level 18) 或者更高。
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 容许你在不须要知道目标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测试 练习。
Android Testing Support Library package已经包含在最新版本的做为补充库、可在SDK Manager中下载的Android Support Repository中。
经过SDK Manager下载Android Support Repository:
在SDK Manager窗口,滚动到Packages列表的最底部,找到Extras
目录,若是须要,把它展开显示它的内容。
找到 Android Support Repository 项。
点击 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。