Android 9 包含供应商测试套件 (VTS) 基础设施,用于在运行 AOSP 通用系统映像 (GSI) 的合作伙伴设备上自动测试 VTS、CTS 或其他测试。以前,运行这些测试是一项高度手动化的操作;新的 VTS 测试基础设施旨在支持每天在多台设备上多次进行自动化测试。
架构
VTS 自动化测试基础设施使用以下架构
当测试被触发时,VTS 自动化测试基础设施执行以下任务
- 从不同位置提取构建工件和测试资源
- 合作伙伴 Android 构建 (PAB)。适用于 GSI、VTS 框架和一些其他构建。
- 本地文件系统、Google Cloud Storage 或其他供应商特定的构建系统。适用于不将构建存储在 Google 云端中的合作伙伴。
- 将构建工件(来自设备)和 GSI(来自 AOSP)刷写到连接的设备上。
- 使用本地 TradeFed 或云端 TradeFed 运行 VTS 测试。
- 向 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
在最新的设备映像下载到主机后,必须将这些映像刷写到设备上。这是使用标准的 adb
和 fastboot
命令以及 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 信息中心项目。