本页面帮助您在测试期间将 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 接口。
为了让测试接收被测设备,您可以实现 IMultiDeviceTest 或 IInvocationContextReceiver。
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 i
和 list 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
您应该能够看到每个调用中涉及的设备,以及所有可用的设备及其各自的状态。
请注意,在本示例中,我们在配置中将两个设备称为 device1
和 device2
;如果可能,您应该根据您真正期望设置的设备类型给出更具描述性的名称。