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.
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:
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:
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:
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 GruppeFilePusher
Dateien auf das GerätFilePusher
.
<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')