使用多设备运行测试

本页面帮助您在测试期间将 Trade Federation 测试工具与多个设备结合使用。您应先熟悉正常用法,如端到端示例中所述。

多设备有何不同?

在 Trade Federation 中配置和运行多设备测试时,有几点不同,尤其是:

任何现有单设备配置对于多设备模式均有效。

<! -- TODO: 通过添加一个单设备用例示例(因为它与第二句话中的多设备模式相关)来阐明紧接上文的句子。 -->>

多设备配置

本文档假定您已熟悉典型的 TF 测试配置。以下是包含两个设备的典型测试配置的外观:

<configuration description="A simple multi-devices example in Tradefed">

    <device name="device1">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <option name="log-level" value="verbose" />
    <test class="com.android.tradefed.HelloWorldMultiDevices" />

    <logger class="com.android.tradefed.log.FileLogger" />
    <result_reporter class="com.android.tradefed.result.ConsoleResultReporter" />

</configuration>

需要提及结构方面的几个事项:

  • 对于所需的每个设备,都需要一个 <device>
  • <build_provider><target_preparer><device_recovery><device_requirements><device_options>(如果需要)必须包含在 <device> 标记内;否则会抛出异常。
  • <device>name 属性是强制性的,并且在配置中存在的所有设备中应该是唯一的。它用于引用与其关联的特定设备。这允许您的测试以特定设备为目标。
  • <option> 可以在配置根目录时具有全局作用域,或者在 <device> 标记内指定时限制为设备作用域。

适用于单设备配置的所有其他规则仍然适用于此处。有关更多详细信息,请参阅下面的Hello World 示例

命令行更新

在 TF 命令行中指定选项时,也可以使用 {<device name>} 指定设备作用域,其中 <device name> 是 XML 配置中指定的名称。

在上面的示例中,允许以下选项:

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

您可以使用设备名称仅以一个设备 build_provider 对象为目标,如下所示:

--{device2}device-setup:disable

在此示例中,device2 跳过设备设置,而 device1 不跳过。

TF 如何选择设备?

Trade Federation 按照设备在配置中出现的顺序查找与 device_requirements(通常是设备类型、产品等)匹配的设备。每次分配设备时,TF 都会尝试分配下一个设备。如果无法分配所有设备,则将全部释放这些设备,并在匹配所有设备后重新尝试该命令。

TF 如何准备设备?

多设备的准备步骤与单设备基本相同。每个设备都通过按照 <device> 中出现的顺序调用 <target_preparer> 来进行准备。

您还可以使用在配置根目录中指定的 <multi_target_preparer>,它允许执行需要多个设备的准备步骤,例如设备配对。它在 target_preparer 步骤之后运行。

另一种选择是 <pre_multi_target_preparer>,它在 target_preparer 步骤之前运行。

  • <pre_multi_target_preparer> 应该用于必须在单独设备设置之前完成的设置。
  • <multi_target_preparer> 应该用于必须在单独设备设置之后完成的设置。

例如

刷写设备 1 (target_preparer) 刷写设备 2 (target_preparer) 蓝牙连接两个设备 (multi_target_preparer)

编写多设备测试

在编写常规单设备测试时,您需要实现 IDeviceTest 接口。

为了让测试接收被测设备,您可以实现 IMultiDeviceTestIInvocationContextReceiver

IMultiDeviceTest 为您提供设备到其 IBuildInfo 的直接映射,而 IInvocationContextReceiver 稍后为您提供完整的上下文(设备、IBuildInfo 和元数据)。

然后,您将能够使用 TF 提供的常用的 ITestDevice API 来编写测试。

目前还没有 API 可以执行从一个设备到另一个设备的操作,例如 device1.sync(device2)。如果您认为您有令人信服的用例需要支持,请将您的理由发送到 android-platform 列表。

多设备 Hello World 示例

我们添加了一个类似 Hello World 的示例配置:multi-devices.xml。还有一个 multi_target_preparer 实现示例 HelloWorldMultiTargetPreparer,展示了如何接收设备列表及其构建版本。

这是一个完整的示例,涉及

  • 分配两个设备
  • 通过 multi_target_preparer 访问两个设备
  • 运行使用两个设备的测试

构建 Tradefed 后,您可以在 TF shell 中使用以下命令

run example/multi-devices

您应该看到一些包含以下内容的输出

08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' from context with build 'com.android.tradefed.build.DeviceBuildInfo@c99cbc1'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' from context with build 'com.android.tradefed.build.DeviceBuildInfo@b41f20c5'

您需要连接两个设备才能运行上述命令。可以通过以下方式检查:adb devices

当调用正在进行时,您可以像监控单设备一样使用 list ilist d 来监控它

tf >list i
Command Id  Exec Time  Device                          State
1           0m:35      [00b4e73b4cbcd162, LP5A390056]  fetching build
tf >list d
Serial            State      Product   Variant   Build   Battery
00b4e73b4cbcd162  Allocated  bullhead  bullhead  NRD90O  100
LP5A390056        Allocated  shamu     shamu     NRD90I  100

您应该能够看到每个调用中涉及的设备,以及所有可用的设备及其各自的状态。

请注意,在本示例中,我们在配置中将两个设备称为 device1device2;如果可能,您应该根据您真正期望设置的设备类型给出更具描述性的名称。