Testen mehrerer Geräte

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

Die Architektur

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

Abbildung 1. Serien von VTS-Passing-Geräten.

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

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. Zugeordnete 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 angewiesen, nicht ausgeführt zu werden). 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 Einzel- oder Mehrfachgeräte sein:

  • Zielvorbereitungen 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 die Konfiguration auf Modulebene).
    • Empfangen Sie nur eine Geräteserie.
    • Führen Sie Vorbereitungs- und Bereinigungsaufgaben für ein bestimmtes Gerät aus.
  • Zielvorbereitungen für mehrere Geräte (Beispiel bei VtsPythonVirtualenvPreparer ):
    • Kann in der Testplankonfiguration oder in der 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 Testvorbereitungen die Einrichtung des Hosts / der Geräte abgeschlossen haben. Für jedes Testmodul mit mehreren Geräten wird ein host-seitiges 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, obwohl ein Testmodul im Plan nur ein Gerät verwendet.

Gerätekommunikation während des Testens

Effektive Multi-Android-Tests umfassen 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. Die folgenden Abschnitte enthalten drei Kommunikationsbeispiele (Testentwickler können jedoch auch andere Modelle entwerfen).

Typ 1: Host-seitige HAL-Tests

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

Abbildung 2. Host-seitiger HAL-Test.

In diesem Szenario:

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

Typ 2: Host-seitige agentenbasierte Tests

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

Abbildung 3. Host-seitiger, 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 host-seitige Testskript gibt Befehle an Apps auf jedem Gerät aus.
  • Die Host-Seite koordiniert die Geräteinteraktionen.

Beispielsweise sind dieNext Billion User-Tests im aktuellen VTS-Repo host-seitige, app-basierte Tests mit mehreren Geräten.

Typ 3: Zielseitige HIDL-Tests

Zielseitige HIDL-Tests mit mehreren Geräten stellen die gesamte Testlogik auf geräteseitige Testbinärdateien, sodass die Tests Geräte während der Testausführung synchronisieren müssen:

Abbildung 4. Zielbasierter HIDL-Test.

In diesem Szenario:

  • Die Testlogik wird auf Geräten ausgeführt.
  • Das host-seitige Framework bietet eine erste Geräteidentifikation.
  • Die zielseitige Testbinärdatei erfordert eine Synchronisierung:
    • Gleiche Testbinärdatei 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 Build-Anbieter und einen VtsDeviceInfoCollector .
  • Gerät 2 enthält einen zusätzlichen FilePusher , der eine Gruppe FilePusher Dateien auf das Gerät 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>

Beispiel: Host-seitiges Python-Testskript

Einzelheiten und Beispiele zu Testvorbereitern finden Sie unter Testvorbereiter . Ein vollständiges Beispiel für ein Host- seitiges Multi-Device 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')