Как написать тест на стороне хоста без устройства в TF

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

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

В Trade Federation (TF) можно проводить несколько типов тестирования на стороне хоста.

Тесты на языке C++ (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 в изолированной среде.
  • Поддерживаются только статически связанные зависимости. В classpath не включены зависимости, объявленные с помощью lib.
  • Изолирующий исполнитель помещает в путь к классам только исполнитель-заглушку и ваш тестовый JAR-файл.
  • При каждом запуске тестов с помощью этого средства выполнения возникает фиксированный объем дополнительных расходов.

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

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

Пример конфигурации Soong для автоматической генерации

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

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Тесты Robolectric

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

  • Параметр 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>

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