文章目录
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
对象或您自己的自定义对象来缩小视图范围。
// r.id 唯一
onview(withid(r.id.xxx))
// r.id 不唯一
onview(allof(withid(r.id.xxx), withtext("hello")))
4.2 对视图执行操作
- 找到适合目标视图的匹配器后,可以使用
perform
方法对该视图执行viewaction
实例。
// 一次 perform 调用来执行单项操作
onview(...).perform(click())
// 一次 perform 调用来执行多项操作
onview(...).perform(typetext("hello"), click())
4.3 检查视图断言
// 检查视图是否包含文本 "hello!"
onview(...).check(matches(withtext("hello!")))
4.4 点击按钮
// 执行某个按钮的点击
onview(withid(r.id.xxx)).perform(click())
4.5 验证 textview 文本
// 验证 testview 文本内容
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>()))
}
发表评论