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,也可以使用 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 和应用 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
- 下载 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 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 系统)通过 Test Lab 运行测试。如果您想使用其他 CI 系统,请参阅“运行大型测试套件的高级最佳实践”以及其他 CI 系统(例如 Bitrise 和 Circle CI)的文档。您可以使用 Flank 代替 gcloud CLI。
为 Jenkins 启用 gcloud CLI
在将 Test Lab 与 Jenkins 结合使用之前,您必须启用所需的 API 并设置一个服务账号,供 Jenkins 用于通过 gcloud CLI 进行身份验证。
为 Jenkins 添加 Google Cloud 服务账号
服务账号是有限的账号,旨在用于服务集成。这些账号可针对特定服务提供精细的控制,并且不需要接受垃圾内容检查或人机识别系统验证,这两类操作可能会阻止 CI 构建。
如需创建服务账号,请按照以下步骤操作:
- 在 Google Cloud 控制台中打开服务账号页面。
- 点击创建服务账号,添加名称和说明,然后点击创建并继续。
- 从选择角色下拉菜单中,选择基本,然后选择 Editor。
- 点击继续,然后点击完成。
接下来,您需要创建并下载一个身份验证密钥,供 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 和 Google Cloud SDK 的位置
现在,您需要指示 Jenkins 在哪里可以找到 Google Cloud SDK 和 Android SDK。
如需为 Jenkins 配置 Google Cloud 和 Android SDK,请按以下步骤操作:
- 在 Jenkins 信息中心中,点击管理 Jenkins,然后点击全局工具配置。
- 在 Google Cloud SDK 部分中,点击 Add Google Cloud SDK。
- 在名称字段中,输入一个易于记忆的 Google Cloud SDK 实例名称,例如 GCloud-SDK。
- 输入您的 Google Cloud SDK 主目录,例如
/opt/google-cloud-sdk
。 - 点击保存。
- 打开信息中心 > 管理 Jenkins > 配置系统,为 Android 和 Google Cloud SDK 配置系统级属性。
- 选中环境变量复选框,然后点击添加。
- 在 Name 字段中,输入 ANDROID_HOME。在值字段中,输入 Android SDK 的位置,例如
/opt/Android/Sdk
。 - 点击工具位置复选框,然后点击添加。从名称下拉菜单中,选择您在“全局工具配置”中添加的 Google Cloud SDK 实例的名称。
- 在 Home 字段中,输入 Google Cloud SDK 的位置,例如
/opt/google-cloud-sdk
。 - 点击保存。
向 Jenkins 添加服务账号凭据
现在,您需要将 gcloud CLI 服务账号凭据添加到 Jenkins,以便 Jenkins 可以进行身份验证并成功运行 gcloud CLI 命令。
- 在 Jenkins 信息中心中,点击 Manage Jenkins(管理 Jenkins),然后点击 Manage Credentials(管理凭据)。
- 在 Stores scoped to Jenkins(Jenkins 范围内的存储区)部分,点击 (global)(全局)网域链接,然后点击 Add Credentials(添加凭据)。
- 从种类下拉菜单中,选择私钥中的 Google 服务账号。
- 在项目名称字段中,输入您的 Firebase 项目名称。
- 选择 JSON key(JSON 密钥),然后点击 Browse(浏览),找到您保存服务账号密钥的位置。
- 点击创建。
现在,您可以开始为 Test Lab 配置 Jenkins 自动构建了。
4. 使用 Jenkins CI 运行 Test Lab 测试
现在,您已设置好 Jenkins,接下来让我们将所有内容整合在一起,并使用 Jenkins 运行相同的测试。
您可以将 Jenkins 配置为在每次签入应用更新时自动进行构建并运行测试。您还可以对 Jenkins 进行配置,以定期运行构建。如需详细了解如何在 Jenkins 中配置 build,请参阅配置自动 build。
创建和配置 Jenkins 项目
创建一个项目,用于通过 Test Lab 对您的应用运行持续集成测试。
创建 Jenkins 项目
- 通过浏览 http://localhost:8080 打开 Jenkins 控制台。
- 在 Jenkins 信息中心中,点击 New Item(新建项目)。
- 在项目名称字段中输入项目名称,然后点击自由风格项目,以创建使用单个构建配置的项目。
- 点击确定。如需完成项目配置,请按顺序完成其余部分。
配置源代码管理
- 在 Source Code Management 标签页中,选择 Git。
- 在代码库网址字段中输入 https://github.com/android/testing-samples.git。
配置 build 环境
您可以在“构建环境”部分配置构建特征。按照以下步骤启用 Google Cloud 身份验证:
- 在 Build Environment 标签页中,选中 GCloud SDK authentication 复选框,然后选择您在添加 Google Cloud 安装信息时选择的安装名称。
- 从 Google 凭据下拉菜单中,选择您配置的服务账号凭据。
添加 Gradle 构建步骤以重新构建 APK 软件包
- 向下滚动到构建部分,点击添加构建步骤,然后选择执行 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 构建步骤,请添加新的执行 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 运行测试,请按以下步骤操作:
- 如需手动触发构建,请点击立即构建。
- 点击新 build > 控制台输出,查看进度和结果。
如果您未看到错误,恭喜!您只需设置一个项目,然后点击一下即可在 Pixel 2 设备上运行测试。如果您遇到错误,请参阅问题排查。
5. 运行大型测试套件的高级最佳实践
如果您想同时运行多项测试,请遵循以下最佳实践,以确保测试快速可靠地运行。
增加对多种设备配置的覆盖范围
您可以轻松地将多个设备添加到 gcloud CLI 构建步骤中。您可以查看并选择可用的设备、版本、语言区域和屏幕方向。例如,以下命令会在两台设备上运行测试:
- 一个虚拟 Google Pixel 2,API 级别为 30,采用竖屏方向和英语语言区域
- 一部实体 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 标志。例如,如需将测试分片为 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 标志检测失败的测试是否不稳定。此标志用于指定在一个或多个测试用例因任何原因而失败时应重新尝试执行测试的次数。
例如,若要在初始运行失败后再次运行失败的测试用例 3 次,请指定以下内容:
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