本頁面說明如何在測試期間,使用 Trade Federation 測試架構搭配多部裝置。您應先熟悉正常使用方式,如端對端範例所述。
使用多部裝置時有什麼不同?
在 Trade Federation 中設定及執行多裝置測試時,有幾項差異,特別是:
現有的單一裝置設定適用於多裝置模式。
<! -- TODO: Clarify the sentence immediately above by adding an example of a one-device use case as it pertains to multi-device mode in a second sentence. -->>
多裝置設定
本文假設您已熟悉一般的 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
步驟完成後執行。
另一種做法是使用在 target_preparer
步驟之前執行的 <pre_multi_target_preparer>
。
<pre_multi_target_preparer>
應用於必須在個別裝置設定前完成的設定。<multi_target_preparer>
應在個別裝置設定完成後使用。
例如:
flash device 1 (target_preparer) flash device 2 (target_preparer) bluetooth connect both devices (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 殼層中使用下列指令:
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
;請盡可能根據您預期設定的裝置類型,提供更具描述性的名稱。