Auf dieser Seite erfahren Sie, wie Sie einen hostseitigen Test schreiben, für den kein Gerät erforderlich ist, z. B. einen Test, der auf einer Linux-GKE-Instanz ausgeführt wird. Weitere Informationen zum Erstellen eines hostgestützten Tests, für den ein Gerät erforderlich ist, finden Sie unter Hostgestützten Test in der Trade Federation erstellen.
Hostseitige Testtypen
Über Trade Federation (TF) können Sie verschiedene Arten von hostseitigen Tests ausführen.
Native (gtest)-Tests
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. So ist er viel schneller. Wenn Sie solche Tests auf einem Testhost ausführen möchten, verwenden Sie den TF-Ausführer 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>
Die Testkonfiguration führt einen gtest-Test (hello_world_test) auf einem Host aus. Die Beispieltestkonfiguration kann automatisch generiert werden. Sofern für Ihren Test keine spezielle Einrichtung oder Bereinigung erforderlich ist, können Sie die automatische Testkonfigurationsgenerierung verwenden, um ordnungsgemäße TF-Testkonfigurationen zu erstellen.
Wenn Sie ein hostseitiges gtest konfigurieren und die automatische Testkonfigurationsgenerierung aktivieren möchten, setzen Sie host_supported
in Android.bp
auf true
, wie in hello_world_test.
Weitere Informationen zum Erstellen eines nativen Tests finden Sie unter Neues Beispiel für nativen Test hinzufügen.
JAR-Hosttests
JAR-Hosttests (Java) wie JUnit sind Tests, die nicht auf einem Gerät ausgeführt werden müssen und die Codeabdeckung Ihres Java-Projekts liefern. Solche Tests können so konfiguriert werden, dass sie mit dem Runner HostTest auf einem Testhost ausgeführt werden.
Beispielkonfiguration für TradeFed-Tests
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.HostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
Die Testkonfiguration führt einen hostseitigen JUnit-Test von HelloWorldHostTest aus. Die obige Testkonfiguration kann automatisch generiert werden. Sofern für Ihren Test keine spezielle Einrichtung oder Bereinigung erforderlich ist, können Sie die automatische Testkonfigurationsgenerierung verwenden, um eine ordnungsgemäße TradeFed-Testkonfiguration zu erstellen.
Weitere Informationen zum Erstellen eines JAR-Hosttests finden Sie auf der Seite JAR-Hosttests (Java).
Isolierte Java-Hosttests
Gerätelose Java-Tests können in einer isolierten Umgebung mit geringen Leistungseinbußen ausgeführt werden. Es gibt jedoch einige wichtige Aspekte, die Sie berücksichtigen sollten, bevor Sie sich für diese Umgebung entscheiden.
- Dies ist der Standard-Runner für Robolectric- und JUnit-Unittests.
- Tradefed unterstützt in der Isolationsumgebung nur JUnit-Tests.
- Es werden nur statisch verknüpfte Abhängigkeiten unterstützt. Der Pfad enthält keine mit
lib
deklarierten Abhängigkeiten. - Der Isolation Runner fügt nur den Shim-Runner und Ihr Test-JAR in den Klassenpfad ein.
- Pro Testlauf mit diesem Runner fallen feste Kosten an.
Beispiel für eine Tradefed-Testkonfiguration (isoliert)
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.IsolatedHostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
Beispielkonfiguration für Soong zur automatischen Generierung
Anstatt die Testkonfiguration wie oben manuell zu erstellen, kann Soong die Konfiguration mit einer Deklaration wie in diesem Beispiel automatisch generieren.
java_test_host { name: "HelloWorldHostTest", test_options: { unit_test: true, }, test_suites: ["general-tests"], srcs: ["test/**/*.java"], static_libs: [ "junit", ], }
Robolectric-Tests
Für Robolectric-Tests wird derselbe Runner wie für die isolierten Hosttests verwendet, mit einigen speziellen Optionen.
- Mit der Option
robolectric-resources
können einige Robolectric-spezifische Befehlszeilenoptionen an den untergeordneten Prozess übergeben werden. Außerdem wird der Tree-Build vonandroid-all
zum Classpath des untergeordneten Prozesses hinzugefü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-folder
können Sie die Java-Laufzeit ändern, die vom untergeordneten Prozess verwendet wird. Dies ist erforderlich, da Robolectric bestimmte Java-Versionen bevorzugt, die möglicherweise nicht mit der bevorzugten JVM des Hostsystems übereinstimmen. - Mit der Option
exclude-paths
kann der Subprozess-Ausführer das Laden bestimmter Module ganz vermeiden. Das ist nützlich, wenn eine JAR-Datei überflüssige Klassen enthält, die zu Ladefehlern führen können.java.
ist ein gängiger Ausschluss, umSecurityException
-Ausnahmen zu vermeiden.
Beispiel für eine 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>
Beispielkonfiguration für Soong für die automatische Generierung von Robolectric
Anstatt die Testkonfiguration wie oben manuell zu erstellen, kann Soong die Konfiguration mit einer Deklaration wie in diesem Beispiel automatisch generieren.
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 Buildtyp python_test_host
, um eine PAR-Datei zu erstellen, die von TF PythonBinaryHostTest
ausgeführt werden kann.
Beispielkonfiguration für TradeFed-Tests
<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>
Einstellung für Test-Suite
Damit der hostseitige Test für einen bestimmten Build von TF aufgerufen werden kann, müssen Sie die Einstellung `test_suites`
des Testmoduls auf `general-tests`
festlegen:
test_suites: ["general-tests"],
Bei dieser Einstellung wird der Test für general-tests.zip
auf dem Ziel test_suites
verpackt.