Напишите тест без устройств на стороне хоста в TF.

На этой странице рассказывается, как написать тест на стороне хоста, которому не требуется устройство, например, тест, работающий на экземпляре Linux GCE. (Подробнее о написании теста на стороне хоста, требующего устройства, см. в статье «Написание теста на стороне хоста в Trade Federation» .)

Типы тестов на стороне хоста

Вы можете запустить несколько типов тестов на стороне хоста через Trade Federation (TF).

Нативные (gtest) тесты

Создайте нативные тесты (gtests) для тестирования платформы. Если тесту не требуется устройство, запустите его на хосте; так он будет работать значительно быстрее. Чтобы настроить запуск таких тестов на тестовом хосте, используйте TF-раннер HostGTest .

Это пример тестовой конфигурации 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>

Тестовая конфигурация запускает тест gtest ( hello_world_test ) на хосте. Пример тестовой конфигурации может быть сгенерирован автоматически. Если ваш тест не требует специальной настройки или очистки, вы можете использовать автоматическую генерацию тестовых конфигураций для создания корректных конфигураций TF.

Чтобы настроить gtest на стороне хоста и включить автоматическую генерацию конфигурации теста, установите host_supported в true в Android.bp , как в hello_world_test .

Дополнительную информацию о написании собственного теста см. в разделе Добавление нового примера собственного теста .

Тесты хоста JAR

Тесты хоста JAR (Java) , такие как JUnit, не требуют запуска на устройстве и обеспечивают покрытие кода вашего Java-проекта. Такие тесты можно настроить для запуска на тестовом хосте с помощью инструмента HostTest .

Пример тестовой конфигурации TradeFed

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

Тестовая конфигурация запускает JUnit-тест HelloWorldHostTest на стороне хоста. Обратите внимание, что указанная выше тестовая конфигурация может быть сгенерирована автоматически. Если ваш тест не требует специальной настройки или очистки, используйте автоматическую генерацию тестовой конфигурации для создания корректной тестовой конфигурации TradeFed.

Более подробную информацию о том, как написать тест хоста JAR, можно найти на странице Тесты хоста JAR (Java) .

Изолированные тесты хоста Java

Тесты Java без устройств можно запускать в изолированной среде с небольшим снижением производительности. Однако, прежде чем использовать эту среду, следует учесть несколько важных моментов.

  • Это средство выполнения по умолчанию, используемое для модульных тестов Robolectric и JUnit.
  • Tradefed поддерживает только тесты JUnit в среде изоляции.
  • Поддерживаются только статически связанные зависимости. Зависимости, объявленные с помощью lib не включены в classpath.
  • Изоляционный инструмент только помещает shim runner и ваш тестовый jar-файл в classpath.
  • При выполнении этого теста с помощью этого средства существует определенная величина фиксированных накладных расходов на каждый прогон теста.

Пример тестовой конфигурации Tradefed (изолированный)

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

Пример конфигурации Сунга для автогенерации

Вместо того, чтобы вручную создавать тестовую конфигурацию, как указано выше , Soong может автоматически сгенерировать конфигурацию, используя объявление, подобное этому примеру.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Робоэлектрические тесты

В тестах Robolectric используется тот же бегунок, что и в тестах с изолированным хостом, с несколькими специальными опциями.

  • Параметр robolectric-resources позволяет передавать в подпроцесс несколько параметров командной строки, специфичных для Robolectric, а также добавляет сборку дерева android-all в classpath подпроцесса. Хотя два других параметра являются рекомендуемыми, этот параметр обязателен для успешного выполнения тестов Robolectric.
  • Параметр java-folder позволяет изменить среду выполнения Java, используемую подпроцессом. Это необходимо, поскольку Robolectric предпочитает определённые версии Java, которые могут не соответствовать предпочитаемой JVM хост-системы.
  • Параметр exclude-paths позволяет исполнителю подпроцесса вообще избегать загрузки определенных модулей, что полезно, когда JAR-файл содержит посторонние классы, которые могут вызвать ошибки загрузки. java. — распространенное исключение, позволяющее избежать выдачи исключений SecurityException .

Пример конфигурации 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>

Пример конфигурации Сунга для автогенерации Robolectric

Вместо того, чтобы вручную создавать тестовую конфигурацию, как указано выше , Soong может автоматически сгенерировать конфигурацию, используя объявление, подобное этому примеру.

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

Если логика теста написана на Python, используйте тип сборки python_test_host для создания par-файла, который может быть запущен TF PythonBinaryHostTest .

Пример тестовой конфигурации 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>

Настройка тестового набора

Чтобы тест на стороне хоста был доступен TF для данной сборки, установите настройку тестового модуля `test_suites` на `general-tests` :

test_suites: ["general-tests"],

При использовании этой настройки тест упаковывается в general-tests.zip в целевом каталоге test_suites .