Tests auf mehreren Geräten

VTS unterstützt Tests, für die die Interaktion zwischen mehreren Android-Geräten erforderlich ist.

Architektur

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

Abbildung 1. VTS übergibt Geräteseriennummern.

Geräteanforderungen wie die Anzahl der Geräte und Gerätetypen werden in der Konfiguration des Testplans angegeben. Sie können beispielsweise einen Testplan angeben, für den zwei Android-Geräte mit Sailfish-Buildzielen erforderlich sind.

Gerätezuweisung

Die Testinfrastruktur (in der Regel der Testplaner) weist dem VTS-Framework verfügbare Geräte zu, die die in der Testplankonfiguration angegebenen Anforderungen erfüllen. Zugewiesene Geräte werden für den Testplan reserviert, auch wenn sie vom Testmodul nicht verwendet werden. Die VTS-Agent-Binärdateien werden dann auf alle zugewiesenen Geräte übertragen und dort ausgeführt, sofern nicht ausdrücklich anders angegeben. So wird sichergestellt, dass TCP-Verbindungen für Shell-Befehle und HAL-RPCs für alle Geräte in einem Testscript verfügbar sind.

Testvorbereiter

Das Framework führt Testvorbereitungen für alle Geräte aus, für die es Seriennummern erhalten hat. Zielvorbereitungen können für ein einzelnes Gerät oder mehrere Geräte erstellt werden:

  • Ersteller von Targeting-Objekten für einzelne Geräte (Beispiel unter VtsDeviceInfoCollector):
    • Kann nur in der Testplankonfiguration mit der erforderlichen Geräteliste angegeben werden. In zukünftigen Versionen ist die Konfiguration auf Modulebene möglich.
    • Sie erhalten nur eine Geräteseriennummer.
    • Aufgaben zur Vorbereitung und Bereinigung für ein bestimmtes Gerät ausführen.
  • Mehrgeräte-Zielvorbereitungen (Beispiel unter VtsPythonVirtualenvPreparer):
    • Kann in der Testplankonfiguration oder Testmodulkonfiguration angegeben werden
    • Alle Geräteseriennummern erhalten
    • Führen Sie die 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 Testmodul für mehrere Geräte wird ein hostseitiges Python-Testmodul ausgeführt. Zugewiesene Android-Geräte sind über Python-Testmodule als Liste von AndroidDevice-Objekten zugänglich:

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

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

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 werden soll. In den folgenden Abschnitten finden Sie drei Kommunikationsbeispiele. Testentwickler können jedoch auch andere Modelle entwerfen.

Typ 1: Hostseitige HAL-Tests

Für hostseitige HAL-Tests können VTS HAL-Treiber verwendet werden, die standardmäßig an Geräte gesendet werden:

Abbildung 2. Hostseitiger HAL-Test.

In diesem Szenario:

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

Typ 2: Hostseitige agentenbasierte Tests

Anstatt VTS-Agents 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 das Binary) wird auf jedem Gerät installiert.
  • Das hostseitige Testskript gibt Befehle an Apps auf jedem Gerät aus.
  • Die Geräteinteraktionen werden auf Hostseite koordiniert.

Die Next Billion User-Tests im aktuellen VTS-Repository sind beispielsweise hostseitige, appbasierte und mehrgerätefähige Tests.

Typ 3: Zielseitige HIDL-Tests

Bei zielseitigen HIDL-Tests für mehrere Geräte wird die gesamte Testlogik in geräteseitige Testbinärdateien verschoben. Daher müssen die Geräte während der Testausführung synchronisiert werden:

Abbildung 4. Zielbasierter HIDL-Test.

In diesem Szenario:

  • Die Testlogik wird auf Geräten ausgeführt.
  • Das hostseitige Framework bietet die anfängliche Geräteidentifikation.
  • Für die Zielseite erforderliche Synchronisierung von Test-Binärdateien:
    • Dasselbe Test-Binary für alle Geräte.
    • Unterschiedliche Test-Binärdateien für jede Rolle.

Beispiel: Testplan für mehrere Geräte

In diesem Beispiel wird die Konfiguration für zwei Geräte angegeben:

  • Gerät 1 enthält einen Buildanbieter und einen VtsDeviceInfoCollector-Zielvorbereiter.
  • Gerät 2 enthält einen zusätzlichen FilePusher-Vorbereiter, der eine Gruppe von hostbasierten 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-Testscript

Details und Beispiele zu Testvorbereitungen finden Sie unter Testvorbereitungen. 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')