Multi-Device-Tests

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

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-Übergabegeräteserien.

Geräteanforderungen wie 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-Build-Zielen erfordert.

Gerätezuordnung

Die Testinfrastruktur (normalerweise der Testplaner) weist verfügbare Geräte, die die in der Testplankonfiguration spezifizierten Anforderungen erfüllen, dem VTS-Framework zu. Zugewiesene Geräte werden 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 einzelne 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 werden eine Konfiguration auf Modulebene ermöglichen).
    • 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 Bereinigungstasks für jedes Gerät oder alle Geräte aus.

Module testen

Testmodule erhalten eine Liste der Geräte, nachdem die Testvorbereiter die Einrichtung des Hosts/der Geräte abgeschlossen haben. Für jedes geräteübergreifende 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 werden für den Testplan reserviert, obwohl ein Testmodul im Plan nur ein Gerät verwendet.

Gerätekommunikation während des Tests

Effektive Multi-Android-Tests beinhalten 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 (Testentwicklern steht es jedoch frei, andere Modelle zu entwerfen).

Typ 1: Hostseitige HAL-Tests

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

Abbildung 2. Hostseitiger HAL-Test.

In diesem Szenario:

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

Typ 2: Hostseitige agentenbasierte Tests

Anstatt VTS-Agenten auf dem Gerät zu verwenden, kann ein hostseitiger Test auch seinen 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 sind die Next Billion User-Tests im aktuellen VTS-Repo hostseitige, app-basierte Multi-Device-Tests.

Typ 3: Zielseitige HIDL-Tests

Zielseitige, geräteübergreifende HIDL-Tests platzieren die gesamte Testlogik auf geräteseitigen Testbinärdateien, 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 bietet eine anfängliche Geräteidentifikation.
  • Die zielseitige Testbinärdatei erfordert eine Synchronisierung:
    • Gleiche Testbinärdatei für alle Geräte.
    • Unterschiedliche 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-Provider und einen VtsDeviceInfoCollector -Zielvorbereiter.
  • Gerät 2 enthält einen zusätzlichen FilePusher -Vorbereiter, der eine Gruppe hostgesteuerter zugehöriger 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')