Pisanie testu bez urządzenia po stronie hosta w TF

Z tej strony dowiesz się, jak napisać test po stronie hosta, który nie wymaga urządzenia, np. test uruchamiany na instancji Linux GCE. (Więcej informacji o pisaniu testu sterowanego przez hosta, który wymaga urządzenia, znajdziesz w artykule Pisanie testu sterowanego przez hosta w Trade Federation).

Typy testów po stronie hosta

W Trade Federation (TF) możesz uruchamiać kilka typów testów po stronie hosta.

Testy natywne (gtest)

Twórz testy natywne (gtest), aby testować platformę. Jeśli test nie wymaga urządzenia, uruchom go na hoście. W ten sposób test będzie działać znacznie szybciej. Aby skonfigurować takie testy do uruchamiania na hoście testowym, użyj narzędzia TF runner HostGTest.

Oto przykładowa konfiguracja testu 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 testu uruchamia test gtest (hello_world_test) na hoście. Przykładową konfigurację testu można wygenerować automatycznie. Jeśli test nie wymaga specjalnej konfiguracji ani czyszczenia, możesz polegać na automatycznym generowaniu konfiguracji testu, aby utworzyć odpowiednie konfiguracje testu TF.

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

Więcej informacji o pisaniu testu natywnego znajdziesz w artykule 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ć tak, aby były uruchamiane na hoście testowym za pomocą narzędzia runner HostTest.

Przykładowa konfiguracja testu TradeFed

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

Konfiguracja testu uruchamia test JUnit po stronie hosta HelloWorldHostTest. Pamiętaj, że powyższą konfigurację testu można wygenerować automatycznie. Jeśli test nie wymaga specjalnej konfiguracji ani czyszczenia, możesz polegać na automatycznym generowaniu konfiguracji testu, aby utworzyć odpowiednią konfigurację testu TradeFed.

Więcej informacji o tym, jak napisać test hosta JAR, znajdziesz na stronie Testy hosta JAR (Java).

Izolowane testy hosta Java

Testy Java bez urządzenia można uruchamiać w środowisku izolacji, ale wiąże się to z niewielkim spadkiem wydajności. Zanim zdecydujesz się na korzystanie z tego środowiska, musisz jednak wziąć pod uwagę kilka ważnych kwestii.

  • Jest to domyślny narzędzie runner używane do testów jednostkowych Robolectric i JUnit.
  • Tradefed obsługuje w środowisku izolacji tylko testy JUnit.
  • Obsługiwane są tylko zależności połączone statycznie. Żadne zależności zadeklarowane za pomocą lib nie są uwzględniane w ścieżce klasy.
  • Narzędzie runner izolacji umieszcza w ścieżce klasy tylko narzędzie runner shim i plik JAR testu.
  • W przypadku każdego uruchomienia testu za pomocą tego narzędzia runner występuje pewien stały narzut.

Przykładowa konfiguracja testu Tradefed (izolowana)

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

Przykładowa konfiguracja Soong do automatycznego generowania

Zamiast ręcznie tworzyć konfigurację testu, jak powyżej, Soong może automatycznie wygenerować konfigurację za pomocą 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 Robolectric

Testy Robolectric używają tego samego narzędzia runner co izolowane testy hosta, ale z kilkoma specjalnymi opcjami.

  • Opcja robolectric-resources umożliwia przekazywanie do podprocesu kilku opcji wiersza poleceń specyficznych dla Robolectric , a także dodaje do ścieżki klasy podprocesu drzewo kompilacji android-all. Pozostałe 2 opcje są sprawdzonymi metodami, ale ta opcja jest obowiązkowa , aby testy Robolectric działały prawidłowo.
  • 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 preferowanym JVM systemu hosta.
  • Opcja exclude-paths umożliwia narzędziu runner podprocesu unikanie wczytywania określonych modułów w ogóle, co jest przydatne, gdy plik JAR zawiera zbędne klasy, które mogą powodować błędy wczytywania. java. to typowe wykluczenie, które pozwala 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 do automatycznego generowania Robolectric

Zamiast ręcznie tworzyć konfigurację testu, jak powyżej, Soong może automatycznie wygenerować konfigurację za pomocą 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 Python

Jeśli logika testu jest napisana w Pythonie, użyj rodzaju kompilacji python_test_host, aby utworzyć plik par, który można uruchomić za pomocą TF PythonBinaryHostTest.

Przykładowa konfiguracja testu 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 w przypadku danej kompilacji, ustaw w module testowym `test_suites` ustawienie na `general-tests`:

test_suites: ["general-tests"],

Dzięki temu ustawieniu test jest spakowany do general-tests.zip w przypadku celu test_suites.