Tests mit mehreren Geräten

VTS unterstützt Tests, die eine Interaktion zwischen mehreren Android-Geräten erfordern.

Die Architektur

VTS verwendet das TradeFed-Framework, um Geräteserien abzurufen und an Testmodule weiterzuleiten.

Abbildung 1. VTS übergibt Geräteserien.

Geräteanforderungen, wie z. B. Anzahl der Geräte und Gerätetypen, werden in der Testplankonfiguration angegeben. Sie können beispielsweise einen Testplan angeben, der zwei Android-Geräte mit Sailfish-Buildzielen erfordert.

Gerätezuordnung

Die Testinfrastruktur (normalerweise der Testplaner) weist dem VTS-Framework verfügbare Geräte zu, die die in der Testplankonfiguration angegebenen Anforderungen erfüllen. Zugewiesene Geräte bleiben für den Testplan reserviert, auch wenn das Testmodul sie nicht verwendet. Die Binärdateien des VTS-Agenten werden dann auf alle zugewiesenen Geräte übertragen und dort ausgeführt (sofern nicht ausdrücklich angewiesen wird, sie nicht auszuführen). Dadurch wird sichergestellt, dass TCP-Verbindungen für Shell-Befehle und HAL-RPCs für alle Geräte in einem Testskript verfügbar sind.

Testvorbereiter

Das Framework führt Testvorbereitungen für alle Geräte aus, für die es Seriennummern erhalten hat. Zielvorbereiter können ein oder mehrere Geräte sein:

  • Zielvorbereiter für einzelne Geräte (Beispiel bei VtsDeviceInfoCollector ):
    • Kann nur in der Testplankonfiguration mit der erforderlichen Geräteliste angegeben werden (zukünftige Versionen ermöglichen eine Konfiguration auf Modulebene).
    • Erhalten Sie nur eine Geräteserie.
    • Führen Sie Vorbereitungs- und Bereinigungsaufgaben für ein bestimmtes Gerät aus.
  • Zielvorbereiter für mehrere Geräte (Beispiel bei VtsPythonVirtualenvPreparer ):
    • Kann in der Testplankonfiguration oder Testmodulkonfiguration angegeben werden
    • Erhalten Sie alle Geräteserien
    • Führen Sie Vorbereitungs- und Bereinigungsaufgaben für jedes Gerät oder alle Geräte aus.

Testmodule

Testmodule erhalten eine Liste der Geräte, nachdem die Testvorbereiter die Einrichtung des Hosts/der Geräte abgeschlossen haben. Für jedes Multi-Device-Testmodul wird ein hostseitiges Python-Testmodul ausgeführt. Auf zugewiesene Android-Geräte kann über Python-Testmodule als Liste von AndroidDevice- Objekten zugegriffen werden:

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

Alle zugewiesenen Geräte sind für den Testplan reserviert, auch wenn ein Testmodul im Plan nur ein Gerät verwendet.

Gerätekommunikation während des Tests

Effektive Multi-Android-Tests erfordern die Kommunikation zwischen zugewiesenen Geräten. Bei der Entwicklung solcher Tests müssen Sie festlegen, wie die Kommunikation zwischen den zugewiesenen Geräten hergestellt wird. Die folgenden Abschnitte enthalten drei Kommunikationsbeispiele (Testentwickler können jedoch auch andere Modelle entwerfen).

Typ 1: Hostseitige HAL-Tests

Hostseitige HAL-Tests können VTS-HAL-Treiber verwenden, die standardmäßig an Geräte übertragen werden:

Abbildung 2. Hostseitiger HAL-Test.

In diesem Szenario:

  • Die Testlogik wird auf dem Host ausgeführt.
  • Das hostseitige Testskript sendet RPC-Aufrufe an die Treiber auf jedem Gerät.
  • Die Hostseite koordiniert Geräteinteraktionen.

Typ 2: Agentenbasierte Tests auf der Hostseite

Anstatt VTS-Agenten auf dem Gerät zu verwenden, kann ein hostseitiger Test auch einen eigenen Agenten (App oder Binärdatei) auf jedes Gerät übertragen:

Abbildung 3. Hostseitiger, agentenbasierter Test.

In diesem Szenario:

  • Die Testlogik wird auf dem Host ausgeführt.
  • Die Agent-App (oder Binärdatei) wird auf jedem Gerät installiert.
  • Das hostseitige Testskript gibt Befehle an Apps auf jedem Gerät aus.
  • Die Hostseite koordiniert Geräteinteraktionen.

Beispielsweise handelt es sich bei den Next Billion User-Tests im aktuellen VTS-Repo um hostseitige, anwendungsbasierte Tests für mehrere Geräte.

Typ 3: Zielseitige HIDL-Tests

Zielseitige HIDL-Tests für mehrere Geräte legen die gesamte Testlogik auf geräteseitigen Testbinärdateien ab, was erfordert, dass die Tests Geräte während der Testausführung synchronisieren:

Abbildung 4. Zielbasierter HIDL-Test.

In diesem Szenario:

  • Testlogik wird auf Geräten ausgeführt.
  • Das hostseitige Framework ermöglicht die anfängliche Geräteidentifizierung.
  • Die Testbinärdatei auf der Zielseite erfordert eine Synchronisierung:
    • Gleiche Testbinärdatei für alle Geräte.
    • Verschiedene Testbinärdateien für jede Rolle.

Beispiel: Testplan für mehrere Geräte

Dieses Beispiel gibt die Konfiguration für zwei Geräte an:

  • Gerät 1 enthält einen Build-Anbieter und VtsDeviceInfoCollector Zielvorbereiter.
  • Gerät 2 enthält einen zusätzlichen FilePusher Vorbereiter, der eine Gruppe hostgesteuerter verwandter Dateien auf das Gerät überträgt.
<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>

Beispiel: Hostseitiges Python-Testskript

Einzelheiten und Beispiele zu Testvorbereitern finden Sie unter Testvorbereiter . Ein vollständiges hostseitiges Beispiel für mehrere Geräte finden Sie im Codelab 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')