blob: ed4842ff3c377a4a127ca0962c93be402ade7016 [file] [log] [blame]
<html devsite><head>
<title>自动化测试基础架构</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>Android 9 包含一个供应商测试套件 (VTS) 基础架构,用于在搭载 AOSP 常规系统映像 (GSI) 的合作伙伴设备上自动运行 VTS、CTS 或其他测试。以前,运行这些测试频繁需要手动操作;新的 VTS 测试基础架构可支持每天在多个设备上自动运行测试多次。
</p>
<h2 id="architecture">架构</h2>
<p>VTS 自动化测试基础架构采用以下架构:</p>
<p>
<img src="images/vts-automated.png" alt="自动化测试架构" title="自动化测试架构"/>
</p>
<figcaption>
<strong>图 1.</strong> VTS 自动化测试基础架构</figcaption>
<p>触发测试后,VTS 自动化测试基础架构会执行以下任务:</p>
<ol>
<li>从不同位置获取版本软件工件和测试资源:<ul>
<li><strong>合作伙伴 Android 版本 (PAB)</strong>。针对 GSI、VTS 框架以及一些其他版本。</li>
<li><strong>本地文件系统、Google Cloud Storage 或其他特定于供应商的编译系统</strong>。针对不在 Google 云服务中存储版本的合作伙伴。</li>
</ul>
</li>
<li>将版本软件工件(来自设备)和 GIS(来自 AOSP)刷写到连接的设备。</li>
<li>使用本地 TradeFed 或云服务中的 TradeFed 运行 VTS 测试。</li>
<li>向 VTS 信息中心报告测试结果。</li>
</ol>
<p>该进程由 VTS 主机控制器 (HC) 进行协调,HC 是实验室中的一台机器,用于指导在测试中连接的所有设备的行为。HC 负责获取最新版本、将其刷写到设备上,以及调用测试(本地调用或通过命令工具调用)。HC 还会与云端调度程序通信,并在调度程序和在 HC 上运行的 TradeFed 实例(或一些其他测试框架)之间引导流量。要详细了解主机控制器,请参阅<a href="/compatibility/vts/host-controller">主机控制器架构</a>
</p>
<h2 id="resource-providers">资源提供程序</h2>
<p>自动化测试需要各种资源,例如系统版本、测试文件和 VTS 软件工件。虽然可以从源代码中编译这些资源,但更简单的方式是定期从树形结构中编译它们,然后发布软件工件以供下载。
</p>
<p>合作伙伴可以从以下位置访问自动化资源:</p>
<ul>
<li><strong>合作伙伴 Android 版本</strong>。按帐号授予的程序化访问权限。</li>
<li><strong>本地文件系统</strong>(或类似位置)。针对不使用合作伙伴 Android 版本的合作伙伴。</li>
</ul>
<p>为了在以后刷写设备时使用,资源中包含这两个选项的版本提供程序(从在本地临时目录中存储版本的单个 <code>build_provider.py</code> 扩展而来)。
</p>
<h3 id="partner-android-build">合作伙伴 Android 版本</h3>
<p>在 Android 8.1 及更低版本中,Android 合作伙伴需要访问合作伙伴 Android 版本网站 (<a href="https://partner.android.com/build" class="external">https://partner.android.com/build</a>),转到自己的帐号,然后通过界面获取最新的系统映像。为了帮助合作伙伴避免这种缓慢且耗费人力的过程,Android 9 支持在提供相关凭据后自动从 PAB 下载这些资源。
</p>
<h4 id="establishing-access">建立访问权限</h4>
<p>程序化访问权限使用 Google API 中的 OAuth2 来访问所需的 RPC。要借助<a href="https://developers.google.com/api-client-library/python/guide/aaa_oauth#flow_from_clientsecrets" class="external">标准方法</a>生成 OAuth2 凭据,合作伙伴必须通过 Google 设置客户端 ID/密钥对。<code>PartnerAndroidBuildClient</code> 在首次指向该密钥时,会打开一个浏览器窗口供用户登录 Google 帐号,以生成继续操作所需的 OAuth2 凭据。这些凭据(访问令牌和刷新令牌)存储在本地,这意味着合作伙伴只需登录一次即可。
</p>
<h4>网址 POST 请求</h4>
<p>点击 PAB 中的资源链接即会发送一个 POST 请求,其中包含相应资源的必要数据,这些数据包括:</p>
<ul>
<li>版本号、版本目标</li>
<li>资源名称</li>
<li>分支</li>
<li>候选版本名称,以及候选版本是不是内部版本</li>
</ul>
<p><code>buildsvc</code> RPC 的 <code>downloadBuildArtifact</code> 方法会接收 POST 请求,并返回用于访问资源的网址。
</p><ul>
<li>对于 Clockwork Companion APK 资源,该网址是在 PAB 上托管的可读取网址(受身份验证保护,可凭相关 OAuth2 凭据进行访问)。</li>
<li>对于其他资源,该网址是来自内部 Android Build API 的不受保护的长网址(5 分钟后即会过期)。</li>
</ul>
<h4 id="getting-url">获取网址</h4>
<p>为了防止跨网站请求伪造,<code>buildsvc</code> RPC 需要一个 XSRF 令牌才能与其他参数一起进行 POST。虽然该令牌能够让这一过程更安全,但由于现在访问也需要该令牌(仅在 PAB 页面的 JavaScript 中提供),因此程序化访问就变得更困难了。
</p>
<p>为了避免这一问题,Android 9 重新设计了所有文件(不仅仅是 APK)的网址命名方案,以使用可预测的网址名称来访问软件工件列表和软件工件网址。现在,PAB 使用一种方便的网址格式,让合作伙伴能够轻松下载资源;HC 脚本可以轻松地下载这些 APK,因为网址格式是已知的,并且 HC 可以绕过 XSRF/Cookie 问题,因为 HC 不需要 <code>buildsvc</code> RPC。</p>
<h3 id="local-filesystem">本地文件系统</h3>
<p>在获得包含软件工件列表(或 zip 文件)的目录后,版本提供程序会根据该目录中的内容设置相关映像。您可以使用 <a href="https://cloud.google.com/storage/docs/gsutil" class="external">gsutil</a> 工具将文件从 Google Cloud Storage 复制到本地目录。
</p>
<h2 id="flashing-builds">刷写版本</h2>
<p>将最新的设备映像下载到主机后,必须将这些映像刷写到设备上。您需要根据版本提供程序存储的临时文件路径,使用标准 <code>adb</code><code>fastboot</code> 命令以及 Python 子进程来完成相关操作。
</p>
<p>支持的操作:</p>
<ul>
<li>仅刷写 GSI</li>
<li>刷写来自主系统的单个映像(例如 <code>fastboot flash boot boot.img</code></li>
<li>刷写来自主系统的所有映像,例如:<ul>
<li><code>fastboot flashall</code>(使用内置的 <code>flashall</code> 实用程序)</li>
<li><code>fastboot flash</code>(一次一个)</li>
</ul>
</li>
</ul>
<h2 id="running=tests">运行测试</h2>
<p>在 Android 9 中,VTS 自动化测试基础架构仅支持 TradeFed 测试框架,但未来可能会支持其他框架。
</p>
<p>设备准备完毕后,您可以使用以下任一选项来调用测试:</p>
<ul>
<li>在本地使用 TradeFed 时,请在主机控制器中使用 <code>test</code> 命令,该命令会接受 VTS 测试计划的名称(例如 <code>vts-selftest</code>)并运行测试。</li>
<li>在使用 TradeFed Cluster(可以选择连接到 MTT)时,请在主机控制器控制台中使用 <code>lease</code> 命令,以查找未完成运行的测试。</li>
</ul>
<p>如果使用 TradeFedCluster,TradeFed 便会<a href="/compatibility/vts/host-controller">作为远程管理器在本地</a>运行。如果未使用,则使用 Python 子进程来调用测试。
</p>
<h2 id="reporting-results">报告结果</h2>
<p><code>VtsMultiDeviceTest</code> 会自动将测试结果报告给一些 VTS 信息中心项目。</p>
</body></html>