多裝置測試

VTS 支援需要在多個 Android 之間互動的測試 裝置。

建築

VTS 使用 TradeFed 架構取得並傳遞裝置序列進行測試 模組。

圖 1. VTS 通過裝置序列。

裝置需求 (例如裝置和裝置類型的數量) 會在測試計畫設定中指定。舉例來說,您可以指定測試計畫 則需要兩部搭載 Sailfish 建立目標的 Android 裝置。

裝置分配

可用的測試基礎架構 (通常是測試排程器) 分配 符合測試計畫設定中指定的需求的裝置 就能建立 VTS 架構即使分配到的裝置仍是測試方案, 測試模組目前未使用。然後,系統會將 VTS 代理程式二進位檔推送至實際工作環境 所有已分配的裝置 (除非明確指示不要執行)。這可以確保 所有適用於殼層指令和 HAL RPC 的 TCP 連線均可使用 測試指令碼中的裝置數量

考試準備者

這個架構會針對所有收到測試的裝置執行測試準備工具 序號。目標準備工具可以是單部或多裝置:

  • 單一裝置目標準備工具 (例如 VtsDeviceInfoCollector):
    • 只能在具備必要屬性的測試計畫設定中指定 裝置清單 (日後的版本將允許模組層級設定)。
    • 只能接收一個裝置序列。
    • 針對特定裝置執行準備及清除工作。
  • 指定多裝置目標準備人員 (例如: VtsPythonVirtualenvPreparer):
    • 可在測試計畫設定或測試模組中指定 設定
    • 接收所有裝置序列
    • 為個別裝置或所有裝置執行準備及清除工作。

測試模組

測試模組會在測試準備人員完成設定後取得裝置清單 主機/裝置。每個多裝置都會執行一個主機端 Python 測試模組 測試模組。可透過 Python 測試模組存取配置的 Android 裝置 做為 Android 裝置 物件:

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

即使在測試期間,所有配置的裝置仍保留用於測試計畫 方案中的模組只能使用一部裝置。

測試期間的裝置通訊

有效的多 Android 測試涉及在分配到 裝置。開發這類測試時,您必須決定 之間的通訊以下各節將說明 提供三種溝通方式 (但測試開發人員可以自由設計其他 模型)。

類型 1:主機端 HAL 測試

主機端 HAL 測試可使用 VTS HAL 驅動程式,這些驅動程式 預設:

圖 2.主機端 HAL 測試。

在這種情況下:

  • 測試邏輯會在主機上執行。
  • 主機端測試指令碼會向每部裝置的驅動程式發出 RPC 呼叫。
  • 主機端協調裝置互動情形。

類型 2:以主機端代理程式為基礎的測試

除了在裝置中使用 VTS 代理程式外,主機端測試也可以 (應用程式或二進位檔) 發布至每部裝置:

圖 3.主機端、代理程式式測試。

在這種情況下:

  • 測試邏輯會在主機上執行。
  • 在每部裝置上安裝代理程式應用程式 (或二進位檔)。
  • 主機端測試指令碼會向每個裝置上的應用程式發出指令。
  • 主機端協調裝置互動情形。

舉例來說, 下一步 在目前的 VTS 存放區中,有數十億使用者測試,針對以主機端和應用程式為基礎的 跨裝置測試

類型 3:目標端 HIDL 測試

目標端、多裝置 HIDL 測試會在裝置端測試中加入所有測試邏輯 二進位檔,測試時必須在測試期間同步處理裝置。 執行作業:

圖 4.以目標為基礎的 HIDL 測試。

在這種情況下:

  • 測試邏輯會在裝置上執行。
  • 主機端架構提供初始裝置識別。
  • 目標端測試二進位檔需要同步處理:
    • 為所有裝置使用相同的測試二進位檔。
    • 每個角色的不同測試二進位檔。

示例:多裝置測試計畫

以下範例指定了兩部裝置的設定:

  • 裝置 1 包含建構供應器 VtsDeviceInfoCollector 目標準備者。
  • 裝置 2 包含額外的 FilePusher 準備工具,可用於推送 一組主機驅動的相關檔案至裝置。
<configuration description="VTS Codelab Plan">
  ...
<device name="device1">
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
</device>
<device name="device2" >
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
<option name="push-group" value="HostDrivenTest.push" />
</target_preparer>
</device>
<option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" />
</configuration>

範例:主機端 Python 測試指令碼

如需測試準備者的詳細資訊和範例,請參閱 測試準備者。若使用完整的主機端 跨裝置範例,請參考 hello_world_multi 程式碼研究室

def setUpClass(self):
logging.info('number of device: %s', self.android_devices)
asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.')
self.dut1 = self.android_devices[0]
self.dut2 = self.android_devices[1]
self.shell1 = self.dut1.shell
self.shell2 = self.dut2.shell

def testSerialNotEqual(self):
'''Checks serial number from two device not being equal.'''
command = 'getprop | grep ro.serial'
res1 = self.shell1.Execute(command)
res2 = self.shell2.Execute(command)

def getSerialFromShellOutput(output):
'''Get serial from getprop query'''
return output[const.STDOUT][0].strip().split(' ')[-1][1:-1]
serial1 = getSerialFromShellOutput(res1)
serial2 = getSerialFromShellOutput(res2)

logging.info('Serial number of device 1 shell output: %s', serial1)
logging.info('Serial number of device 2 shell output: %s', serial2)
asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same')
asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial')
asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')