使用多台设备运行测试

本页面可帮助您在测试期间将 Trade Federation 自动化测试框架用于多台设备。您应该首先熟悉一下端到端示例中所述的常规用法。

使用多台设备时有什么不同之处?

在 Trade Federation 中配置和运行多设备测试时,一些方面会有所不同,尤其是以下方面:

任何现有的单设备配置在多设备模式下均有效。

<! -- 待办事项:通过添加一个单设备用例的示例立即澄清上面一句话,因为它与第二句话中的多设备模式相关。 -->>

多设备配置

本文档假设您已熟悉典型的 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,该示例展示了如何接收设备及其 build 的列表。

它是一个完整示例,其中涉及:

  • 分配两台设备
  • 通过 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;如果可能,您应该提供更具描述性的名称,具体取决于您真正想要设置的设备的类型。