自动化界面测试

测试用户互动有助于确保用户在与您的应用互动时不会遇到意外结果或糟糕体验。如果您需要验证应用的界面是否正常运行,您应该养成创建界面 (UI) 测试的习惯。

界面测试的一种方法是让测试人员对目标应用执行一系列用户操作,并验证其行为是否正常。不过,这种人工方法可能非常耗时且容易出错。一种更高效的方法是编写界面测试,以便以自动化方式执行用户操作。通过自动化方法,您能以可重复的方式快速可靠地运行测试。

界面测试会启动应用(或应用的某一部分),然后模拟用户互动,最后检查应用响应是否适当。它们属于集成测试,范围涵盖验证小型组件的行为、验证遍历整个用户流的大型导航测试。它们可用于检查回归问题以及验证与不同 API 级别和实体设备的兼容性。

Android Studio 中的插桩界面测试

如需使用 Android Studio 运行插桩界面测试,请在单独的 Android 测试文件夹 src/androidTest/java 中实现测试代码。Android Plugin for Gradle 会根据测试代码构建一个测试应用,然后在目标应用所在的设备上加载测试应用。在测试代码中,您可以使用界面测试框架来模拟目标应用上的用户互动,以便执行涵盖特定使用场景的测试任务。

Jetpack 框架

Jetpack 包含各种框架,这些框架提供用于编写界面测试的 API:

  • Espresso 测试框架(Android 4.0.1,API 级别 14 或更高版本)提供了用于编写界面测试的 API,以模拟用户在单个目标应用中与 View 的互动。使用 Espresso 的主要优势在于,它可以自动同步测试操作与您测试的应用界面。Espresso 会检测主线程何时处于空闲状态,以便能够在适当的时间运行测试命令,提高测试的可靠性。
  • Jetpack Compose(Android 5.0,API 级别 21 或更高版本)提供了一组测试 API,用于启动 Compose 屏幕和组件并与之交互。与 Compose 元素的交互会与测试同步,并且可以完全控制时间、动画和重组。
  • UI Automator(Android 4.3,API 级别 18 或更高级别)是一个界面测试框架,适合跨系统和已安装应用进行跨应用功能界面测试。借助 UI Automator API,您可以执行在测试设备上打开“设置”菜单或应用启动器等操作。
  • 借助 Robolectric(Android 4.1,API 级别 16 或更高版本),您可以创建在常规 JVM 中的工作站或持续集成环境中运行的本地测试,而不是在模拟器或设备上运行。它可以使用 Espresso 或 Compose 测试 API 与界面组件进行交互。

不稳定和同步

移动应用和框架的异步性质通常使得编写可靠且可重复的测试变得非常困难。注入用户事件时,测试框架必须等待应用完成对该事件的响应,这可以从更改屏幕上的某些文本到完全重新创建 activity。如果测试没有确定性行为,就会出现不稳定行为。

Compose 或 Espresso 等现代框架在设计时就考虑到了测试,因此可以保证在下一个测试操作或断言之前界面将处于空闲状态。这就是同步

测试同步

当您运行测试不知道的异步或后台操作(例如从数据库加载数据或显示无限动画)时,仍可能会出现问题。

显示通过测试通过前检查应用是否处于空闲状态的循环的流程图
图 1:测试同步。

为了提高测试套件的可靠性,您可以安装一种跟踪后台操作的方法,例如 Espresso 空闲资源。此外,您可以替换模块,以测试可查询空闲性或改进同步的版本,例如用于协程的 TestDispatcher 或用于 RxJava 的 RxIdler

显示等待固定时间即执行同步时测试失败的示意图
图 2:在测试中使用休眠会导致测试速度缓慢或不稳定。

架构和测试设置

应用的架构应允许测试替换它的某些部分以测试替身,并且您应使用提供实用程序来帮助进行测试的库。例如,您可以将数据存储区模块替换为为测试提供虚假的确定性数据的内存中版本。

生产和测试架构图。生产图显示了为存储库提供数据的本地和远程数据源,而存储库又会异步向界面提供数据。测试图显示了一个虚构仓库,该仓库将其数据同步提供给界面。
图 3:通过将界面的依赖项替换为虚构实例来测试界面。

建议您使用依赖项注入来启用此功能。您可以手动创建自己的系统,但我们建议您使用 Hilt 等 DI 框架。

为什么要自动进行测试?

Android 应用可以针对数以千计的不同设备,提供多种 API 级别和外形规格,而操作系统为用户提供的定制化程度较高意味着您的应用在某些设备上可能无法正确呈现甚至崩溃。

通过界面测试,您可以执行兼容性测试,验证应用在不同环境中的行为。您可能希望在具有以下差异的设备上运行界面测试:

  • API 级别:21、25 和 30。
  • 语言区域:英语、阿拉伯语和中文。
  • 方向:纵向、横向。

此外,应用应检查手机以外的行为。您应该在平板电脑、可折叠设备和其他设备上进行测试。

其他资源

如需详细了解如何创建界面测试,请参阅以下资源。

文档

Codelab