开始使用 gcloud CLI 执行测试

Firebase 测试实验室提供了用于测试 Android 应用的云基础架构,包括与 gcloud 命令行界面 (CLI) 的全面集成。本文档介绍了通过 gcloud CLI 开始使用测试实验室所需的安装和配置知识。

如需可在测试实验室中对您的 Android 应用执行的 gcloud 命令的完整列表,请访问 gcloud firebase test android 参考文档

创建 Firebase 项目

如果您还没有为自己的应用准备 Firebase 项目,请转到 Firebase 控制台,点击新建项目来创建一个项目。您需要拥有项目的所有权或修改权限。

在 Spark 和 Flame 方案中,您每天可使用测试实验室执行的测试作业有数量限制。要想在使用测试实验室时不受每日配额限制,您必须升级为 Firebase Blaze 方案。

设置 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
    

配置测试

在此示例中,您将针对一个名为“Notepad”的简单 Android 笔记应用运行一些测试。

  1. 下载 Notepad 应用的二进制 APK 文件 (app-debug-unaligned.apk) 及其对应的插桩测试 (app-debug-test-unaligned.apk),它们均包含在 notepad.zipNotePad/app/build/outputs/apk/ 目录中。

  2. 获取可用于测试的 Android 设备的最新列表,如下所示:

    
    $ gcloud firebase test android models list
    
    gcloud firebase test android models list 输出 命令输出的第一列 MODEL_ID 中包含您稍后运行测试时,可用于指定特定机型的标识符。OS_VERSION_ID 列显示该设备支持的操作系统版本。如果您没有指定要测试的 MODEL_ID,则系统将使用 TAGS 列注明为默认值的机型。

  3. 使用 firebase test android models describe 命令可以详细了解某个特定的 Android MODEL_ID,如下所示:

    
    $ gcloud firebase test android models describe Nexus5
    
    上面的示例命令可获取有关 Nexus5 机型的详细信息,包括品牌、制造商、支持的 API 级别,以及该机型是真机还是虚拟设备。

  4. 获取可用于测试的 Android 操作系统版本的最新列表:

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

  5. 获取可用于测试的语言区域的最新列表:

    
    $ gcloud firebase test android locales 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. 点击测试结果,以转到包含该作业的测试结果的 Google 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 发生了测试基础架构错误。