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.
Geräteanforderungen, wie z. B. 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-Buildzielen erfordert.
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. Zugewiesene Geräte bleiben 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 ein 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 ermöglichen eine Konfiguration auf Modulebene).
- 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 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 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 ein Testmodul im Plan nur ein Gerät verwendet.
Gerätekommunikation während des Tests
Effektive Multi-Android-Tests erfordern 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 (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 an Geräte übertragen werden:
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: Agentenbasierte Tests auf der Hostseite
Anstatt VTS-Agenten auf dem Gerät zu verwenden, kann ein hostseitiger Test auch einen eigenen Agenten (App oder Binärdatei) 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 hostseitige Testskript gibt Befehle an Apps auf jedem Gerät aus.
- Die Hostseite koordiniert Geräteinteraktionen.
Beispielsweise handelt es sich bei den Next Billion User-Tests im aktuellen VTS-Repo um hostseitige, anwendungsbasierte Tests für mehrere Geräte.
Typ 3: Zielseitige HIDL-Tests
Zielseitige HIDL-Tests für mehrere Geräte legen die gesamte Testlogik auf geräteseitigen Testbinärdateien ab, was erfordert, dass die Tests Geräte während der Testausführung synchronisieren:
In diesem Szenario:
- Testlogik wird auf Geräten ausgeführt.
- Das hostseitige Framework ermöglicht die anfängliche Geräteidentifizierung.
- Die Testbinärdatei auf der Zielseite erfordert eine Synchronisierung:
- Gleiche Testbinärdatei für alle Geräte.
- Verschiedene 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-Anbieter und
VtsDeviceInfoCollector
Zielvorbereiter. - Gerät 2 enthält einen zusätzlichen
FilePusher
Vorbereiter, der eine Gruppe hostgesteuerter verwandter 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')