使用 Espresso Test Recorder 创建 UI 测试

Espresso Test Recorder 工具让您无需编写任何测试代码即可为应用创建 UI 测试。通过录制测试场景,您可以记录与设备的交互,并添加断言来验证应用特定快照中的 UI 元素。随后,Espresso Test Recorder 会获取保存的录制内容,并自动生成相应的 UI 测试,供您运行以测试您的应用。

Espresso Test Recorder 基于 Espresso 测试框架(AndroidX Test 中的一个 API)编写测试。Espresso API 鼓励您基于用户操作创建简洁且可靠的 UI 测试。通过陈述预期、交互和断言,而无需直接访问底层应用的 Activity 和视图,这种结构可以防止测试不稳定,并优化测试运行速度。

关闭测试设备上的动画

在使用 Espresso Test Recorder 之前,请务必关闭测试设备上的动画,以防出现意外结果。请遵循 Espresso 设置说明,但请注意,您无需手动设置 Espresso 库的依赖项引用,因为当您保存录制内容时,Test Recorder 会自动完成此操作。这些步骤对于给定的项目只需执行一次。

录制 Espresso 测试

Espresso 测试包含两个主要部分:UI 交互和对 View 元素的断言。UI 交互包括用户可能用来与应用进行交互的“点击”和“输入”等操作。断言用于验证屏幕上视觉元素的存在性或内容。例如,针对 Notes 测试应用的 Espresso 测试可能包含用于点击按钮和编写新笔记的 UI 交互,但会使用断言来验证按钮是否存在以及笔记的内容。

本节将介绍如何使用 Espresso Test Recorder 创建这两个测试组件,以及如何保存录制内容以生成测试。

录制 UI 交互

要使用 Espresso Test Recorder 开始录制测试,请按以下步骤操作:

  1. 点击 Run > Record Espresso Test
  2. Select Deployment Target(选择部署目标)窗口中,选择要在其上录制测试的设备。如有必要,可创建新的 Android 虚拟设备 (AVD)。点击 OK
  3. Espresso Test Recorder 会触发项目构建,且应用必须先安装并启动,Espresso Test Recorder 才能允许您与其交互。应用启动后,Record Your Test(录制您的测试)窗口随即出现。由于您尚未与设备进行交互,主面板会显示“No events recorded yet”(尚未录制事件)。与您的设备进行交互,即可开始记录“点击”和“输入”等事件。

注意:在开始记录交互之前,您可能会在设备上看到一个显示“Waiting for Debugger”(正在等待调试器)或“Attaching Debugger”(正在附加调试器)的对话框。Espresso Test Recorder 使用调试器来记录 UI 事件。当调试器附加完成后,该对话框会自动关闭;请勿点击 Force Close(强制关闭)。

录制的交互将出现在 Record Your Test 窗口的主面板中,如下图 1 所示。当您运行测试时,Espresso 测试将尝试按相同的顺序执行这些操作。

图 1. 带有已记录 UI 交互的 Record Your Test 窗口。

添加断言以验证 UI 元素

断言通过以下三种主要类型来验证 View 元素的存在性或内容:

  • text is:检查所选 View 元素的文本内容。
  • exists:检查 View 元素是否出现在屏幕上可见的当前视图层次结构中。
  • does not exist:检查 View 元素是否未出现在当前视图层次结构中。

要向测试添加断言,请按以下步骤操作:

  1. 点击 Add Assertion(添加断言)。Espresso 获取 UI 层次结构及有关当前应用状态的其他信息时,会显示 Screen Capture(屏幕截图)对话框。一旦 Espresso 完成截图,对话框就会自动关闭。
  2. 当前屏幕的布局会显示在 Record Your Test 窗口右侧的面板中。要选择要在其上创建断言的 View 元素,请点击截图中的元素,或使用窗口底部 Edit assertion(编辑断言)框中的第一个下拉菜单。所选的 View 对象会以红色框突出显示。
  3. Edit assertion 框中的第二个下拉菜单中选择您要使用的断言。Espresso 会在该菜单中填充适用于所选 View 元素的有效断言。
    • 如果您选择了“text is”断言,Espresso 会自动插入当前 View 元素内部的文本。您可以使用 Edit assertion 框中的文本字段编辑文本,以匹配您想要的断言。
  4. 点击 Save and Add Another(保存并添加另一个)以创建更多断言,或点击 Save Assertion(保存断言)以关闭断言面板。

图 2 中的截图显示了一个正在创建的“text is”断言,用于验证笔记的标题是否为“Happy Testing!”

图 2. 选中 View 元素(红色)后的 Edit assertion 框。

在创建断言时,即使断言面板仍在 Record Your Test 窗口中打开,您也可以继续与应用进行交互。Espresso Test Recorder 将继续记录您的操作,但在保存断言后,您正在编辑的断言将出现在这些交互之前。断言的截图也会保留您点击 Add Assertion 按钮时设备或模拟器所呈现的布局。

保存录制内容

完成应用交互并添加断言后,请按照以下步骤保存录制内容并生成 Espresso 测试:

  1. 点击 Complete Recording(完成录制)。Pick a test class name for your test(为测试选择类名)窗口随即出现。
  2. Espresso Test Recorder 会根据启动的 Activity 名称,为您的测试在其包内生成一个唯一的名称。如果您想更改建议的名称,请使用 Test class name 文本字段。点击 Save(保存)。
    • 如果您尚未将 Espresso 依赖项添加到应用中,尝试保存测试时会出现 Missing Espresso dependencies(缺少 Espresso 依赖项)对话框。点击 Yes,自动将依赖项添加到您的 build.gradle 文件中。
  3. Espresso Test Recorder 生成文件后,该文件会自动打开,并且 Android Studio 会在 IDE 的 Project 窗口中选中该测试类。
    • 测试保存的位置取决于您的检测测试根目录的位置,以及启动的 Activity 的包名。例如,Notes 测试应用的测试会保存在您录制测试的应用模块的 src > androidTest > java > com.example.username.appname 文件夹中。

在本地运行 Espresso 测试

要运行 Espresso 测试,请使用 Android Studio IDE 左侧的 Project 窗口:

  1. 打开所需的应用模块文件夹,导航到您要运行的测试。测试的位置取决于您的检测测试根目录的位置和启动的 Activity 的包名。以下示例展示了 Notes 测试应用的测试保存位置:
    • 如果您在该窗口中使用 Android 视图,请导航至 java > com.example.username.appname (androidTest)
    • 如果您在该窗口中使用 Project 视图,请在模块文件夹内导航至 src > androidTest > java > com.example.username.appname
  2. 右键点击测试,然后点击 Run ‘testName.’
    • 或者,您也可以打开测试文件,然后右键点击生成的测试类或方法。请阅读测试您的应用页面,详细了解如何运行测试。
  3. Select Deployment Target 窗口中,选择要在其上运行测试的设备。如有必要,可创建新的 Android 虚拟设备。点击 OK

在 IDE 底部的 Run 窗口中监控测试进度。Android Studio 会对您的项目进行完整构建,并在 Run 窗口中打开一个带有测试名称的选项卡,如图 3 所示。在此选项卡中,您可以检查测试是通过还是失败,以及测试运行所花费的时间。测试完成后,选项卡将记录“Tests ran to completion”(测试已运行完毕)。

图 3. 在本地运行 Espresso 测试后 Run 窗口中的示例输出。

要了解有关编写测试运行配置的更多信息,请阅读创建和编辑运行/调试配置中的“为类或方法定义测试配置”部分。

使用 Firebase Test Lab for Android 运行 Espresso 测试

您可以将 Espresso Test Recorder 生成的测试与 Firebase Test Lab 结合使用,以便在云端的数百种设备配置上测试您的应用。在 Spark 计划的每日免费配额内使用 Test Lab 测试应用无需付费。要使用 Firebase Test Lab 运行 Espresso 测试,请为您的应用创建 Firebase 项目,然后按照说明通过 Android Studio 运行您的 Firebase Test Lab 测试

图 4. 在多台设备上使用 Firebase Test Lab 运行测试后 Run 窗口中的示例输出。