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

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

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

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

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

Создайте собственные тесты (gtests) для тестирования платформы. Если тесту не требуется устройство, запустите его на хосте; так тест будет работать намного быстрее. Чтобы настроить такие тесты для запуска на тестовом хосте, используйте TF runner 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.
  • Изоляционный бегунок помещает только бегунок прокладок и тестовый 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>

Пример конфигурации Soong для автогенерации 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 .