【单元测试】Android Espresso 使用解析(3.1.0 版本)

1 简介

  • EspressoGoogle 推出来的一款提供给 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 中显示的数据进行交互的接口。
  • RecyclerViewActionsViewActionRecyclerView 交互的接口。
  • 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>()))
}

5、参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值