使用多部裝置執行測試

本頁面說明如何在測試期間,使用 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 介面。

如要讓測試接收受測裝置,您可以實作 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 殼層中使用下列指令:

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;請盡可能根據您預期設定的裝置類型,提供更具描述性的名稱。