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.
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:
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:
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:
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')