Hostseitigen gerätelosen Test in TF schreiben

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-GCE-Instanz ausgeführt wird. Weitere Informationen zum Schreiben eines hostgesteuerten Tests, für den ein Gerät erforderlich ist, finden Sie unter Hostgesteuerte Tests in Trade Federation schreiben.

Hostseitige Testtypen

Sie können verschiedene Arten von hostseitigen Tests über Trade Federation (TF) ausführen.

Native Tests (gtests)

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 wird der Test 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 einen TradeFed-Test:

<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 sich auf die automatische Testkonfigurationsgenerierung verlassen, um geeignete TF-Testkonfigurationen zu erstellen.

Wenn Sie einen hostseitigen gtest konfigurieren und die automatische Testkonfigurationsgenerierung aktivieren möchten, legen Sie host_supported auf true in Android.bp fest, wie in hello_world_test.

Weitere Informationen zum Schreiben eines nativen Tests finden Sie unter Beispiel für einen neuen nativen Test hinzufügen.

JAR-Hosttests

JAR-Hosttests (Java), z. B. JUnit, sind Tests, die nicht auf einem Gerät ausgeführt werden müssen und die Code abdeckung Ihres Java-Projekts bieten. Solche Tests können mit dem Runner HostTest auf einem Test host ausgeführt werden.

Beispielkonfiguration für einen TradeFed-Test

<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 oben genannte Testkonfiguration kann automatisch generiert werden. Sofern für Ihren Test keine spezielle Einrichtung oder Bereinigung erforderlich ist, können Sie sich auf die automatische Testkonfigurationsgenerierung verlassen, um eine geeignete TradeFed-Testkonfiguration zu erstellen.

Weitere Informationen zum Schreiben eines JAR-Hosttests finden Sie auf der Seite JAR-Hosttests (Java).

Isolierte Java-Hosttests

Java-Tests ohne Gerät können in einer isolierten Umgebung ausgeführt werden, was jedoch zu einer leichten Leistungseinbuße führt. Bevor Sie sich für diese Umgebung entscheiden, sollten Sie jedoch einige wichtige Punkte beachten.

  • Dies ist der Standard-Runner für Robolectric- und JUnit-Einheitentests.
  • Tradefed unterstützt nur JUnit-Tests in der isolierten Umgebung.
  • Es werden nur statisch verknüpfte Abhängigkeiten unterstützt. Abhängigkeiten, die mit lib deklariert wurden , sind nicht im Klassenpfad enthalten.
  • Der Isolations-Runner fügt dem Klassenpfad nur den Shim-Runner und das Test-JAR hinzu.
  • Bei jeder Testausführung mit diesem Runner fällt ein fester Overhead an.

Beispielkonfiguration für einen TradeFed-Test (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 automatisch generieren, indem Sie eine Deklaration wie in diesem Beispiel verwenden.

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 Hosttests, jedoch mit einigen speziellen Optionen.

  • Mit der Option robolectric-resources können einige Robolectric-spezifische Befehlszeilenoptionen an den Unterprozess übergeben werden. Außerdem wird der Tree-Build von android-all dem Klassenpfad des Unterprozesses hinzugefügt. Die anderen beiden Optionen sind Best Practices, diese Option ist jedoch erforderlich , um Robolectric-Tests erfolgreich auszuführen.
  • Mit der Option java-folder kann die vom Unterprozess 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-paths kann der Unterprozess-Runner das Laden bestimmter Module vermeiden. Das ist nützlich, wenn ein JAR zusätzliche Klassen enthält, die zu Ladefehlern führen können. java. ist ein häufiger Ausschluss, um SecurityException-Ausnahmen zu vermeiden.

Beispielkonfiguration für Robolectric

<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 zur automatischen Generierung für Robolectric

Anstatt die Testkonfiguration wie oben manuell 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.

Beispielkonfiguration für einen TradeFed-Test

<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>

Test-Suite-Einstellung

Damit der hostseitige Test für einen bestimmten Build von TF zugänglich ist, legen Sie die Einstellung des Testmoduls `test_suites` auf `general-tests` fest:

test_suites: ["general-tests"],

Mit dieser Einstellung wird der Test im Ziel test_suites in general-tests.zip verpackt.