Pisanie testu bez urządzenia po stronie hosta w TF

Na tej stronie dowiesz się, jak napisać test po stronie hosta, który nie wymaga urządzenia, np. testu działającego na instancji GCE Linuxa. (szczegółowe informacje o pisaniu testu host-driven, który wymaga urządzenia, znajdziesz w artykule Write a Host-driven Test in Trade Federation (Tworzenie testu host-driven w ramach usługi Trade Federation)).

Typy testów po stronie hosta

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

Testy natywne (gtest)

Utwórz testy natywnych (testy gtest), aby przetestować platformę. Jeśli test nie wymaga urządzenia, uruchom go na hoście. Dzięki temu będzie się on wykonywać znacznie szybciej. Aby skonfigurować takie testy do uruchamiania na hoście testowym, użyj narzędzia 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 testu uruchamia na hoście test gtest (hello_world_test). Przykładowy plik testowy konfiguracji może być generowany automatycznie. Jeśli Twój test nie wymaga specjalnej konfiguracji ani oczyszczania, możesz polegać na automatycznym generowaniu konfiguracji testu, aby utworzyć odpowiednie konfiguracje testu 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 przypadku hello_world_test.

Więcej informacji o pisaniu testów natywnych znajdziesz w artykule Przykład dodawania nowego 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 w języku Java. Takie testy można skonfigurować tak, aby były wykonywane 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 HelloWorldHostTest po stronie hosta. Pamiętaj, że powyższa konfiguracja testu może zostać wygenerowana automatycznie. Jeśli test nie wymaga specjalnej konfiguracji ani oczyszczania, użyj automatycznego generowania konfiguracji testu, aby utworzyć odpowiednią konfigurację testu TradeFed.

Więcej informacji o pisaniu testu hosta pliku JAR znajdziesz na stronie Testy hosta pliku JAR (Java).

Testy izolowanego hosta Java

Testy Java bez urządzeń można uruchamiać w środowisku izolowanym z niewielkim kosztem wydajności. Zanim zdecydujesz się na korzystanie z tego środowiska, musisz wziąć pod uwagę kilka ważnych kwestii.

  • Jest to domyślny program testowy używany do testów jednostkowych Robolectric i JUnit
  • Narzędzie Tradefed obsługuje tylko testy JUnit w środowisku izolacji.
  • Obsługiwane są tylko zależności powiązane statycznie. classpath nie zawiera żadnych zależności zadeklarowanych za pomocą lib.
  • Uruchamiający test izolowany umieszcza w ścieżce klas tylko uruchamiający test izolowany i plik jar testu.
  • Na każde uruchomienie testu za pomocą tego narzędzia przypada pewien stały koszt.

Przykładowa konfiguracja testu Tradefed (w trybie izolowanym)

<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ę testową, jak powyżej, Soong może automatycznie wygenerować konfigurację za pomocą deklaracji podobnej do tej.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Testy Robolectric

Testy Robolectric korzystają z tego samego narzędzia co testy z odizolowanym hostem, ale mają kilka specjalnych opcji.

  • Opcja robolectric-resources umożliwia przekazanie do podprocesu kilku opcji wiersza poleceń Robolectric, a także dodanie do ścieżki klasy podprocesu kompilacji drzewa android-all. Chociaż pozostałe 2 opcje są sprawdzonymi metodami, ta opcja jest obowiązkowa, aby testy Robolectric mogły się udać.
  • Opcja java-folder umożliwia zmianę środowiska wykonawczego Java używanego przez podproces. Jest to konieczne, ponieważ Robolectric preferuje określone wersje Javy, które mogą nie być zgodne z preferowaną przez system hosta maszyną wirtualną JVM.
  • Opcja exclude-paths pozwala procesowi uruchamiania podprocesu całkowicie uniknąć wczytywania określonych modułów, co jest przydatne, gdy plik JAR zawiera dodatkowe klasy, które mogą powodować błędy wczytywania. java. to typowe wykluczenie, które pozwala uniknąć 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ęcznego tworzenia konfiguracji testowej, jak powyżej, Soong może automatycznie wygenerować konfigurację, używając deklaracji podobnej do tej w 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 Pythonie, użyj typu kompilacji python_test_host, aby utworzyć plik pary, który można uruchomić w 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 ustawienie modułu testu `test_suites` na `general-tests`:

test_suites: ["general-tests"],

Przy tym ustawieniu test jest pakowany do general-tests.zip na potrzeby celu test_suites.