Napisz test bezurządzeniowy po stronie hosta w TF

Na tej stronie dowiesz się, jak napisać test po stronie hosta, który nie wymaga urządzenia, na przykład test uruchamiany w instancji Linux GCE. (Szczegółowe informacje na temat pisania testu sterowanego przez hosta, który wymaga urządzenia, można znaleźć w artykule Pisanie testu sterowanego przez hosta w Federacji Handlowej ).

Typy testów po stronie hosta

Za pośrednictwem Federacji Handlowej (TF) można uruchomić kilka typów testów po stronie hosta.

Testy natywne (gtest).

Utwórz testy natywne (gtesty), aby przetestować platformę. Jeśli test nie wymaga urządzenia, uruchom go na hoście; w ten sposób test będzie przebiegał znacznie szybciej. Aby skonfigurować takie testy do uruchamiania na hoście testowym, użyj modułu uruchamiającego TF HostGTest .

Oto przykładowa konfiguracja testowa TradeFed:

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

Konfiguracja testowa uruchamia test gtest ( hello_world_test ) na hoście. Przykładowa konfiguracja testowa może zostać wygenerowana automatycznie. O ile Twój test nie wymaga specjalnej konfiguracji lub czyszczenia, możesz polegać na automatycznym generowaniu konfiguracji testu, aby utworzyć odpowiednie konfiguracje testów TF.

Aby skonfigurować gtest po stronie hosta i włączyć automatyczne generowanie konfiguracji testu, ustaw host_supported na true w Android.bp , tak jak w hello_world_test .

Aby uzyskać więcej informacji na temat pisania testu natywnego, zobacz Dodawanie nowego przykładu testu natywnego .

Testy hosta JAR

Testy hosta JAR (Java) , takie jak JUnit, to testy, które nie muszą być uruchamiane na urządzeniu i które zapewniają pokrycie kodu projektu Java. Takie testy można skonfigurować do uruchamiania na hoście testowym za pomocą modułu uruchamiającego HostTest .

Przykładowa konfiguracja testowa TradeFed

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

Konfiguracja testowa uruchamia test JUnit po stronie hosta HelloWorldHostTest . Należy pamiętać, że powyższa konfiguracja testowa może zostać wygenerowana automatycznie. O ile Twój test nie wymaga specjalnej konfiguracji lub oczyszczenia, polegaj na automatycznym generowaniu konfiguracji testu, aby utworzyć odpowiednią konfigurację testu TradeFed.

Więcej informacji na temat pisania testu hosta JAR można znaleźć na stronie Testy hosta JAR (Java) .

Izolowane testy hosta Java

Bezurządzeniowe testy Java można uruchamiać w środowisku izolowanym przy niewielkim koszcie wydajności. Zanim jednak zdecydujemy się na korzystanie z tego środowiska, należy wziąć pod uwagę kilka ważnych kwestii.

  • Jest to domyślny moduł uruchamiający używany do testów jednostkowych Robolectric i JUnit
  • Tradefed obsługuje tylko testy JUnit w środowisku izolowanym.
  • Obsługiwane są tylko zależności połączone statycznie. W ścieżce klas nie są zawarte żadne zależności zadeklarowane za pomocą biblioteki lib .
  • Biegun izolacji umieszcza tylko biegacz podkładki i słoik testowy na ścieżce klasy.
  • Na każdy przebieg testowy wykonywany za pomocą tego modułu uruchamiającego przypada pewna ilość stałych kosztów ogólnych.

Przykładowa konfiguracja testowa Tradefed (izolowana)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

Przykładowa konfiguracja Soonga do autogeneracji

Zamiast ręcznie tworzyć konfigurację testową, jak powyżej , Soong może automatycznie wygenerować konfigurację, używając deklaracji takiej jak w tym przykładzie.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Testy robotoelektryczne

Testy Robolectric korzystają z tego samego modułu uruchamiającego, co testy izolowanego hosta, z kilkoma specjalnymi opcjami.

  • Opcja robolectric-resources umożliwia przekazanie do podprocesu kilku opcji wiersza poleceń specyficznych dla Robolectric, a także dodaje kompilację drzewa android-all do ścieżki klas podprocesu. Chociaż pozostałe dwie to najlepsze praktyki, ta opcja jest obowiązkowa , jeśli testy Robolectric przebiegną pomyślnie.
  • Opcja java-folder umożliwia zmianę środowiska wykonawczego Java używanego przez podproces. Jest to konieczne, ponieważ Robolectric preferuje określone wersje Java, które mogą nie być zgodne z preferowaną maszyną JVM systemu hosta.
  • Opcja exclude-paths pozwala wykonawcy podprocesu w ogóle uniknąć ładowania poszczególnych modułów, co jest przydatne, gdy plik JAR zawiera dodatkowe klasy, które mogą powodować błędy ładowania. java. jest częstym wykluczeniem, aby uniknąć zgłaszania wyjątków SecurityException .

Przykładowa konfiguracja 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>

Przykładowa konfiguracja Soong dla automatycznej generacji Robolectric

Zamiast ręcznie tworzyć konfigurację testową, jak powyżej , Soong może automatycznie wygenerować konfigurację, używając deklaracji takiej jak w tym przykładzie.

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",
}

Test Pythona

Jeśli logika testu jest napisana w języku Python, użyj typu kompilacji python_test_host aby utworzyć plik par, który może zostać uruchomiony przez TF PythonBinaryHostTest .

Przykładowa konfiguracja testowa TradeFed

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

Ustawienie zestawu testów

Aby test po stronie hosta był dostępny dla TF dla danej kompilacji, ustaw moduł testowy `test_suites` na `general-tests` :

test_suites: ["general-tests"],

Przy tym ustawieniu test jest pakowany do general-tests.zip w obszarze docelowym test_suites .