将 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 和应用 APK:

  • 如需在 Android Studio 中构建 APK,请按照在 Android Studio 中进行测试中的说明操作。
  • 下载示例 Notepad 应用。使用二进制文件 app-debug-unaligned.apk 和插桩测试文件 app-debug-test-unaligned.apk(位于 NotePad/app/build/outputs/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,该 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 摘要 - 测试完成后,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 控制台中打开服务帐号页面。
  2. 点击创建服务帐号,添加名称说明,然后点击创建并继续
  3. 选择角色下拉列表中,选择基本,然后选择编辑者
  4. 点击继续,然后点击完成

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

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

  1. 在 Google Cloud 控制台的服务帐号页面中,点击与您创建的帐号关联的电子邮件地址。
  2. 选择密钥,然后点击添加密钥创建新密钥
  3. 选择 JSON,然后点击创建
  4. 当系统提示下载文件时,点击 OK。将文件下载到计算机上安全的位置。您稍后配置 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(管理 Jenkins),然后点击 Manage Plugins
  2. 搜索 GitGCloud SDK 插件并进行安装(如果尚未安装)。

配置 Android 和 Google Cloud SDK 的位置

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

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

  1. 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 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. 依次打开信息中心 > 管理 Jenkins > 配置系统,为 Android 和 Google Cloud SDK 配置系统级属性。
  7. 选中环境变量复选框,然后点击添加
  8. 名称字段中,输入 ANDROID_HOME。在 Value(值)字段中,输入 Android SDK 的位置,例如 /opt/Android/Sdk
  9. 选中 Tool Locations 复选框,然后点击 Add。从名称下拉列表中,选择您在全局工具配置中添加的 Google Cloud SDK 实例的名称。
  10. 主页字段中,输入 Google Cloud SDK 的位置,例如 /opt/google-cloud-sdk
  11. 点击保存

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

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

  1. 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 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. 代码库网址字段中输入 https://github.com/android/testing-samples.git

配置构建环境

在“Build Environment”部分,您可以配置 build 特征。按照以下步骤启用 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
  • API 级别为 29 的实体 Samsung Galaxy S20,屏幕方向为横向且采用法语语言区域
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 会自动使用多个设备并行运行每个分片,从而更快地完成整套测试。如需了解详情,请参阅启用分片

如需启用分片功能,请使用 gcloud beta 渠道,并将 –num-uniform-slices–test-targets-for-slice 标志添加到 gcloud CLI 构建步骤。例如,要将测试分成 5 次执行并并行运行,请运行以下命令:

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

补充阅读材料

参考文档