Kaspresso
Kaspresso是一个Android UI测试框架。基于Espresso和UI Automator,Kaspresso提供了广泛的额外功能,例如:
- 内置防止不稳定测试的保护
- Jetpack Compose支持
- 原生方法的截图测试(支持深色模式)
- 编写测试的声明式方法
- 能够与其他应用程序、系统元素和界面交互
- 通过Kotlin DSL包装UiAutomator和Espresso实现人类可读性
- 详细的日志和报告(日志、视图层次结构、截图、视频等)
- ADB支持
- Allure支持
- Robolectric支持
- 从Espresso轻松迁移
- 灵活的配置选项
- 测试执行后自动提取产物
- 显著加快UI Automator命令的执行速度。使用Kaspresso,某些UI Automator命令的运行速度快10倍!
- 开箱即用的页面对象模式
还有更多!
集成
要将Kaspresso集成到您的项目中:
- 如果
mavenCentral
仓库不存在,请将其包含在您的根build.gradle
文件中:
allprojects {
repositories {
mavenCentral()
}
}
- 在
build.gradle
中添加依赖:
dependencies {
androidTestImplementation 'com.kaspersky.android-components:kaspresso:<最新版本>'
// Allure支持
androidTestImplementation "com.kaspersky.android-components:kaspresso-allure-support:<最新版本>"
// Jetpack Compose支持
androidTestImplementation "com.kaspersky.android-components:kaspresso-compose-support:<最新版本>"
}
要在官方发布之前尝试最新的kaspresso更新,请在您的build.gradle
中添加快照仓库
dependencyResolutionManagement {
repositories {
maven { url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots") }
}
}
要使用Kaspresso的快照版本,请在最新的Kaspresso版本后添加"-SNAPHOT"后缀,例如
dependencies {
androidTestImplementation 'com.kaspersky.android-components:kaspresso:<最新版本>-SNAPSHOT'
}
如果您仍在使用旧的Android Support库,我们强烈建议迁移到AndroidX。
使用Android Support库的最后一个版本是:
dependencies {
androidTestImplementation 'com.kaspersky.android-components:kaspresso:1.5.3'
}
常见问题
教程 新
为了更容易学习该框架,我们的网站上提供了一个分步教程我们的网站。
Kaspresso的功能
可读性
我们喜欢Kakao用于编写UI测试的语法。这个Espresso的包装器使用Kotlin DSL方法,使代码显著缩短并更易读。看看区别:
Espresso:
@Test
fun testFirstFeature() {
onView(withId(R.id.toFirstFeature))
.check(ViewAssertions.matches(
ViewMatchers.withEffectiveVisibility(
ViewMatchers.Visibility.VISIBLE)))
onView(withId(R.id.toFirstFeature)).perform(click())
}
Kakao:
@Test
fun testFirstFeature() {
mainScreen {
toFirstFeatureButton {
isVisible()
click()
}
}
}
我们使用相同的方法开发了我们自己的UI Automator包装器,我们称之为Kautomator。看看下面的代码:
UI Automator:
val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
val uiDevice = UiDevice.getInstance(instrumentation)
val uiObject = uiDevice.wait(
Until.findObject(
By.res(
"com.kaspersky.kaspresso.sample_kautomator",
"editText"
)
),
2_000
)
uiObject.text = "Kaspresso"
assertEquals(uiObject.text, "Kaspresso")
Kautomator:
MainScreen {
simpleEditText {
replaceText("Kaspresso")
hasText("Kaspresso")
}
}
由于Kakao和Kautomator提供了几乎相同的API,您不必关心测试底层是Espresso还是UI Automator。使用Kaspresso,您可以以相同的风格为两者编写测试。
然而,Kakao和Kautomator本身并不能帮助您看到测试与相应测试用例之间的关系。此外,长测试通常会变成一大段无法拆分成更小部分的代码。 这就是为什么我们创建了一个额外的Kotlin DSL,让您更容易阅读您的测试。
请看下面的示例:
@Test
fun shouldPassOnNoInternetScanTest() =
beforeTest {
activityTestRule.launchActivity(null)
// 一些状态相关的操作
}.afterTest {
// 一些状态相关的操作
}.run {
step("打开简单界面") {
MainScreen {
nextButton {
isVisible()
click()
}
}
}
step("点击按钮1并检查按钮2") {
SimpleScreen {
button1 {
click()
}
button2 {
isVisible()
}
}
}
step("点击按钮2并检查编辑框") {
SimpleScreen {
button2 {
click()
}
edit {
flakySafely(timeoutMs = 7000) { isVisible() }
hasText(R.string.text_edit_text)
}
}
}
step("检查编辑框的所有可能性") {
scenario(
CheckEditScenario()
)
}
}
稳定性
有时你的UI测试可能连续通过十次,但在第十一次尝试时却因某些神秘原因失败。这被称为不稳定性。
导致不稳定性最常见的原因是UI测试库(如Espresso和UI Automator)本身的不稳定性。为了消除这种不稳定性,Kaspresso使用了DSL封装和拦截器。
拦截器
我们在Kakao/Kautomator拦截器的基础上开发了Kaspresso行为拦截器来捕获失败。
借助拦截器,你可以做很多有用的事情,比如:
- 为每个框架操作添加自定义动作,如写日志或截图;
- 通过重新运行失败的操作、滚动父布局或关闭Android系统对话框来克服不稳定的操作;
以及更多(参见手册)。
编写可读性强的日志
Kaspresso会编写自己的日志,详细且易读:
能够执行ADB命令
Espresso和UI Automator不允许从测试内部调用ADB命令。为了解决这个问题,我们开发了AdbServer(参见wiki)。
能够操作Android系统
你可以使用Kaspresso类来操作Android系统。
例如,使用Device
类,你可以:
- 推送/拉取文件,
- 启用/禁用网络,
- 像用户一样授予权限,
- 模拟电话呼叫,
- 截屏,
- 启用/禁用GPS,
- 设置地理位置,
- 启用/禁用无障碍功能,
- 更改应用语言,
- 收集和解析logcat输出。
(更多信息请参见Device类)。
功能截图
如果你开发的应用在全球范围内可用,你必须将其本地化为不同的语言。当UI被本地化时,译者看到单词或短语的上下文(即特定屏幕)很重要。
使用Kaspresso,译者可以自动截取任何屏幕的截图。这非常快速,即使对于旧屏幕也是如此,而且你不需要重构或模拟任何东西(参见手册)。
可配置性
你可以调整Kaspresso的任何部分(阅读更多信息)。
Robolectric支持
你可以在JVM环境中运行你的UI测试。此外,几乎所有改善稳定性、可读性等的拦截器都将发挥作用。 阅读更多信息。
Allure支持
Kaspresso可以为每个测试生成非常详细的Allure报告: 更多信息可在此处获得。
Jetpack Compose支持
现在,你可以为Jetpack Compose屏幕编写Kaspresso测试了!DSL和所有原则都是相同的。 因此,你不会看到View屏幕测试和Compose屏幕测试之间的任何差异。 更多信息可在此处获得。
示例
所有示例都可以在samples文件夹中找到。
大多数示例都需要AdbServer。要启动AdbServer,你应该执行以下步骤:
- 进入
Kaspresso
文件夹
cd ~/Workspace/Kaspresso
- 启动
adbserver-desktop.jar
java -jar artifacts/adbserver-desktop.jar
现有问题
Kaspresso中的所有现有问题都可以在这里找到。
重大变更
重大变更可以在这里找到
贡献
Kaspresso是一个开源项目,所以欢迎你贡献(参见贡献指南)。
许可证
Kaspresso基于Apache License, Version 2.0提供。