Auf dieser Seite erfahren Sie, wie Sie einen Host-seitigen Test schreiben, für den kein Gerät erforderlich ist, z. B. einen Test, der auf einer Linux-GCE-Instanz ausgeführt wird. Weitere Informationen zum Schreiben eines hostgesteuerten Tests, für den ein Gerät erforderlich ist, finden Sie unter Hostgesteuerten Test in Trade Federation schreiben.
Hostseitige Testtypen
Sie können verschiedene Arten von Host-seitigen Tests über Trade Federation (TF) ausführen.
Native Tests (gtest)
Erstellen Sie native Tests (gtests), um eine Plattform zu testen. Wenn für den Test kein Gerät erforderlich ist, führen Sie ihn auf einem Host aus. Der Test wird so viel schneller ausgeführt. Wenn Sie solche Tests auf einem Testhost ausführen möchten, verwenden Sie den TF-Runner HostGTest.
Dies ist eine Beispielkonfiguration für TradeFed-Tests:
<configuration description="Runs hello_world_test."> <option name="null-device" value="true" /> <test class="com.android.tradefed.testtype.HostGTest" > <option name="module-name" value="hello_world_test" /> </test> </configuration>
Bei der Testkonfiguration wird ein gtest-Test (hello_world_test) auf einem Host ausgeführt. Die Beispieltestkonfiguration kann automatisch generiert werden. Sofern für Ihren Test keine spezielle Einrichtung oder Bereinigung erforderlich ist, können Sie sich auf die automatische Generierung der Testkonfiguration verlassen, um geeignete TF-Testkonfigurationen zu erstellen.
Wenn Sie einen hostseitigen gtest konfigurieren und die automatische Generierung der Testkonfiguration aktivieren möchten, legen Sie host_supported in Android.bp auf true fest, wie in hello_world_test.
Weitere Informationen zum Schreiben eines nativen Tests finden Sie unter Beispiel: Neuen nativen Test hinzufügen.
JAR-Hosttests
JAR-Hosttests (Java) wie JUnit müssen nicht auf einem Gerät ausgeführt werden und bieten eine Codeabdeckung Ihres Java-Projekts. Solche Tests können so konfiguriert werden, dass sie auf einem Testhost ausgeführt werden. Verwenden Sie dazu den Runner HostTest.
Beispiel für eine TradeFed-Testkonfiguration
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.HostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
Bei der Testkonfiguration wird ein hostseitiger JUnit-Test von HelloWorldHostTest ausgeführt. Die oben genannte Testkonfiguration kann automatisch generiert werden. Sofern für Ihren Test keine spezielle Einrichtung oder Bereinigung erforderlich ist, sollten Sie die automatische Generierung der Testkonfiguration verwenden, um eine geeignete TradeFed-Testkonfiguration zu erstellen.
Weitere Informationen zum Schreiben eines JAR-Hosttests finden Sie auf der Seite JAR (Java) Host Tests.
Isolierte Java-Hosttests
Gerätelose Java-Tests können in einer isolierten Umgebung ausgeführt werden, was sich jedoch leicht auf die Leistung auswirkt. Bevor Sie sich für die Verwendung dieser Umgebung entscheiden, sollten Sie jedoch einige wichtige Punkte berücksichtigen.
- Dies ist der Standard-Runner für Robolectric- und JUnit-Unittests.
- Tradefed unterstützt nur JUnit-Tests in der isolierten Umgebung.
- Es werden nur statisch verknüpfte Abhängigkeiten unterstützt. Es sind keine Abhängigkeiten deklariert, die mit
libim Klassenpfad enthalten sind. - Der Isolationsrunner platziert nur den Shim-Runner und das Test-JAR im Klassenpfad.
- Pro Testlauf, der mit diesem Runner ausgeführt wird, fällt ein gewisser fester Overhead an.
Beispiel für eine isolierte Tradefed-Testkonfiguration
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.IsolatedHostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
Beispiel für die Soong-Konfiguration für die automatische Generierung
Anstatt die Testkonfiguration wie oben manuell zu erstellen, kann Soong die Konfiguration automatisch generieren. Dazu ist eine Deklaration wie im folgenden Beispiel erforderlich.
java_test_host {
name: "HelloWorldHostTest",
test_options: {
unit_test: true,
},
test_suites: ["general-tests"],
srcs: ["test/**/*.java"],
static_libs: [
"junit",
],
}Robolectric-Tests
Robolectric-Tests verwenden denselben Runner wie die isolierten Host-Tests, jedoch mit einigen speziellen Optionen.
- Mit der Option
robolectric-resourceskönnen einige Robolectric-spezifische Befehlszeilenoptionen an den untergeordneten Prozess übergeben werden. Außerdem wird dem Klassenpfad des untergeordneten Prozesses der Tree-Build vonandroid-allhinzugefügt. Die anderen beiden sind Best Practices, diese Option ist jedoch erforderlich, damit Robolectric-Tests erfolgreich ausgeführt werden können. - Mit der Option
java-folderkann die vom untergeordneten Prozess verwendete Java-Laufzeit geändert werden. Dies ist erforderlich, da Robolectric bestimmte Java-Versionen bevorzugt, die möglicherweise nicht mit der bevorzugten JVM des Hostsystems übereinstimmen. - Mit der Option
exclude-pathskann der Subprozess-Runner das Laden bestimmter Module ganz vermeiden. Das ist nützlich, wenn ein JAR zusätzliche Klassen enthält, die zu Ladefehlern führen könnten.java.ist ein häufiger Ausschluss, umSecurityException-Ausnahmen zu vermeiden.
Beispiel für Robolectric-Konfiguration
<configuration description="Executes a Sample Robolectric Test"> <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" /> <option name="exclude-paths" value="java" /> <option name="use-robolectric-resources" value="true" /> <test class="com.android.tradefed.testtype.IsolatedHostTest"> <option name="jar" value="RobolectricExampleTest.jar" /> </test> </configuration>
Beispiel für die Soong-Konfiguration für die automatische Robolectric-Generierung
Anstatt die Testkonfiguration manuell wie oben zu erstellen, kann Soong die Konfiguration automatisch generieren, indem Sie eine Deklaration wie in diesem Beispiel verwenden.
android_robolectric_test {
name: "HelloWorldRoboTest",
srcs: [
"src/**/*.java",
],
// Include the testing libraries
static_libs: [
"mockito-robolectric-prebuilt",
"platform-test-annotations",
"testng",
"truth-prebuilt",
],
instrumentation_for: "HelloWorldApp",
}Python-Test
Wenn die Testlogik in Python geschrieben ist, verwenden Sie den Build-Typ python_test_host, um eine PAR-Datei zu erstellen, die von TF PythonBinaryHostTest ausgeführt werden kann.
Beispiel für eine TradeFed-Testkonfiguration
<configuration description="Config to run atest unittests"> <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" > <option name="par-file-name" value="atest_unittests" /> <option name="test-timeout" value="2m" /> </test> </configuration>
Testsuite-Einstellung
Damit der Hostseitentest für einen bestimmten Build über TF zugänglich ist, legen Sie die Einstellung `test_suites` des Testmoduls auf `general-tests` fest:
test_suites: ["general-tests"],
Mit dieser Einstellung wird der Test für das Ziel test_suites in general-tests.zip verpackt.