自动化测试基础架构

Android 9 包含一个供应商测试套件 (VTS) 基础架构,用于在搭载 AOSP 常规系统映像 (GSI) 的合作伙伴设备上自动运行 VTS、CTS 或其他测试。以前,运行这些测试频繁需要手动操作;新的 VTS 测试基础架构可支持每天在多个设备上自动运行测试多次。

架构

VTS 自动化测试基础架构采用以下架构:

自动化测试架构

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

触发测试后,VTS 自动化测试基础架构会执行以下任务:

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

该进程由 VTS 主机控制器 (HC) 进行协调,HC 是实验室中的一台机器,用于指导在测试中连接的所有设备的行为。HC 负责获取最新版本、将其刷写到设备上,以及调用测试(本地调用或通过命令工具调用)。HC 还会与云端调度程序通信,并在调度程序和在 HC 上运行的 TradeFed 实例(或一些其他测试框架)之间引导流量。要详细了解主机控制器,请参阅主机控制器架构

资源提供程序

自动化测试需要各种资源,例如系统版本、测试文件和 VTS 软件工件。虽然可以从源代码中编译这些资源,但更简单的方式是定期从树形结构中编译它们,然后发布软件工件以供下载。

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

  • 合作伙伴 Android 版本。按帐号授予的程序化访问权限。
  • 本地文件系统(或类似位置)。针对不使用合作伙伴 Android 版本的合作伙伴。

为了在以后刷写设备时使用,资源中包含这两个选项的版本提供程序(从在本地临时目录中存储版本的单个 build_provider.py 扩展而来)。

合作伙伴 Android 版本

在 Android 8.1 及更低版本中,Android 合作伙伴需要访问合作伙伴 Android 版本网站 (https://partner.android.com/build),转到自己的帐号,然后通过界面获取最新的系统映像。为了帮助合作伙伴避免这种缓慢且耗费人力的过程,Android 9 支持在提供相关凭据后自动从 PAB 下载这些资源。

建立访问权限

程序化访问权限使用 Google API 中的 OAuth2 来访问所需的 RPC。要借助标准方法生成 OAuth2 凭据,合作伙伴必须通过 Google 设置客户端 ID/密钥对。PartnerAndroidBuildClient 在首次指向该密钥时,会打开一个浏览器窗口供用户登录 Google 帐号,以生成继续操作所需的 OAuth2 凭据。这些凭据(访问令牌和刷新令牌)存储在本地,这意味着合作伙伴只需登录一次即可。

网址 POST 请求

点击 PAB 中的资源链接即会发送一个 POST 请求,其中包含相应资源的必要数据,这些数据包括:

  • 版本号、版本目标
  • 资源名称
  • 分支
  • 候选版本名称,以及候选版本是不是内部版本

buildsvc RPC 的 downloadBuildArtifact 方法会接收 POST 请求,并返回用于访问资源的网址。

  • 对于 Clockwork Companion APK 资源,该网址是在 PAB 上托管的可读取网址(受身份验证保护,可凭相关 OAuth2 凭据进行访问)。
  • 对于其他资源,该网址是来自内部 Android Build API 的不受保护的长网址(5 分钟后即会过期)。

获取网址

为了防止跨网站请求伪造,buildsvc RPC 需要一个 XSRF 令牌才能与其他参数一起进行 POST。虽然该令牌能够让这一过程更安全,但由于现在访问也需要该令牌(仅在 PAB 页面的 JavaScript 中提供),因此程序化访问就变得更困难了。

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

本地文件系统

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

刷写版本

将最新的设备映像下载到主机后,必须将这些映像刷写到设备上。您需要根据版本提供程序存储的临时文件路径,使用标准 adbfastboot 命令以及 Python 子进程来完成相关操作。

支持的操作:

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

运行测试

在 Android 9 中,VTS 自动化测试基础架构仅支持 TradeFed 测试框架,但未来可能会支持其他框架。

设备准备完毕后,您可以使用以下任一选项来调用测试:

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

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

报告结果

VtsMultiDeviceTest 会自动将测试结果报告给一些 VTS 信息中心项目。