1 简介
Espresso
是 Google
推出来的一款提供给 Android
进行 UI
自动化测试的框架,其目标用户主要是针对开发人员。
2 依赖
2.1 设置测试环境
- 为了避免测试不稳定,我们强烈建议您在用于测试的虚拟或物理设备上关闭系统动画。在您的设备上,在设置 > 开发者选项下,停用以下三项设置:
- (1)窗口动画缩放;
- (2)过渡动画缩放;
- (3)
Animator
时长缩放。
2.2 添加 Espresso 依赖项
// app/build.gradle
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// 测试选项
testOptions {
unitTests {
includeAndroidResources=true
}
}
}
dependencies {
def espresso_version = "3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-web:$espresso_version"
androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$espresso_version"
androidTestImplementation "androidx.test.espresso:espresso-idling-resource:$espresso_version"
}
2.3 设置插桩测试运行程序
// app/build.gradle
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
2.4 关闭收集分析数据
Espresso
为了确保每个新版本都在正确的轨道上,测试运行程序会收集分析数据。更具体地说,它会针对每次调用上传被测应用的软件包名称的哈希值,这样就可以使用 Espresso
来衡量独特软件包数以及使用量。- 如果不希望上传此数据,则可以通过在插桩测试命令中添加
disableAnalytics
参数来停用此功能:
adb shell am instrument -e disableAnalytics true
2.5 Gradle 命令行运行
3 Espresso API
Espresso
:用于与视图交互(通过 onView()
和 onData()
)的入口点。此外,还公开不一定与任何视图相关联的 API
,如 pressBack()
。ViewActions
:可以传递给 ViewInteraction.perform()
方法的 ViewAction
对象的集合,例如 click()
。DataInteraction
:与 AdapterViews
中显示的数据进行交互的接口。RecyclerViewActions
:ViewAction
与 RecyclerView
交互的接口。ViewMatchers
:实现 Matcher<? super View>
接口的对象的集合。您可以将其中一个或多个对象传递给 onView()
方法,以在当前视图层次结构中找到某个视图。ViewAssertions
:可以通过 ViewInteraction.check()
方法传递的 ViewAssertion
对象的集合。在大多数情况下,您将使用 matches
断言,它使用视图匹配器断言当前选定视图的状态。ViewInteraction
:提供对视图执行操作或断言的主要接口。ViewMatchers
:与 View
匹配的 hamcrest
匹配器的集合。- 更详细的 API 描述请点击此查看
4 Espresso 常规使用
4.1 查找视图
Espresso
允许您使用现有的 ViewMatcher
对象或您自己的自定义对象来缩小视图范围。
onView(withId(R.id.xxx))
onView(allOf(withId(R.id.xxx), withText("Hello")))
4.2 对视图执行操作
- 找到适合目标视图的匹配器后,可以使用
perform
方法对该视图执行 ViewAction
实例。
onView(...).perform(click())
onView(...).perform(typeText("Hello"), click())
4.3 检查视图断言
onView(...).check(matches(withText("Hello!")))
4.4 点击按钮
onView(withId(R.id.xxx)).perform(click())
4.5 验证 TextView 文本
onView(withId(R.id.xxx)).check(matches(withText("Hello Espresso!")))
4.6 断言视图未显示
onView(withId(R.id.xxx)).check(matches(not(isDisplayed())))
4.7 断言视图不存在
onView(withId(R.id.xxx)).check(doesNotExist())
4.8 自定义故障处理程序
- 将
Espresso
中的默认 FailureHandler
替换为自定义故障处理程序后,可以进行其他或不同的错误处理,如截取屏幕截图或传递额外的调试信息。
private class CustomFailureHandler(targetContext: Context): FailureHandler {
private val delegate: FailureHandler
init {
delegate = DefaultFailureHandler(targetContext)
}
override fun handle(error: Throwable, viewMatcher: Matcher<View>) {
try {
delegate.handle(error, viewMatcher)
} catch (e: NoMatchingViewException) {
throw MySpecialException(e)
}
}
private class MySpecialException(cause: Throwable?): java.lang.RuntimeException(cause)
}
- 此故障处理程序抛出
MySpecialException
而不是 NoMatchingViewException
,并将其他所有故障的处理委托给 DefaultFailureHandler
。您可以在测试的 setUp()
方法中向 Espresso
注册 CustomFailureHandler
:
@Throws(Exception::class)
override fun setUp() {
super.setUp()
getActivity()
setFailureHandler(CustomFailureHandler(ApplicationProvider.getApplicationContext<Context>()))
}
5、参考文献