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 在 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 中测试中的说明操作。
- 下载示例记事本应用。使用二进制文件
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
- 下载 Google Cloud SDK,其中包含 gcloud CLI 工具。
- 验证您安装的是否为最新版本:
gcloud components update
- 使用您的 Google 账号登录 gcloud CLI:
gcloud auth login
- 在 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
摘要 - 测试完成后,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 系统,请参阅运行大型测试套件的高级最佳实践,以及 Bitrise 和 Circle CI 等其他 CI 系统的文档。您可以使用 Flank 作为 gcloud CLI 的替代方案。
为 Jenkins 启用 gcloud CLI
在将 Test Lab 与 Jenkins 搭配使用之前,您必须启用所需的 API 并设置一个服务账号,以便 Jenkins 使用该账号通过 gcloud CLI 进行身份验证。
为 Jenkins 添加 Google Cloud 服务账号
服务账号是专用于服务集成的受限账号。这些账号可对特定服务进行精细控制,并且不需要接受垃圾内容检查或人机识别系统验证,这两类操作可能会阻止 CI 构建。
如需创建服务账号,请按照以下步骤操作:
- 在 Google Cloud Console 中打开服务账号页面。
- 点击创建服务账号,添加名称和说明,然后点击创建并继续。
- 从选择角色下拉菜单中,选择基本,然后选择编辑者。
- 点击继续,然后点击完成。
接下来,创建并下载身份验证密钥,Jenkins 可以使用该密钥以您创建的服务账号的身份对其进行身份验证。
如需创建并下载服务账号密钥,请按以下步骤操作:
- 在 Google Cloud 控制台的服务账号页面中,点击与您创建的账号关联的电子邮件地址。
- 选择密钥,然后点击添加密钥和创建新密钥。
- 选择 JSON,然后点击创建。
- 当系统提示您下载文件时,点击确定。将文件下载到计算机上安全的位置。您稍后在配置 Jenkins 时需要用到此文件。
如需详细了解如何创建服务账号,请参阅创建服务账号。
启用所需的 Google Cloud API
借助 Cloud Testing API,您可以在 Google 基础架构上运行测试。您在使用 gcloud CLI 完成运行测试时已启用此 API。借助 Cloud Tool Results API,您可以以编程方式访问测试结果。
- 打开 Google Developers Console API 库。
- 在 Firebase 控制台顶部的搜索栏中,输入每个必需 API(Cloud Testing API 和 Cloud Tool Results API)的名称。系统会显示所请求 API 的概览页面。
- 在每个 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 插件。
- 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 Jenkins),然后点击 Manage Plugins(管理插件)。
- 搜索 Git 和 GCloud SDK 插件,并将其安装(如果尚未安装)。
配置 Android SDK 和 Google Cloud SDK 的位置
现在,您可以指示 Jenkins 在何处找到 Google Cloud SDK 和 Android SDK。
如需为 Jenkins 配置 Google Cloud SDK 和 Android SDK,请按以下步骤操作:
- 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 Jenkins),然后点击 Global Tool Configuration(全局工具配置)。
- 在 Google Cloud SDK 部分中,点击添加 Google Cloud SDK。
- 在名称字段中,为 Google Cloud SDK 实例输入一个易于记住的名称,例如 GCloud-SDK。
- 输入您的 Google Cloud SDK 主目录,例如
/opt/google-cloud-sdk
。 - 点击保存。
- 依次打开 Dashboard > Manage Jenkins > Configure System,为 Android SDK 和 Google Cloud SDK 配置系统级属性。
- 选中环境变量复选框,然后点击添加。
- 在 Name 字段中,输入 ANDROID_HOME。在 Value 字段中,输入 Android SDK 的位置,例如
/opt/Android/Sdk
。 - 选中 Tool Locations(工具位置)复选框,然后点击 Add(添加)。在名称下拉列表中,选择您在“全局工具配置”中添加的 Google Cloud SDK 实例的名称。
- 在 Home 字段中,输入您的 Google Cloud SDK 的位置,例如
/opt/google-cloud-sdk
。 - 点击保存。
将服务账号凭据添加到 Jenkins
现在,您可以将 gcloud CLI 服务账号凭据添加到 Jenkins,以便 Jenkins 进行身份验证并成功运行 gcloud CLI 命令。
- 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 Jenkins),然后点击 Manage Credentials(管理凭据)。
- 在仅限 Jenkins 的商店部分中,点击 (global) 网域链接,然后点击添加凭据。
- 从种类下拉列表中,选择私钥中的 Google 服务账号。
- 在 Project Name 字段中,输入您的 Firebase 项目名称。
- 选择 JSON 密钥,然后点击浏览,并找到您保存服务账号密钥的位置。
- 点击创建。
现在,您可以为 Test Lab 配置 Jenkins 自动构建了。
4. 使用 Jenkins CI 运行 Test Lab 测试
现在,您已经设置好 Jenkins,接下来我们将整合所有内容,使用 Jenkins 运行相同的测试。
您可以将 Jenkins 配置为在每次签入应用更新时自动进行构建并运行测试。您还可以将 Jenkins 配置为定期运行构建。如需详细了解如何在 Jenkins 中配置构建,请参阅配置自动构建。
创建和配置 Jenkins 项目
创建一个项目,以使用 Test Lab 对您的应用运行持续集成测试。
创建 Jenkins 项目
- 浏览到 http://localhost:8080 以打开 Jenkins 信息中心。
- 在 Jenkins 信息中心中,点击 New Item(新建项目)。
- 在 Item name 字段中输入项目的名称,然后点击 Freestyle project 以创建使用单个 build 配置的项目。
- 点击确定。如需完成项目配置,请按顺序完成其余部分。
配置源代码管理
- 从 Source Code Management 标签页中,选择 Git。
- 在 Repository 网址 字段中输入 https://github.com/android/testing-samples.git。
配置构建环境
在“Build Environment”(构建环境)部分,您可以配置构建特性。按照以下步骤启用 Google Cloud 身份验证:
- 在构建环境标签页中,选中 GCloud SDK 身份验证复选框,然后选择您在添加 Google Cloud 安装信息时选择的安装名称。
- 从 Google 凭据下拉列表中,选择您配置的服务账号凭据。
添加了 Gradle 构建步骤以重新构建 APK 软件包
- 向下滚动到 Build 部分,点击 Add build step,然后选择 Execute shell。
- 添加构建步骤以便在应用的主目录中运行下列命令:
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 运行测试,请按以下步骤操作:
- 如需手动触发构建,请点击立即构建。
- 如需查看进度和结果,请点击新构建 >控制台输出。
如果您没有看到错误,恭喜!您只需点击一下,即可设置项目并在 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
渠道,并将 –num-uniform-shards 或 –test-targets-for-shard 标志添加到 gcloud CLI build 步骤。例如,如需将测试分片为 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