本页面可帮助您在测试期间将 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 接口。
如需使测试接收被测设备,您可以实现 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,该示例展示了如何接收设备及其 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 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
;如果可能,您应该提供更具描述性的名称,具体取决于您真正想要设置的设备的类型。