Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

多設備測試

VTS支持需要多個Android設備之間進行交互的測試。

建築

VTS使用TradeFed框架來獲取設備序列並將其傳遞給測試模塊。

圖1. VTS傳遞設備序列號。

在測試計劃配置中指定了設備要求,例如設備數量和設備類型。例如,您可以指定一個需要兩個帶有Sailfish構建目標的Android設備的測試計劃。

設備分配

測試基礎結構(通常是測試計劃程序)將滿足測試計劃配置中指定要求的可用設備分配給VTS框架。即使測試模塊未使用已分配的設備,也為測試計劃保留了設備。然後,將VTS代理二進製文件推送到所有已分配的設備上並在其上運行(除非特別指示不要運行)。這樣可以確保測試腳本中的所有設備都可以使用Shell命令和HAL RPC的TCP連接。

考試準備人員

該框架為收到序列號的所有設備運行測試準備器。目標準備者可以是單設備或多設備:

  • 單設備目標準備器(例如VtsDeviceInfoCollector ):
    • 只能在帶有所需設備列表的測試計劃配置中指定(將來的版本將允許模塊級配置)。
    • 僅接收一個設備序列號。
    • 針對特定設備運行準備和清理任務。
  • 多設備目標準備器(例如VtsPythonVirtualenvPreparer ):
    • 可以在測試計劃配置或測試模塊配置中指定
    • 接收所有設備序列號
    • 為每個設備或所有設備運行準備和清理任務。

測試模塊

在測試準備者完成主機/設備的設置之後,測試模塊將獲得設備列表。每個多設備測試模塊都運行一個主機端Python測試模塊。可從Python測試模塊以AndroidDevice對象列表的形式訪問已分配的Android設備:

第137章

即使計劃中的測試模塊僅使用一個設備,所有分配的設備仍保留給測試計劃。

測試期間的設備通訊

有效的多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 codelab

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')