Tests auf verschiedenen Geräten

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

Architektur

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

Abbildung 1. Seriennummern von Geräten, die den VTS-Test bestehen.

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

Gerätezuweisung

Die Testinfrastruktur (in der Regel der Test-Scheduler) weist dem VTS-Framework verfügbare Geräte zu, die die in der Testplan-Konfiguration angegebenen Anforderungen erfüllen. Zugewiesene Geräte sind für den Testplan reserviert, auch wenn das Testmodul sie nicht verwendet. 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 Testskript verfügbar sind.

Prüfungsvorbereiter

Das Framework führt Test-Preparer für alle Geräte aus, für die es Seriennummern erhalten hat. Zielvorbereitungen können für ein einzelnes oder mehrere Geräte erfolgen:

  • Vorbereiter für Einzelgerä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.
    • Vorbereitungs- und Bereinigungsaufgaben auf einem bestimmten Gerät ausführen
  • Multi-Device-Target-Preparer (Beispiel unter VtsPythonVirtualenvPreparer):
    • Kann in der Testplan- oder Testmodulkonfiguration angegeben werden
    • Alle Geräteseriennummern erhalten
    • Führen Sie Vorbereitungs- und Bereinigungsaufgaben für jedes Gerät oder alle Geräte aus.

Module testen

Testmodule erhalten eine Liste von Geräten, 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 in einem Testmodul im Plan nur ein Gerät verwendet wird.

Gerätekommunikation während des Tests

Für effektive Multi-Android-Tests ist die Kommunikation zwischen zugewiesenen Geräten erforderlich. Bei der Entwicklung solcher Tests müssen Sie festlegen, wie die Kommunikation zwischen den zugewiesenen Geräten erfolgen soll. In den folgenden Abschnitten finden Sie 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 auf 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: Hostseitige agentbasierte Tests

Anstatt VTS-Agents auf dem Gerät zu verwenden, kann ein Host-seitiger Test auch einen eigenen Agent (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 Binärprogramm) wird auf jedem Gerät installiert.
  • Das hostseitige Testskript sendet Befehle an Apps auf jedem Gerät.
  • Die Hostseite koordiniert Geräteinteraktionen.

Die Next Billion User-Tests im aktuellen VTS-Repository sind beispielsweise Host-seitige, App-basierte Tests auf mehreren Geräten.

Typ 3: HIDL-Tests auf der Zielseite

Bei HIDL-Tests für mehrere Geräte auf der Zielseite befindet sich die gesamte Testlogik in Testbinärdateien auf dem Gerät. 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 Host-seitige Framework bietet eine erste Geräteidentifizierung.
  • Für die Test-Binärdatei auf dem Zielgerät ist eine Synchronisierung erforderlich:
    • Dasselbe Test-Binärprogramm für alle Geräte.
    • Für jede Rolle sind unterschiedliche Test-Binärdateien erforderlich.

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 Build-Anbieter und einen VtsDeviceInfoCollector-Zielvorbereiter.
  • Gerät 2 enthält einen zusätzlichen FilePusher-Vorbereiter, der eine Gruppe von hostgesteuerten zugehörigen 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

Details und Beispiele zu Test-Preparern finden Sie unter Test-Preparer. Ein vollständiges Beispiel für die Hostseite mit mehreren Geräten 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')