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

Za pomocą Trade Federation (TF) możesz przeprowadzać kilka rodzajów testów po stronie hosta.

Testy natywne (gtest)

Twórz testy natywne (gtests), aby testować platformę. Jeśli test nie wymaga urządzenia, uruchom go na hoście. W ten sposób będzie działać znacznie szybciej. Aby skonfigurować takie testy do uruchamiania na hoście testowym, użyj narzędzia TF 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 testów, aby tworzyć odpowiednie konfiguracje testów TF.

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

Więcej informacji o pisaniu testu natywnego znajdziesz w artykule Dodawanie nowego testu natywnego Przykład.

Testy hosta JAR

Testy hosta JAR (Java), takie jak JUnit, to testy, które nie muszą być przeprowadzane na urządzeniu i które zapewniają pokrycie kodu w projekcie Java. Takie testy można skonfigurować tak, aby były uruchamiane na hoście testowym za pomocą narzędzia 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 w przypadku HelloWorldHostTest. Pamiętaj, że powyższa konfiguracja testu może zostać wygenerowana automatycznie. Jeśli test nie wymaga specjalnej konfiguracji ani czyszczenia, polegaj 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).

Testy izolowanego hosta Java

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

  • Jest to domyślny program uruchamiający używany do testów jednostkowych Robolectric i JUnit.
  • W środowisku izolowanym Tradefed obsługuje tylko testy JUnit.
  • Obsługiwane są tylko zależności połączone statycznie. Na ścieżce klasy nie ma zadeklarowanych zależności z lib.
  • Uruchamiający izolację umieszcza na ścieżce klasy tylko uruchamiającego shim i plik JAR testu.
  • Każde uruchomienie testu za pomocą tego narzędzia wiąże się z pewną stałą wartością narzutu.

Przykładowa konfiguracja testu Tradefed (odizolowana)

<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 wygenerować ją automatycznie, 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 Robolectric

Testy Robolectric używają tego samego modułu uruchamiającego co odizolowane testy hosta, ale mają kilka specjalnych opcji.

  • Opcja robolectric-resources umożliwia przekazywanie do podprocesu kilku opcji wiersza poleceń specyficznych dla Robolectric, a także dodaje do ścieżki klasy podprocesu kompilację drzewa android-all. Pozostałe 2 opcje to sprawdzone metody, ale ta jest obowiązkowa, jeśli chcesz, aby testy Robolectric działały prawidłowo.
  • Opcja java-folder umożliwia zmianę środowiska wykonawczego Javy używanego przez podproces. Jest to konieczne, ponieważ Robolectric preferuje określone wersje Javy, które mogą nie być zgodne z preferowaną maszyną JVM systemu hosta.
  • Opcja exclude-paths umożliwia procesowi podrzędnemu uniknięcie wczytywania niektórych modułów, co jest przydatne, gdy plik JAR zawiera zbędne klasy, które mogą powodować błędy wczytywania. 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 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 w Pythonie

Jeśli logika testu jest napisana w Pythonie, użyj typu kompilacji python_test_host, aby utworzyć plik par, który może być uruchamiany przez 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 moduł testowy `test_suites` na `general-tests`:

test_suites: ["general-tests"],

Dzięki temu ustawieniu test jest pakowany do general-tests.zip na test_suites.