自动化测试基础设施

Android 9 包含供应商测试套件 (VTS) 基础设施,用于在运行 AOSP 通用系统映像 (GSI) 的合作伙伴设备上自动测试 VTS、CTS 或其他测试。以前,运行这些测试是一项高度手动化的操作;新的 VTS 测试基础设施旨在支持每天在多台设备上多次进行自动化测试。

架构

VTS 自动化测试基础设施使用以下架构

Automated test architecture

图 1. VTS 自动化测试基础设施架构

当测试被触发时,VTS 自动化测试基础设施执行以下任务

  1. 从不同位置提取构建工件和测试资源
    • 合作伙伴 Android 构建 (PAB)。适用于 GSI、VTS 框架和一些其他构建。
    • 本地文件系统、Google Cloud Storage 或其他供应商特定的构建系统。适用于不将构建存储在 Google 云端中的合作伙伴。
  2. 将构建工件(来自设备)和 GSI(来自 AOSP)刷写到连接的设备上。
  3. 使用本地 TradeFed 或云端 TradeFed 运行 VTS 测试。
  4. 向 VTS 信息中心报告测试结果

此过程由 VTS 主机控制器 (HC) 协调,主机控制器是实验室中的一台机器,用于指导所有连接的被测设备的行为。HC 负责获取最新的 build、将它们刷写到设备上,以及调用测试(在本地或通过指挥器)。它还与云端调度器通信,并指导调度器与在 HC 上运行的 TradeFed 实例(或其他 harness)之间的流量。有关主机控制器的详细信息,请参阅主机控制器架构

资源提供程序

自动化测试需要资源,例如系统 build、测试文件和 VTS 工件。虽然可以从源代码构建这些资源,但更简单的方法是从代码库的最新版本定期构建,然后发布工件以供下载。

合作伙伴可以使用以下位置访问自动化资源

  • Partner Android Build。根据帐户授予编程访问权限。
  • 本地文件系统(或类似位置)。适用于不使用 Partner Android Build 的合作伙伴。

为了稍后用于刷写设备,资源包括适用于这两种选项的 build 提供程序,它们都扩展自单个 build_provider.py,该文件将 build 存储在本地临时目录中。

Partner Android Build

在 Android 8.1 及更低版本中,Android 合作伙伴需要访问 Partner Android Build 网站 (https://partner.android.com/build),导航到他们的帐户,并通过用户界面获取最新的系统映像。为了帮助合作伙伴避免这种缓慢而费力的过程,Android 9 包含了从 PAB 自动下载这些资源的支持(在提供适当的凭据后)。

建立访问权限

编程访问使用 Google API 上的 OAuth2 来访问所需的 RPC。使用标准方法生成 OAuth2 凭据时,合作伙伴必须使用 Google 设置客户端 ID/密钥对。当 PartnerAndroidBuildClient 首次指向该密钥时,它会打开一个浏览器窗口,供用户登录其 Google 帐户,这将生成继续操作所需的 OAuth2 凭据。凭据(访问令牌和刷新令牌)存储在本地,这意味着合作伙伴只需登录一次。

针对 URL 的 POST 请求

点击 PAB 中的资源链接会发送一个 POST 请求,其中包含该资源的必要数据,包括

  • build ID,build 目标
  • 资源名称
  • 分支
  • 发布候选版本名称以及候选版本是否为内部 build

POST 请求由 buildsvc RPC 的 downloadBuildArtifact 方法接收,该方法返回一个可用于访问资源的 URL。

  • 对于 Clockwork Companion APK 资源,该 URL 是 PAB 上托管的可读 URL(受身份验证保护,并且可以使用适当的 OAuth2 凭据进行访问)。
  • 对于其他资源,该 URL 是来自内部 Android Build API 的长而未受保护的 URL(五分钟后过期)。

获取 URL

为了避免跨站点请求伪造,buildsvc RPC 需要将 XSRF 令牌与其他参数一起 POST。虽然此令牌使过程更安全,但也使编程访问更加困难,因为现在访问也需要令牌(该令牌仅在 PAB 页面的 JavaScript 中可用)。

为了避免此问题,Android 9 重新设计了所有文件(不仅仅是 APK)的 URL 命名方案,以使用可预测的 URL 名称来访问工件列表和工件 URL。PAB 现在使用方便的 URL 格式,使合作伙伴能够下载资源;HC 脚本可以轻松下载这些 APK,因为 URL 格式是已知的,并且 HC 可以绕过 XSRF/cookie 问题,因为它不需要 buildsvc RPC。

本地文件系统

给定一个包含工件列表(或 zip 文件)的目录,build 提供程序会根据目录中的内容设置相关的映像。您可以使用 gsutil 工具将文件从 Google Cloud Storage 复制到本地目录。

刷写 build

在最新的设备映像下载到主机后,必须将这些映像刷写到设备上。这是使用标准的 adbfastboot 命令以及 Python 子进程完成的,基于 build 提供程序存储的临时文件路径。

支持的操作

  • 仅刷写 GSI
  • 从主系统刷写单个映像(例如,fastboot flash boot boot.img
  • 从主系统刷写所有映像。示例
    • fastboot flashall(使用内置的 flashall 实用程序)
    • fastboot flash(一次一个)

运行测试

在 Android 9 中,VTS 自动化测试基础架构仅支持 TradeFed 测试 harness,但将来可以扩展以支持其他 harness。

设备准备就绪后,您可以使用以下选项之一调用测试

  • 当在本地使用 TradeFed 时,请在主机控制器中使用 test 命令,该命令接受 VTS 测试计划的名称(例如 vts-selftest)并运行测试。
  • 当使用 TradeFed 集群(可以选择连接到 MTT)时,请在主机控制器控制台中使用 lease 命令,该命令查找未完成的测试运行。

如果使用 TradeFedCluster,TradeFed 将在本地作为远程管理器运行。否则,测试将使用 Python 子进程调用。

报告结果

测试结果由 VtsMultiDeviceTest 自动报告给某些 VTS 信息中心项目。