在 Android Studio 中测试

Android Studio 旨在简化测试流程。它包含许多功能,可以简化您创建、运行和分析测试的方式。您可以设置在本地机器上运行的测试,也可以设置在设备上运行的插桩测试 (instrumented tests)。您可以轻松地在单台或多台设备上运行单个测试或特定的一组测试。测试结果会直接显示在 Android Studio 中。

图 1. 显示测试结果概览的 Android Studio。

本页面介绍如何在 Android Studio 中管理测试。如需了解如何编写自动化 Android 测试,请参阅在 Android 上测试应用

测试类型和位置

测试的位置取决于您编写的测试类型。Android 项目为本地单元测试和插桩测试提供了默认的源代码目录。

本地单元测试位于 module-name/src/test/java/。这些测试在您机器的本地 Java 虚拟机 (JVM) 上运行。当您的测试没有 Android 框架依赖项,或者可以为 Android 框架依赖项创建测试替身 (test doubles) 时,请使用这些测试来缩短执行时间。有关如何编写本地单元测试的更多信息,请参阅构建本地单元测试

插桩测试位于 $module-name/src/androidTest/java/。这些测试在硬件设备或模拟器上运行。它们可以访问 Instrumentation API,这些 API 使您能够访问有关正在测试的应用的信息(例如 Context 类),并允许您从测试代码中控制被测应用。插桩测试被构建到一个单独的 APK 中,因此它们拥有自己的 AndroidManifest.xml 文件。该文件是自动生成的,但您可以在 $module-name/src/androidTest/AndroidManifest.xml 处创建自己的版本,它将与生成的清单文件合并。在编写集成测试和功能性 UI 测试以自动执行用户交互,或者当您的测试具有无法为其创建测试替身的 Android 依赖项时,请使用插桩测试。有关如何编写插桩测试的更多信息,请参阅构建插桩测试自动化 UI 测试

您可以将测试放置在特定于构建变体 (build variant) 的目录中,以仅测试特定的构建变体。例如,您可以将一些本地单元测试放置在 $module-name/src/testMyFlavor/java/ 中,以便测试针对使用该变体源代码构建的应用。有关如何创建这些定制测试的更多信息,请参阅为构建变体创建插桩测试

当您创建新项目或添加应用模块时,Android Studio 会创建上述测试源码集,并在每个源码集中包含一个示例测试文件。您可以在项目 (Project) 窗口中看到它们,如图 2 所示。

图 2. 您的项目的 (1) 插桩测试和 (2) 本地 JVM 测试在 Project 视图(左侧)或 Android 视图(右侧)中均可见。

创建新测试

您可以按照以下步骤,直接从源代码为特定类或方法添加新测试:

  1. 打开包含您要测试的代码的源文件。
  2. 将光标放在您要测试的类或方法的名称上,然后按 Control+Shift+T(macOS 上为 Command+Shift+T)。
  3. 在出现的弹出窗口中,点击 Create New Test…(创建新测试…)
  4. Create Test(创建测试)对话框中,选择 JUnit4,编辑要生成的字段和方法,然后点击 OK
  5. Choose Destination Directory(选择目标目录)对话框中,点击对应于您要创建的测试类型的源码集:androidTest(用于插桩测试)或 test(用于本地单元测试)。然后点击 OK

或者,您也可以按以下方式在适当的测试源码集中创建通用测试文件:

  1. 在左侧的 Project(项目)窗口中,点击下拉菜单并选择 Android 视图。
  2. 右键点击 java 目录,选择 New > Java Class(新建 > Java 类)New > Kotlin Class/File(新建 > Kotlin 类/文件)。或者,您也可以选中 java 目录并使用 Control+N(macOS 上为 Command+N)快捷键。
  3. Choose Destination Directory(选择目标目录)对话框中,点击对应于您要创建的测试类型的源码集:androidTest(用于插桩测试)或 test(用于本地单元测试)。然后点击 OK
  4. 为文件命名,然后点击 OK

如果添加测试后您的应用无法编译,请确保已设置正确的测试库依赖项。有关正确的依赖项,请参阅构建本地测试构建插桩测试

运行测试

在运行任何测试之前,请确保通过点击工具栏中的 Sync Project(同步项目) ,使您的项目与 Gradle 完全同步。您可以以不同的粒度运行测试:

  • 运行目录或文件中的所有测试,请打开 Project 窗口并执行以下任一操作:

    • 右键点击目录或文件,然后点击 Run(运行)
    • 选择目录或文件,并使用快捷键 Control+Shift+R
  • 运行类或特定方法中的所有测试,请在代码编辑器中打开测试文件,并执行以下任一操作:

    • 点击 装订区域 (gutter) 中的 Run test(运行测试)图标
    • 右键点击测试类或方法,然后点击 Run(运行)
    • 选择测试类或方法,并使用快捷键 Control+Shift+R

您的插桩测试将在物理设备或模拟器上运行。要了解有关设置物理设备的更多信息,请参阅在硬件设备上运行应用。要了解有关设置模拟器的更多信息,请参阅在 Android 模拟器上运行应用

配置测试运行

默认情况下,您的测试使用 Android Studio 的默认运行配置运行。如果您需要更改某些运行设置(如插桩运行程序和部署选项),可以在 Run/Debug Configurations(运行/调试配置)对话框中编辑运行配置(点击 Run > Edit Configurations)。

统一 Gradle 测试运行程序

Android Gradle 插件 7.1.0 以及 Android Studio Bumblebee 及更高版本使用 Gradle 自身的 Android 插桩测试运行程序实现来运行插桩测试。通过使用相同的测试运行程序,无论您是使用 AGP 从命令行(例如在持续集成服务器上)运行,还是从 Android Studio 运行,结果都可能保持一致。

图 3. 统一 Gradle 测试运行程序。

旧版本的 Android Studio 使用 IntelliJ Android 插桩测试运行程序,而不是 Gradle 的 Android 插桩测试运行程序。因此,如果您没有使用最新版本的 Android Studio,根据您是从 Android Studio 运行测试,还是使用 Gradle 插件从命令行运行测试,您可能会看到不同的测试结果,例如测试在一种运行程序上通过而在另一种上失败。

图 4. 旧版本 Android Studio 中的离散测试运行程序。

如果您已经在项目中保存了插桩测试配置,它们将使用 Gradle 在连接的设备上运行测试。您可以使用测试类或方法旁边的装订区域操作来创建新的插桩测试配置,如下所示。

图 5. 从装订区域操作运行测试。

运行插桩测试时,您可以通过在 Test Matrix(测试矩阵)中检查 Gradle 任务输出的测试结果,来确认 Android Studio 是否正在使用 Gradle 测试运行程序。

跨多个设备并行运行

默认情况下,插桩测试在一台物理设备或模拟器上运行。如果您想查看测试在更多设备上的表现,可以按照以下步骤选择更多设备:

  1. 运行测试之前,请打开 target device(目标设备)下拉菜单,然后选择 Select Multiple Devices…(选择多个设备…)

    图 6. Select Multiple Devices 下拉菜单。

  2. 选择所需的设备并点击 OK

  3. 确保目标下拉菜单上的文字更改为 Multiple Devices(多个设备),然后点击 Run(运行)

  4. Test Matrix 工具窗口会显示每个选定设备配置的测试结果。

    图 7. Test Matrix 工具窗口中的测试结果。

  5. 您可以点击特定测试以在输出窗格中查看结果。您还可以通过点击各列对测试进行排序。

使用 Firebase Test Lab 运行

使用 Firebase Test Lab,您可以同时在许多流行的 Android 设备和设备配置(语言区域、方向、屏幕尺寸和平台版本的不同组合)上测试您的应用。这些测试在远程 Google 数据中心的物理设备和虚拟设备上运行。测试结果提供测试日志,并包含任何应用失败的详细信息。

要开始使用 Firebase Test Lab,您需要执行以下操作:

  1. 如果您还没有账号,请创建 Google 账号
  2. Firebase 控制台中,点击 Create New Project(创建新项目)

Android Studio 提供了集成工具,允许您配置如何将测试部署到 Firebase Test Lab。创建 Firebase 项目后,您可以创建测试配置并运行测试:

  1. 从主菜单中点击 Run > Edit Configurations
  2. 点击 Add New Configuration(添加新配置) 并选择 Android Instrumented Tests
  3. 输入或选择您的测试详细信息,例如测试名称、模块类型、测试类型和测试类。
  4. Deployment Target Options(部署目标选项)下的 Target(目标)下拉菜单中,选择 Firebase Test Lab Device Matrix
  5. 如果您尚未登录,请点击 Sign in with Google 并允许 Android Studio 访问您的账号。
  6. Cloud Project 旁边,从列表中选择您的 Firebase 项目。
  7. Matrix configuration(矩阵配置)旁边,从下拉菜单中选择一个默认配置,或者按 Open Dialog(打开对话框) 来创建您自己的配置。您可以选择要测试应用的一个或多个设备、Android 版本、语言区域和屏幕方向。Firebase Test Lab 在生成测试结果时,会根据您的选择组合对应用进行测试。
  8. Run/Debug Configurations 对话框中点击 OK 退出。
  9. 点击 Run(运行) 运行测试。

图 8. 为 Firebase Test Lab 创建测试配置。

分析测试结果

当 Firebase Test Lab 完成测试运行后,Run(运行)窗口将打开以显示结果,如图 9 所示。您可能需要点击 Show Passed(显示通过的测试) 才能查看所有已执行的测试。

图 9. 使用 Firebase Test Lab 的插桩测试结果。

您也可以按照 Run 窗口中测试执行日志开头显示的链接,在网页上分析测试。

查看测试覆盖率

测试覆盖率工具可用于本地单元测试,以跟踪单元测试覆盖了多少百分比的应用代码以及覆盖了哪些区域。使用测试覆盖率工具来确定您是否充分测试了构成应用的元素、类、方法和代码行。

要运行带有覆盖率报告的测试,请按照运行测试中描述的相同步骤操作,只是不要点击 Run(运行) ,而是点击 Run test-name with coverage(以覆盖率方式运行 test-name) 。在 Project(项目)窗口中,此选项可能隐藏在 More Run/Debug(更多运行/调试)下。您也可以在 Run/Debug Configurations 对话框的 Code Coverage(代码覆盖率)选项卡下配置覆盖率设置。

图 10. 应用的代码覆盖率百分比。

查看测试结果

当您从 Android Studio 运行一个或多个测试时,结果会出现在 Run(运行)窗口中。图 11 显示了一个成功的测试运行。

图 11. 测试结果出现在 Run 窗口中。

Run(运行)窗口在左侧以树状视图显示测试,在右侧输出窗格中显示当前测试套件的结果和消息。使用工具栏、上下文菜单和状态图标来管理测试结果,具体如下:

  1. 使用 run toolbar(运行工具栏)重新运行当前测试、停止当前测试、重新运行失败的测试(不显示,因为仅适用于单元测试)、暂停输出和转储线程。
  2. 使用 testing toolbar(测试工具栏)筛选和排序测试结果。您还可以展开或折叠节点、显示测试覆盖率以及导入或导出测试结果。
  3. 点击 context menu(上下文菜单)来跟踪正在运行的测试、显示内嵌统计信息、滚动到堆栈跟踪、在异常处打开源代码、自动滚动到源代码,并在测试运行完成后选择第一个失败的测试。
  4. Test status icons(测试状态图标)指示测试是否有错误、被忽略、失败、正在进行、已通过、已暂停、已终止或未运行。
  5. 右键点击树状视图中的行,显示上下文菜单,允许您以调试模式运行测试、打开测试源代码文件或跳转到正在测试的源代码行。

分析测试失败

当一个或多个测试失败时,结果窗口会显示一个警告标志和失败次数(例如,“Tests failed: 1”)。

图 12. 输出窗格中失败的测试详情。

当您点击左侧树状视图中失败的测试时,右侧的输出窗格会显示该测试的详细信息。它会显示预期值和实际值,以便您进行比较。Click to see difference(点击查看差异)链接会打开差异查看器,您可以在其中并排查看结果。

了解详情

本页面涵盖了使用 Android Studio 创建和运行您的第一个测试所需的基本步骤。您也可以选择从命令行运行测试。您还可以查看 IntelliJ 关于测试的文档。有关在创建大型测试套件时如何配置测试的更多信息,请参阅高级测试设置