将 Test Lab 集成到您的 CI/CD 系统中

1. 简介

上次更新日期:2022 年 4 月 7 日

如何使用 CI/CD 系统运行移动设备测试

运行移动测试可能很困难:许多应用在不同的平台、设备和 API 版本上运行。应用开发者希望针对尽可能多的配置进行测试,以便在用户测试之前发现问题。但是,成本和资源限制限制了测试设备的数量以及个人开发者可投入的手动维护工作量。当开发流程扩大时,尤其是对于持续集成/持续开发 (CI/CD) 系统,测试流程需要自动化,同时最大限度降低维护成本和维护工作量。

为帮助您了解您的应用在用户设备上的表现,Firebase Test Lab 在我们的数据中心托管了一系列移动实体设备和虚拟设备。我们还提供 Google Cloud CLI,这是一个独立于平台的命令行工具,可编排在数据中心内的设备上运行的测试。借助 gcloud CLI,您可以轻松地将 Test Lab 的云端测试解决方案集成到现有的 CI/CD 工作流中。

跨平台支持

Test Lab 可为 Android 和 iOS 应用提供测试解决方案,并为 Unity 等移动游戏提供特殊支持。测试选项涵盖 Android Espresso、UI Automator 和 iOS XCTest 等热门测试框架。借助我们的自动抓取工具 Robo,Test Lab 甚至可以在不使用任何测试代码的情况下运行测试。

无硬件要求

Test Lab 在 Google 数据中心中托管实体设备,在 Google Cloud 中托管虚拟设备。您只需将测试发送到 Test Lab 并等待结果。

快速且可靠

同时运行多个测试用例可能需要很长时间,导致 CI/CD 流程受阻。借助 Test Lab,您可以轻松对测试进行分片,并在多台设备上并行运行这些测试。您还可以检测不稳定的情况,这是移动测试的一个常见痛点。

学习内容

  • 如何构建测试工件
  • 如何使用 gcloud CLI 运行移动测试
  • 如何设置 Jenkins CI
  • 如何使用 Jenkins CI 运行移动设备测试
  • 如何配置测试以根据 CI 系统进行纵向扩容

此 Codelab 主要介绍如何运行测试。对于不相关的概念,我们仅会略作介绍,但是会提供相应代码块供您复制和粘贴。

所需条件

如果您希望从头开始构建应用,则需要使用 Android Studio 来运行 Android 测试,或使用 XCode 来运行 iOS 测试。您也可以带上自己,我们会提供相关文物。

2. 使用 gcloud CLI 运行测试

构建 Android 应用 APK 和测试 APK

如需使用 Test Lab 运行测试,请先构建 Android 应用 APK 和测试 APK,其中包含要在硬件设备或模拟器上运行的插桩测试。如果您已有有效的代码库,则可以构建自己的 APK,也可以使用适用于 Espresso 的 BasicSample

若要使用 Gradle 命令构建 APK,您必须安装 Android SDK。如果您的机器上未安装 Android Studio,请安装 Android Studio 和 Android SDK,并使用您的 Android SDK 目录设置 ANDROID_HOME 环境。例如,在 ~/.bash_profile 文件中,添加以下行:

export ANDROID_HOME=~/Android/Sdk # For linux
export ANDROID_HOME=~/Library/Android/sdk  # For MacOS

然后,运行以下命令以克隆代码并构建 APK:

git clone https://github.com/android/testing-samples.git
cd testing-samples/ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

运行克隆和构建命令后,您可以在以下位置找到应用 APK 和测试 APK:

app/build/outputs/apk/debug/app-debug.apk
app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

或者,您也可以使用以下选项获取测试和应用 APK:

  • 如需在 Android Studio 中构建 APK,请按照在 Android Studio 中进行测试中的说明操作。
  • 下载示例记事本应用。使用位于 NotePad/app/build/outputs/apk/ 中的二进制文件 app-debug-unaligned.apk 和插桩测试文件 app-debug-test-unaligned.apk

如果您有适用于 iOS 应用的有效源代码,则可以编写 XCTest 并根据应用和测试构建 ZIP 文件

使用 gcloud CLI 通过 Test Lab 运行测试

在本部分中,您将创建一个 Firebase 项目并配置您的本地 Google Cloud SDK 环境。如需了解详情,请参阅开始使用 gcloud CLI 进行测试

设置 gcloud CLI

  1. 下载 Google Cloud SDK,其中包含 gcloud CLI 工具。
  2. 验证您安装的是否为最新版本:
gcloud components update
  1. 使用您的 Google 账号登录 gcloud CLI:
gcloud auth login
  1. 在 gcloud CLI 中设置您的 Firebase 项目,其中 PROJECT_ID 是您的 Firebase 项目 ID。您可以在 Firebase 控制台网址中找到项目 ID,该网址遵循以下命名惯例:https://console.firebase.google.com/project/[PROJECT_ID]/...
gcloud config set project PROJECT_ID

如果您没有 Firebase 项目,请在 Firebase 控制台中创建一个。

使用构建的 APK 运行测试

在本部分中,您将在 Test Lab 的默认设备(即 API 级别为 28 的 Pixel 3)上运行插桩测试。如果你想使用其他设备,请查看可用设备

使用您在“构建 Android 应用 APK 和测试 APK”中构建的应用和测试 APK,使用以下命令运行 Android 插桩测试:

gcloud firebase test android run \
  --type instrumentation \
  --app app/build/outputs/apk/debug/app-debug.apk \
  --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

分析测试结果

您可以使用以下任一选项分析测试结果:

  • gcloud summary - 测试完成后,gcloud CLI 会输出测试结果的基本摘要。
  • gcloud 退出代码 - 测试完成后,如果测试通过,该命令会以 0 退出。如果测试失败,该命令会以非零退出代码退出。
  • Firebase 控制台 - gcloud CLI 会显示指向 Firebase 控制台的链接。该链接遵循命名惯例 https://console.firebase.google.com/project/PROJECT_ID/testlab/...。如需了解详情,请参阅解读单次测试作业的结果
  • JUnit XML 文件 - gcloud CLI 会输出以下内容:
Raw results will be stored in your Cloud Storage bucket at [https://console.developers.google.com/storage/browser/test-lab-xxxxx/xxxxx/]

test-lab-xxxxx/xxxxx 是存储测试工件和结果的 Cloud Storage 存储分区。如需找到包含测试结果的 JUnit XML 文件,请打开链接并导航到 blueline-28-en-portrait/test_result_1.xml

3. 使用 Jenkins CI 进行设置

在本部分中,您将使用 Jenkins CI(一种常用的 CI 系统)通过 Test Lab 运行测试。如果您想使用其他 CI 系统,请参阅运行大型测试套件的高级最佳实践,以及 BitriseCircle CI 等其他 CI 系统的文档。您可以使用 Flank 作为 gcloud CLI 的替代方案。

为 Jenkins 启用 gcloud CLI

在将 Test Lab 与 Jenkins 结合使用之前,您必须启用所需的 API 并设置 Jenkins 可用于通过 gcloud CLI 进行身份验证的服务账号。

为 Jenkins 添加 Google Cloud 服务账号

服务账号是专用于服务集成的受限账号。这些帐号可为特定服务提供精细的控制,并且不受垃圾内容检查或人机识别系统提示的约束,否则这类帐号可能会阻止 CI 构建。

如需创建服务账号,请按照以下步骤操作:

  1. 在 Google Cloud Console 中打开服务帐号页面。
  2. 点击创建服务帐号,添加名称说明,然后点击创建并继续
  3. 选择角色下拉菜单中,选择基本,然后选择编辑者
  4. 点击继续,然后点击完成

接下来,创建并下载身份验证密钥,Jenkins 可以使用该密钥以您创建的服务账号的身份对其进行身份验证。

如需创建并下载服务账号密钥,请按以下步骤操作:

  1. 在 Google Cloud 控制台的服务帐号页面中,点击与您创建的帐号关联的电子邮件地址。
  2. 选择密钥,然后点击添加密钥创建新密钥
  3. 选择 JSON,然后点击创建
  4. 当系统提示您下载文件时,点击确定。将文件下载到您计算机上的安全位置。您稍后在配置 Jenkins 时需要用到此文件。

如需详细了解如何创建服务帐号,请参阅创建服务帐号

启用所需的 Google Cloud API

借助 Cloud Testing API,您可以在 Google 基础架构上运行测试。您在使用 gcloud CLI 完成运行测试时启用了此 API。借助 Cloud Tool Results API,您可以通过编程方式访问测试结果。

  1. 打开 Google Developers Console API 库
  2. 在 Firebase 控制台顶部的搜索栏中,输入每个必需 API(Cloud Testing APICloud Tool Results API)的名称。系统会显示所请求 API 的概览页面。
  3. 点击每个 API 的概览页面上的启用 API

安装并设置 Jenkins

您可以在 Linux、macOS、Windows 和许多其他环境中安装并设置 Jenkins CI。此 Codelab 的某些详情仅适用于在 Linux 上安装和运行 Jenkins CI,包括在文件路径中使用斜杠 (/)。

若要在运行 Linux 或 Windows 的计算机上下载并安装 Jenkins,请遵循安装 Jenkins 的相关说明。安装 Jenkins 后,请按照相同的 Jenkins 安装说明完成设置,并使用 http://localhost:8080 访问 Jenkins 信息中心。

验证已安装的插件

Jenkins 支持不同的版本控制系统。在此 Codelab 中,您将使用 Git 运行之前的测试。为了获得更好的 gcloud CLI 运行体验,您需要安装 GCloud SDK 插件。

  1. 在 Jenkins 信息中心中,点击 Manage Jenkins,然后点击 Manage Plugins
  2. 搜索 GitGCloud SDK 插件并进行安装(如果尚未安装)。

配置 Android SDK 和 Google Cloud SDK 的位置

现在,您可以指示 Jenkins 在何处找到 Google Cloud SDK 和 Android SDK。

如需为 Jenkins 配置 Google Cloud SDK 和 Android SDK,请按以下步骤操作:

  1. 在 Jenkins 信息中心中,点击 Manage Jenkins,然后点击 Global Tool Configuration
  2. Google Cloud SDK 部分中,点击添加 Google Cloud SDK
  3. 名称字段中,为 Google Cloud SDK 实例输入一个容易记住的名称,例如 GCloud-SDK。
  4. 输入您的 Google Cloud SDK 主目录,例如 /opt/google-cloud-sdk
  5. 点击保存
  6. 依次打开 Dashboard > Manage Jenkins >Configure System,为 Android SDK 和 Google Cloud SDK 配置系统级属性。
  7. 选中环境变量复选框,然后点击添加
  8. Name 字段中,输入 ANDROID_HOME。在 Value(值)字段中,输入 Android SDK 的位置,例如 /opt/Android/Sdk
  9. 点击 Tool Locations(工具位置)复选框,然后点击 Add(添加)。从 Name 下拉列表中,选择您在全局工具配置中添加的 Google Cloud SDK 实例的名称。
  10. Home 字段中,输入您的 Google Cloud SDK 的位置,例如 /opt/google-cloud-sdk
  11. 点击保存

将您的服务账号凭据添加到 Jenkins

现在,您可以将 gcloud CLI 服务帐号凭据添加到 Jenkins,以便 Jenkins 进行身份验证并成功运行 gcloud CLI 命令。

  1. 在 Jenkins 信息中心上,点击 Manage Jenkins,然后点击 Manage Credentials
  2. 将范围限定到 Jenkins 部分中,点击 (global) 网域链接,然后点击 Add Credentials
  3. 种类下拉列表中,选择私钥中的 Google 服务帐号
  4. Project Name 字段中,输入您的 Firebase 项目名称。
  5. 选择 JSON 密钥,然后点击浏览,并找到您保存服务账号密钥的位置。
  6. 点击创建

您现在可以为 Test Lab 配置 Jenkins 自动构建了。

4.使用 Jenkins CI 运行 Test Lab 测试

现在您已经设置了 Jenkins,接下来我们将所有内容整合在一起,使用 Jenkins 运行同一测试。

您可以将 Jenkins 配置为运行自动构建,并在每次签入应用更新时运行测试。您还可以将 Jenkins 配置为定期运行构建。如需详细了解如何在 Jenkins 中配置构建,请参阅配置自动构建

创建和配置 Jenkins 项目

创建一个项目,以使用 Test Lab 对您的应用运行持续集成测试。

创建 Jenkins 项目

  1. 通过浏览到 http://localhost:8080 打开 Jenkins 信息中心。
  2. 在 Jenkins 信息中心中,点击 New Item(新建项目)。
  3. Item name 字段中输入项目的名称,然后点击 Freestyle project 以创建使用单个 build 配置的项目。
  4. 点击确定。如需完成项目配置,请按顺序完成其余部分。

配置源代码管理

  1. Source Code Management 标签页中,选择 Git
  2. Repository 网址 字段中输入 https://github.com/android/testing-samples.git

配置构建环境

在“Build Environment”(构建环境)部分,您可以配置构建特性。按照以下步骤启用 Google Cloud 身份验证:

  1. 构建环境标签页中,选中 GCloud SDK 身份验证复选框,然后选择您在添加 Google Cloud 安装信息时选择的安装名称。
  2. Google 凭据下拉列表中,选择您配置的服务帐号凭据。

添加了 Gradle 构建步骤以重新构建 APK 软件包

  1. 向下滚动到 Build 部分,点击 Add build step,然后选择 Execute shell
  2. 在应用的主目录中添加构建步骤以运行下列命令:
cd ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

向 Jenkins 添加 gcloud CLI 构建步骤

现在,您可以使用 gcloud CLI 命令行向 Jenkins 添加构建步骤以运行 Test Lab 了。

如需添加 gcloud CLI 构建步骤,请添加新的 Execute shell 构建步骤,并输入以下命令:

gcloud config set project PROJECT_ID
gcloud firebase test android run \
--app ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/debug/app-debug.apk
--test ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

完成项目设置后,向下滚动到页面底部并保存配置。系统会将您重定向到新项目的首页。

使用 Jenkins 运行测试

现在,您可以构建 Jenkins 项目并运行测试,就像使用 gcloud CLI 运行的手动测试一样。

如需使用 Jenkins 运行测试,请按以下步骤操作:

  1. 如需手动触发构建,请点击 Build Now
  2. 依次点击新构建 > 控制台输出,查看进度和结果。

如果没有发现错误,那么恭喜您!您刚刚设置一个项目,一键在 Pixel 2 设备上运行测试。如果您遇到错误,请参阅问题排查

5. 运行大型测试套件的高级最佳实践

如果您想同时运行多个测试,请遵循以下最佳实践,以确保您的测试快速可靠地运行。

扩大对多种设备配置的覆盖范围

您可以轻松将多台设备添加到 gcloud CLI 构建步骤。此外,您还可以查看并选择可用的设备、版本、语言区域和屏幕方向。例如,以下命令在两台设备上运行测试:

  • 一台纵向模式且 API 级别为 30 且语言区域为英语的虚拟 Google Pixel 2
  • 一部 Samsung Galaxy S20 实体设备,横向模式为 API 级别 29,语言设置为法语
gcloud firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --device model=Pixel2,version=30,locale=en,orientation=portrait  \
  --device model=x1q,version=29,locale=fr,orientation=landscape

使用 gcloud CLI YAML 配置文件

如果您希望在一个位置或使用源代码控制系统管理参数,则可以在 YAML 格式的参数文件中指定这些参数。如需了解如何使用此功能,请运行 gcloud topic arg-files

将测试分片以并行运行

测试分片可将一组测试划分为单独运行的子组(分片)。Test Lab 会自动使用多个设备并行运行每个分片,让 Test Lab 能够更快地完成整套测试。如需了解详情,请参阅启用分片

如需启用分片,请使用 gcloud beta 渠道,并在 gcloud CLI 构建步骤中添加 –num-uniform-shards–test-targets-for-shard 标志。例如,如需将测试分片为五个执行并并行运行,请运行以下命令:

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-uniform-shards 5

启用不稳定检测

移动设备测试往往不稳定。即使采用相同的设置,有时测试会通过,有时可能会失败。您可以使用 –num-flaky-test-attempts gcloud CLI 标志来检测失败的测试是否不稳定。此标志指定在一个或多个测试用例因任何原因失败时应重新尝试执行测试的次数。

例如,如需在初始失败运行后将失败的测试用例重新运行三次,请指定以下内容:

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-flaky-test-attempts 3

6. 恭喜

恭喜,您已成功使用 CI 系统运行了您的第一个 Test Lab 测试!

您构建应用和测试 APK,并使用 gcloud CLI 通过 Test Lab 运行了插桩测试。您还将设置 Jenkins 项目来自动执行相同的测试。

现在,您已了解将 Test Lab 集成到 CI/CD 系统的关键步骤。

后续步骤

请参阅如何使用 Firebase Emulator Suite 设置 CI

补充阅读材料

参考文档