将测试实验室集成到您的 CI/CD 系统中

一、简介

最后更新: 2022-04-07

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

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

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

跨平台支持

测试实验室为 Android 和 iOS 应用程序提供测试解决方案,并为 Unity 等手机游戏提供专业支持。测试选项涵盖流行的测试框架,例如 Android Espresso、UI Automator 和 iOS XCTest。使用我们的自动化爬虫Robo ,测试实验室甚至可以在没有任何测试代码的情况下运行测试。

无硬件要求

测试实验室在 Google 数据中心托管物理设备,并在 Google Cloud 中托管虚拟设备。您所需要做的就是将测试发送到测试实验室并等待结果。

快速可靠

同时运行许多测试用例可能需要很长时间,从而阻塞 CI/CD 进程。通过测试实验室,您可以轻松地对测试进行分片并在多个设备上并行运行它们。您还可以检测脆弱性,这是移动测试的常见痛点。

你将学到什么

  • 如何构建测试工件
  • 如何使用 gcloud CLI 运行移动测试
  • 如何设置 Jenkins CI
  • 如何使用 Jenkins CI 运行移动测试
  • 如何配置测试以通过 CI 系统进行扩展

此 Codelab 重点关注运行测试。不相关的概念和代码块被掩盖并提供给您简单地复制和粘贴。

你需要什么

如果您喜欢从头开始构建,则需要 Android Studio 来运行 Android 测试,或 XCode 来运行 iOS 测试。或者您自己来,我们将提供文物。

2. 使用 gcloud CLI 运行测试

构建 Android 应用 APK 并测试 APK

要使用测试实验室运行测试,请首先构建 Android 应用程序 APK 和测试 APK,其中包含要在硬件设备或模拟器上运行的仪器测试。如果您已经有一个可用的代码库,您可以构建自己的 APK,也可以使用BasicSample for Espresso

要使用 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 中测试中的说明进行操作。
  • 下载示例记事本应用程序。使用二进制文件app-debug-unaligned.apk和仪器测试文件app-debug-test-unaligned.apk ,它们位于NotePad/app/build/outputs/apk/中。

如果您有 iOS 应用程序的工作源代码,则可以编写XCTest并从应用程序和测试构建 zip 文件

使用 gcloud CLI 通过测试实验室运行测试

在本部分中,您将创建一个 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 控制台 URL 中找到项目 ID,该 URL 遵循以下命名约定: https://console.firebase.google.com/project/[PROJECT_ID]/...
gcloud config set project PROJECT_ID

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

使用构建的 APK 运行测试

在本部分中,您将在测试实验室的默认设备(API 级别为 28 的 Pixel 3)上运行仪器测试。如果您想使用其他设备,请检查可用设备

使用您在构建 Android 应用程序 APK 和测试 APK 中构建的应用程序和测试 APK,使用以下命令运行 Android Instrumentation 测试:

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 系统)通过测试实验室运行测试。如果您想使用不同的 CI 系统,请参阅运行大型测试套件的高级最佳实践以及其他 CI 系统(如BitriseCircle CI)的文档。您可以使用Flank作为 gcloud CLI 的替代方案。

为 Jenkins 启用 gcloud CLI

在将测试实验室与 Jenkins 结合使用之前,您必须启用所需的 API 并设置 Jenkins 可用于通过 gcloud CLI 进行身份验证的服务帐户。

为 Jenkins 添加 Google Cloud 服务帐户

服务帐户是用于服务集成的有限帐户。这些帐户为特定服务提供细粒度的控制,并且不受垃圾邮件检查或验证码提示的影响,否则可能会阻止您的 CI 构建。

要创建服务帐户,请执行以下步骤:

  1. 在 Google Cloud Console 中打开服务帐号页面。
  2. 单击“创建服务帐户” ,添加名称说明,然后单击“创建并继续”
  3. 选择角色下拉列表中,选择Basic ,然后选择Editor
  4. 单击“继续” ,然后单击“完成”

接下来,您创建并下载一个身份验证密钥,Jenkins 可使用该密钥对您创建的服务帐户进行身份验证。

要创建并下载服务帐户密钥,请执行以下步骤:

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

要了解有关创建服务帐户的更多信息,请参阅创建服务帐户

启用所需的 Google Cloud API

Cloud Test API 可让您在 Google 基础架构上运行测试。当您完成使用 gcloud CLI 运行测试后,您已启用此 API。 Cloud Tool Results API 允许您以编程方式访问测试结果。

  1. 打开Google 开发者控制台 API 库
  2. 在 Firebase 控制台顶部的搜索栏中,输入每个所需 API 的名称( Cloud Test 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 仪表板上,单击“管理 Jenkins” ,然后单击“管理插件”
  2. 搜索GitGCloud SDK插件并安装它们(如果尚未安装)。

配置 Android 和 Google Cloud SDK 的位置

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

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

  1. 在 Jenkins 仪表板上,单击管理 Jenkins ,然后单击全局工具配置
  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 。在字段中,输入 Android SDK 的位置,例如/opt/Android/Sdk
  9. 单击“工具位置”复选框,然后单击“添加” 。从名称下拉列表中,选择您在全局工具配置中添加的 Google Cloud SDK 实例的名称。
  10. 主页字段中,输入 Google Cloud SDK 的位置,例如/opt/google-cloud-sdk
  11. 单击“保存”

将您的服务帐户凭据添加到 Jenkins

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

  1. 在 Jenkins 仪表板上,单击“管理 Jenkins” ,然后单击“管理凭据”
  2. Jenkins 范围内的 Stores部分中,单击(全局)域链接,然后单击Add Credentials
  3. “种类”下拉列表中,选择“来自私钥的 Google 服务帐户”
  4. 项目名称字段中,输入您的 Firebase 项目名称。
  5. 选择JSON key ,然后单击浏览并浏览到保存服务帐户密钥的位置。
  6. 单击创建

您现在已准备好为测试实验室配置 Jenkins 自动构建。

4. 使用 Jenkins CI 运行测试实验室测试

现在您已经设置了 Jenkins,让我们将所有内容放在一起并使用 Jenkins 运行相同的测试。

您可以将 Jenkins 配置为运行自动构建,并在每次签入应用程序更新时运行测试。您还可以将 Jenkins 配置为定期运行构建。要了解有关在 Jenkins 中配置构建的更多信息,请参阅配置自动构建

创建并配置您的 Jenkins 项目

创建一个项目以使用测试实验室对您的应用程序运行持续集成测试。

创建詹金斯项目

  1. 通过浏览http://localhost:8080打开 Jenkins 仪表板。
  2. 在 Jenkins 仪表板上,单击新建项目
  3. “项目名称”字段中输入项目的名称,然后单击“自由式项目”以创建使用单个构建配置的项目。
  4. 单击“确定” 。要完成项目配置,请按顺序完成其余部分。

配置源代码管理

  1. 源代码管理选项卡中,选择Git
  2. 存储库 URL字段中输入https://github.com/android/testing-samples.git

配置构建环境

构建环境部分允许您配置构建特征。请按照以下步骤启用 Google Cloud 身份验证:

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

添加 Gradle 构建步骤来重建 APK 包

  1. 向下滚动到“构建”部分,单击“添加构建步骤” ,然后选择“执行 shell”
  2. 添加构建步骤以在应用程序的主目录中运行以下命令:
cd ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

向 Jenkins 添加 gcloud CLI 构建步骤

现在,您可以向 Jenkins 添加构建步骤,以使用 gcloud CLI 命令行运行测试实验室。

要添加 gcloud CLI 构建步骤,请添加新的执行 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. 要手动触发构建,请单击“立即构建”
  2. 单击 new build > Console Output检查进度和结果。

如果您没有看到错误,那么恭喜您!您只需设置一个项目并一键在 Pixel 2 设备上运行测试。如果遇到错误,请参阅故障排除

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

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

增加多种设备配置的覆盖范围

您可以轻松地将多个设备添加到 gcloud CLI 构建步骤中。您可以检查并选择可用的设备、版本、区域设置和方向。例如,以下命令在两台设备上运行测试:

  • API 级别 30 的虚拟 Google Pixel 2,纵向和英语区域设置
  • 横向和法语语言环境下 API 级别 29 的实体三星 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

并行运行的分片测试

测试分片将一组测试划分为单独运行的子组(分片)。测试实验室使用多个设备自动并行运行每个分片,这使测试实验室能够更快地完成整套测试。有关更多信息,请参阅启用分片

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

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 系统运行了第一次测试实验室测试!

您构建了应用程序并测试 APK,并使用 gcloud CLI 通过测试实验室运行了仪器测试。您还设置了一个 Jenkins 项目来自动执行相同的测试。

现在您知道将测试实验室集成到 CI/CD 系统中的关键步骤。

下一步是什么?

查看如何使用 Firebase 模拟器套件设置 CI

进一步阅读

参考文档