[译] Android 上一次编写,随处测试

在今年的 Google I/O 大会上,我们推出了 AndroidX Test,作为 Jetpack 的一部分。今天,我们很高兴地宣布 v1.0.0 最终版本和 Robolectric v4.0 一起发布。作为 1.0.0 版本的一部分,所有 AndroidX Test 现在都是开源的

AndroidX Test 提供了跨测试环境的通用测试 APIs,包括仪器测试和 Robolectric 测试。它包括现有的 Android JUnit 4 支持,Espresso 视图交互库和几个新的密钥测试 APIs。这些 APIs 可用于在真实和虚拟设备上进行仪器测试。从 Robolectric 4.0 开始,它们也可用于本地 JVM 测试。

考虑以下使用情形,我们启动登录页面,输入正确的用户名和密码,并确保进入主屏幕。

@RunWith(AndroidJUnit4::class)
class LoginActivityTest {

  @Test fun successfulLogin() {
    // GIVEN
    val scenario = 
        ActivityScenario.launch(LoginActivity::class.java)

    // WHEN
    onView(withId(R.id.user_name)).perform(typeText(“test_user”))
    onView(withId(R.id.password))
        .perform(typeText(“correct_password”))
    onView(withId(R.id.button)).perform(click())

    // THEN
    assertThat(getIntents().first())
        .hasComponentClass(HomeActivity::class.java)
 }
}
复制代码

让我们逐步完成测试:

  1. 我们使用新的 ActivityScenario API 来启动 LoginActivity。它将会创建一个 activity,并进入用户可见并能够输入的 resumed 状态。ActivityScenario 处理与系统的所有同步,并为你应测试的常见场景提供支持,例如你的应用如何处理被系统销毁和重建。
  2. 我们使用 Espresso 视图交互库将文本输入到两个文本字段中,然后点击 UI 中的按钮。与 ActivityScenario 类似,Espresso 为你处理多线程和同步,并提供可读且流畅的 API 以创建测试。
  3. 我们使用新的 Intents.getIntents() Espresso API 来返回捕获的意图列表。然后,我们使用 IntentSubject.assertThat() 验证捕获的意图,这是新的 Android Truth 扩展框架的一部分。Android Truth 扩展框架提供了一个富有表现力和可读性的 API 来验证基本 Android 框架对象的状态。

这个测试可以在使用 Robolectric 或任何真实或虚拟设备的本地 JVM 上运行。

要在 Android 设备上运行它,请将它与以下依赖项一起放在 “androidTest” 资源根目录中:

androidTestImplementation(“androidx.test:runner:1.1.0”)
androidTestImplementation(“androidx.test.ext:junit:1.0.0”)
androidTestImplementation(“androidx.test.espresso:espresso-intents:3.1.0”)
androidTestImplementation(“androidx.test.espresso:espresso-core:3.1.0”)
androidTestImplementation(“androidx.test.ext:truth:1.0.0”)
复制代码

在真实或虚拟设备上运行可让你确信你的代码可以正确地与 Android 系统进行交互。但是,随着测试用例数量的增加,你开始牺牲测试执行时间。你可能决定只在真机上运行一些较大的测试,同时在模拟器上运行大量较小的单元测试,比如 Robolectric,它可以在本地 JVM 上更快地运行测试。

要使用 Robolectric 模拟器在本地 JVM 上运行测试用例,请将测试用例放在 “test” 资源根目录中,将以下代码添加到 gradle.build:

testImplementation(“androidx.test:runner:1.1.0”)
testImplementation(“androidx.test.ext:junit:1.0.0”)
testImplementation(“androidx.test.espresso:espresso-intents:3.1.0”)
testImplementation(“androidx.test.espresso:espresso-core:3.1.0”)
testImplementation(“androidx.test.ext:truth:1.0.0”)
testImplementation (“org.robolectric:robolectric:4.0”)

android {
    testOptions.unitTests.includeAndroidResources = true
}
复制代码

模拟器和仪器之间测试 apis 的统一提供了许多令人兴奋的可能性!我们在 Google I / O 上发布的 Nitrogen 项目将允许你在运行时环境之间无缝地切换测试。这意味着你将能够采用针对新的 AndroidX Test APIs 编写的测试用例,并在本地 JVM、真实或虚拟设备、甚至基于云的测试平台(如 Firebase 测试实验室)上运行它们。我们非常高兴有机会为开发人员提供有关其应用程序质量的快速、准确和可操作的反馈。

最后,我们很高兴的宣布所有的 AndroidX 组件是完全 开源 的,我们期待着你的贡献。

了解更多

文档:developer.android.com/testing

版本注释:

Robolectric: github.com/robolectric…

AndroidX Test: github.com/android/and…

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

Android livedata 源码解剖

本次推出 Android Architecture Components 系列文章,目前写好了四篇,主要是关于 lifecycle,livedata 的使用和...

19020
来自专栏李蔚蓬的专栏

Android AVD | (A small tip)重新创建一个新的(删除旧的)AVD模拟器,解决了大部分无语的AVD问题

老规矩,肯定是有什么东西需要更新一下; 经验取自上次经历:良心解析 | 搭建NDK环境历程及问题记录 暨 Android Studio 2...

13410
来自专栏木溪知识加油站

笔记——Window与WindowManager(十七)

>1.Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图都对应着附加在一个Window上的,...

11640
来自专栏Android-薛之涛

Android-AndroidX迁移及踩坑

大家都知道Android support library 28是google发布的最后一版android.support的库了,原因是google同时发布了an...

4.5K40
来自专栏木溪知识加油站

笔记——安卓消息机制Handler(十六)

1、定义:Android的消息机制主要是指Handler的运行机制,Handler并不是专门用于更新UI的,它只是常被开发者用来更新UI,是同一个进程中线程间的...

12440
来自专栏编码前线

Android插件化原理解析

在解决插件中组件的生命周期,通常的做法是通过 Hook相应的系统对象,实现欺上瞒下,后面将通过Activity的插件化来进行讲解。

25630
来自专栏Coding+

Android 集成第三方 WebView 内核

从这里下载最新版本 X5 SDK 导入 SDK 到项目 File->Project Structure->+->Import .JAR/.AAR Packa...

1.7K20
来自专栏开发之途

一个纯 Kotlin 的开源工具类App

这是一个纯 Kotlin 的项目,可以用于查看系统安装的所有应用的详细信息,包括应用包名、版本号、apk大小、首次安装时间、最后更新时间、apk路径、签名md5...

14620
来自专栏某熊的全栈之路

前端每周清单第 56 期: D3 5.0,深入 React 事件系统,SketchCode 界面生成

前端每周清单专注大前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关...

9520
来自专栏远在上海

H5端软键盘把footer底部导航栏顶上去了怎么解决?

这个问题是WebApp的通病,特别是用了BootStrap的底部导航栏,又用了input选中时自动移到合适位置,避免软键盘覆盖的时候,会特别明显。

74840

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励