Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

开始使用 gcloud CLI 执行测试

本指南介绍如何使用 gcloud CLI 运行插桩测试、Robo 或游戏循环测试。

如需查看可在 Test Lab 中对您的 Android 应用执行的 gcloud 命令的完整列表,请访问 gcloud firebase test android 参考文档

准备工作

将 Firebase 添加到您的 Android 项目(如果尚未添加)。

第 1 步:设置 gcloud CLI

  1. 下载 Google Cloud SDK
  2. 其中包括 gcloud CLI 工具。

  3. 确保您安装的版本是最新的:
    gcloud components update
    
  4. 使用您的 Google 帐号登录 gcloud CLI:
    gcloud auth login
    
  5. 在 gcloud 中设置您的 Firebase 项目,其中 PROJECT_ID 是您的 Firebase 项目的 ID:
    gcloud config set project PROJECT_ID
    

第 2 步:检查可用的测试设备

使用以下 gcloud 命令查看可用于测试的测试设备和语言区域。

您也可以选择下载示例 Notepad 应用以立即开始运行命令。使用二进制文件 app-debug-unaligned.apk 和插桩测试文件 app-debug-test-unaligned.apk(位于 NotePad/app/build/outputs/apk/ 中)。

  • models list:获取可用于测试的 Android 设备的最新列表。

    gcloud firebase test android models list
    

    在命令输出中:

    • MODEL_ID 列包含稍后针对设备机型运行测试时可以使用的标识符。
    • OS_VERSION_ID 列包含设备支持的操作系统版本。

    输出示例

    gcloud firebase test android models list 输出

  • models describe:获取特定 Android MODEL_ID 的详细信息。

    gcloud firebase test android models describe MODEL_ID
    

    输出中包含设备机型的品牌、制造商、操作系统版本、支持的 API 级别、发布日期,以及设备是真机还是虚拟设备。

  • versions list:获取当前可用于测试的操作系统版本列表。

    gcloud firebase test android versions list
    

    您稍后可以使用命令输出前两列(OS_VERSION_IDVERSION)中任意一列的标识符针对某个 Android 操作系统版本运行测试。如果您没有指定要用于测试的 Android 操作系统版本,则系统将使用 TAGS 列注明为默认值的操作系统。

    输出示例

    gcloud android versions list

  • locales list:获取可用于测试的语言区域的最新列表:

    gcloud firebase test android versions list
    

    命令输出的第一列 LOCALE 中包含了稍后针对语言区域运行测试时可以使用的标识符。如果您没有指定要用于测试的语言区域,则系统将使用英语作为默认语言区域。

运行测试

现在,您已经知道了在测试应用时可以使用的设备机型、语言区域和操作系统版本的范围,接下来可以使用 gcloud firebase test android run 命令和 --device 标志来指定运行 Robo 或插桩测试的设备。

运行 Robo 测试

即使您没有任何插桩测试,仍然可以在应用中查找错误。使用 Robo 测试可以对应用的界面进行自动审核。Robo 测试检查应用的方式是,对应用的界面中的各种路径执行静态分析,然后在应用中抓取内容以查找崩溃和其他潜在问题。

我们来通过运行一个示例命令开始测试:

gcloud firebase test android run \
  --type robo \
  --app app-debug-unaligned.apk \
  --device model=Nexus6,version=21,locale=en,orientation=portrait  \
  --device model=Nexus7,version=19,locale=fr,orientation=landscape \
  --timeout 90s

如果未指定任何 --type 值,则默认使用 --type robo 参数。 您可以通过输入 gcloud help firebase test android run 命令来查看用于运行测试的一组完整的命令行选项。 除了可以在命令行中指定所有这些参数外,您还可以选择在 YAML 格式的参数文件中指定您的参数。 运行 gcloud topic arg-files 以了解如何使用此功能。

请参阅分析测试结果部分,了解如何研究分析 Robo 测试的测试结果。

运行插桩测试

现在,使用 gcloud 命令行工具在您指定的 Android 设备配置上运行 Notepad 应用的 Espresso 测试,只需使用 instrumentation 测试类型运行 app-debug-test-unaligned.apk 中的各项测试即可,如下所示:

gcloud firebase test android run \
  --type instrumentation \
  --app app-debug-unaligned.apk \
  --test app-debug-test-unaligned.apk \
  --device model=Nexus6,version=21,locale=en,orientation=portrait  \
  --device model=Nexus7,version=19,locale=fr,orientation=landscape

如果您已使用 --test 指定了某个测试 APK,则系统默认使用 --type instrumentation 参数。除了可以在命令行中指定所有这些参数外,您还可以选择在 YAML 格式的参数文件中指定您的参数。运行 gcloud topic arg-files 以了解如何使用此功能。

gcloud CLI 支持 Android Test Orchestrator。 Orchestrator 要求搭载 AndroidJUnitRunner v1.0 或更高版本。要启用它,请将 gcloud firebase test android run 命令与
--use-orchestrator 标志结合使用。如需停用它,请使用 --no-use-orchestrator 标志。

注意:您还可以使用上面未演示的其他标志来控制测试实验室如何运行插桩测试。例如,您可以使用 --test-targets 标志,来测试您的测试 APK 所使用的单个类或单个类方法。您还可以使用“--num-flaky-test-attempts”标志,指定在一个或多个测试用例因任何原因而失败时应重新尝试执行测试作业的次数,从而确定您的失败的测试是否存在不稳定问题。如需了解详情,请参阅 gcloud firebase test android run

插桩测试的代码覆盖率报告

测试实验室支持代码覆盖率报告工具 EmmJaCoCo。如果您将上述任一工具集成到应用构建中,则可以通过运行带有以下参数的 gcloud firebase test android run 命令来获取测试实验室测试的代码覆盖率报告:

gcloud firebase test android run \
  --type instrumentation \
  --app your-app.apk \
  --test your-app-test.apk \
  --device model=TestDevice,version=AndroidVersion  \
  --environment-variables coverage=true,coverageFile="/sdcard/coverage.ec" \
  --directories-to-pull /sdcard

测试实验室完成运行测试后,请在 Google Cloud Storage 中查找代码覆盖率报告:

  1. 打开 gcloud 工具在终端中的测试结果表上方输出的 Firebase 控制台链接。
  2. 打开该链接后,从显示的列表中点击一个测试作业,以打开相应作业的详细信息页面。
  3. 点击测试结果,以转到包含该作业的测试结果的 Cloud Storage 存储分区。
  4. 打开 artifacts/coverage.ec 以查看代码覆盖率报告。

分析测试结果

几分钟后,gcloud 工具将输出您的测试结果的基本摘要:

命令测试结果

命令行测试运行的输出内容还包括一个用于查看测试结果的链接。要详细了解如何解读这些结果,请参阅分析 Firebase Android 测试实验室的结果

使用 Robo 测试实现自定义登录和文本输入

除非您使用 --no-auto-google-login 参数,否则 Robo 测试会自动在登录屏幕中填充信息,使用 Google 帐号进行身份验证。它还可以使用您提供的测试帐号凭据来填充自定义登录屏幕。您也可以使用此参数为您的应用使用的其他文本字段提供自定义输入文本。

如需填充应用中的文本字段,请使用 --robo-directives 参数,并提供以英文逗号分隔的 key-value 对列表,其中 key 是目标界面元素的 Android 资源名称,value 是文本字符串。您还可以使用此标志让 Robo 忽略特定的界面元素(例如,“退出”按钮)。 该功能支持 EditText 字段,但不支持 WebView 界面元素中的文本字段。

例如,您可以使用以下参数进行自定义登录:

--robo-directives username_resource=username,password_resource=password

可用命令和标志

测试实验室 gcloud CLI 提供了多个命令和标志,支持您使用不同的规范运行测试:

编写测试实验室 gcloud 命令脚本

除了使用 gcloud 命令行运行移动应用测试命令外,您也可以使用 shell 脚本或批处理文件自动执行这些命令。以下 bash 脚本示例会运行一项检测测试(超时值设为两分钟),并报告测试运行是否已成功完成:

if gcloud firebase test android run --app my-app.apk --test my-test.apk --timeout 2m
then
    echo "Test matrix successfully finished"
else
    echo "Test matrix exited abnormally with non-zero exit code: " $?
fi

脚本退出代码

测试实验室提供了几种退出代码,以帮助您更好地理解使用脚本或批处理文件运行的测试的结果。

测试实验室的脚本退出代码

退出代码 说明
0 所有测试作业均已通过。
1 发生了常规错误。可能的原因包括:文件名不存在或出现 HTTP/网络错误。
2 因为提供的命令或参数未知,所以测试退出。
10 测试作业中的一个或多个测试用例(被测试的类或类方法)未能通过。
15 由于发生了意外错误,Firebase 测试实验室无法确定测试矩阵是顺利通过还是失败了。
18 由于测试维度不兼容,因此不支持此测试作业的测试环境。如果所选设备类型不支持所选的 Android API 级别,则可能会出现此错误。
19 用户已取消测试矩阵。
20 发生了测试基础架构错误。