Android Testing support Library 提供了一个强大的Android 应用测试框架。 library提供了一系列用以快速建立和运行测试代码的APIs,包括Junit4 和 功能性UI测试。支持从IDE或者命令行来使用这些APIs。
获取: 通过Android SDK Manager (Testing Support Library Setup)
这篇文章的主要内容:
- 说明了Android Testing Support Library 提供了哪些工具用以测试
- 如何在你的测试环境中使用AndroidTestRunner
- 关于支持库的发布信息
测试支持库 的 特性说明
Android 测试支持库包含以下自动化测试工具:
- AndroidJUnitRunner: Android 上使用的兼容Junit4 的Test Runner
- Espresso: UI测试框架;适用于应用内功能性UI测试(functional UI testing)
- UI Automator: UI测试框架;适用于跨APP 的功能性UI测试,跨越的APP既可以是第三方APP,也可以是系统APP
AndroidJUnitRunner
AndroidJUnitRunner
类是一个 JUnit 测试Runner,它允许你在Android 设备上运行JUnit4 或JUnit3 风格的测试类,这些测试类同时也包含那些使用Espresso 和 UI Automator 测试框架建立的测试类。 AndroidJUnitTestRunner 能安装测试包和被测APP 到设备,并且运行测试,报告测试结果。现在AndroidJUnitTestRunner 已经取代了只支持Junit3测试的InstrumentationTestRunner 的测试类。
AndroidJUnitTestRunner的主要功能包括:
- JUnit support - Junit支持
- Access to instrumentation information - 获取 Instrumention信息
- Test filtering - 测试过滤
- Test sharding - 测试分片
注: AndroidJUnitTestRunner 要求Android2.2(API level 8) 或者更高级别
JUnit 支持
AndroidJUnitTestRunner兼容JUnit3和JUnit4测试(最高支持到4.10)。但是,你最好避免将JUnit3 和 JUnit4 的测试代码放在同一个包下面,这将会导致不可预期的结果。注意如果你正在创建一个Instrumented JUnit4 测试类,那么你必须在测试类上使用@RunWith(AndroidJUnit4.class)
注解。
下面的代码片段展示了一个使用JUnit4 风格的Instrumented 测试来验证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();
// Injecting the Instrumentation instance is required
// for your test to run with AndroidJUnitRunner.
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void typeOperandsAndPerformAddOperation() {
// Call the CalculatorActivity add() method and pass in some operand values, then
// check that the expected value is returned.
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
}
访问instrumentation 信息
你可以使用 InstrumentationRegistry 类来获取和你运行的测试有关的信息。 这个类包含 Instrumentation
对象、目标App 的 Context 对象、测试App 的Context以及传递到你的测试的命令行参数。 当你使用UI Automator 框架编写依赖于Instrumentation 或者 Context 对象的测试用例时,这些信息将会非常有用。
测试过滤(Test filtering)
在你的JUnit 4.x 的测试中,你可以使用一些注解来配置运行的测试。 这些功能可以最大限度的减少你往测试代码中添加模板和条件代码的工作量。 在标准的JUnit 4 注解之外,AndroidJUnitTestRunner 还支持以下Android特有的注解:
- @RequiresDevice: 指定改测试只在物理设备上运行(而不是模拟器)
-
@SdkSupress: 禁止测试在低于给定API 级别的设备上运行。例如,禁止运行在API level低于18 的设备上运行时可以你写
SDKSupress(minSdkVersion=18)
测试分片 (Test sharding)
AndroidJUnitTestRunner 支持将一个测试套件(test suite) 分割成多个测试片,这样你就可以将属于同一个测试片的测试当做一个组一起运行, 当然,这些测试用例必须在同一个Instrumentation 实例下面。(,under the same Instumentation). 每个测试片使用一个数字索引标记。在运行测试时,可以使用 -e numShards
选项来指定要创建多少个测试片,使用 -e shardIndex
选项来指定要运行哪一个片的测试用例。
例如,为了将测试套件(test suite) 分割成为10片,并且只运行位于第二片的测试,你可以使用一下命令:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
你可以通过查看 API reference 来了解更多关于如何使用Android test runner 的信息。
Espresso 框架
Espresso 测试框架提供了一系列的APIS 用来构建单个应用内测试用户交互的UI测试用例。 它非常使用来了编写白盒类型的自动化测试用例,因为Espresso测试代码必须了解实现代码的细节。
Espresso 测试框架的主要特性包括:
- 一套丰富的视图和适配器(View and Adapter)匹配API。 查看 View matching 以了解更多信息。
- 一套用以进行自动化UI交互的action APIs。 查看 Action APIs 以了解更多。
- 用以提高测试可信度 的 UI 线程同步机制,查看 UI thread synchronization 以获取更多信息。
注: 需要Android2.2(API level 8) 或者更高版本
View matching
Espresso.onView()
使得你可以访问目标app 里的UI 组件并且与之交互。 该方法接收一个Matcher
参数,然后在视图层次树中定位到匹配到的对应的View实例。你可以使用的匹配条件有:
- view 的类名
- view 的 content description
- view 的
R.id
- view 上显示的文本
例如,为了定位到一个ID 为 my_button
的按钮,你可以指定如下的matcher:
onView(withId(R.id.my_button));
如果搜索成功,onView() 方法就会返回该View 的一个引用,然后你就可以执行actions 并且测试是否符合预期
Adapter matching - 适配器匹配
在一个 AdapterView
的布局中,布局是在运行时动态改变的。如果目标View 位于一个AdapterView 的子类中(如 ListView
或者 GridView),因为当前的视图层次中只加载了一部分布局View,那么onView() 方法将无法工作。
这时,你就可以使用 Espresso.onData()
方法来查找目标View 。该方法会返回AdapterView中的一个元素,然后你可以在该元素上进行 用户操作模拟和断言(assertions)操作。
Action APIs
一般你都是通过在你的app 的用户界面进行一些操作以测试你的应用。而使用ViewActions
API 你将可以非常容易的自动化这些交互操作。 使用这些API 你可以执行的UI操作如下:
- View click = 视图点击
- Swipe = 滑动
- Key and button presses = 按压按键和按钮
- Typing test = 输入文字
- Opeing a link =打开一个链接
例如,你可以编写一个测试脚本来模拟输入一个字符串并且按下一个按钮来提交输入的值的几个动作。 ViewInteraction.perform()
和 DataInteraction.perform()
接受一个或多个ViewAction
参数,并且按照提供他们的次序依次执行这些动作。
// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
.perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());
UI 线程同步
运行与android设备的测试经常会因为时间问题而随机失败。 这个问题 称之为 test flakiness。 在使用 Espresso之前,解决办法是在测试代码让测试sleep 足够长的时间,或者加入一个足够长的超时时间又或者添加失败时不停尝试的代码。 然而,Espresso 测试框架替你处理了Instrumentation
和 UI 线程间的同步问题,这将是你的测试action和测试断言更加具有可信度。
学习 API reference 和 Testing UI for a Single App 以了解更多.
说明:1. 所有链接指向原始链接; 2 . 部分名词保留英文
网友评论