Напишите тест без устройств на стороне хоста в 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 , не включены в путь к классам.
  • Изолирующий бегун помещает в путь к классам только бегуна прокладки и тестовую банку.
  • За каждый тестовый прогон, выполняемый с помощью этого средства выполнения, приходится некоторая фиксированная сумма накладных расходов.

Пример тестовой конфигурации 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-resources позволяет передавать в подпроцесс несколько параметров командной строки, специфичных для Robolectric, а также добавляет древовидную сборку android-all в путь к классам подпроцесса. Хотя два других варианта являются передовыми, этот вариант является обязательным для успешного проведения тестов 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

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

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 .