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

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

Пример конфигурации теста 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 . В то время как две другие опции являются рекомендуемыми, эта опция обязательна для успешного запуска тестов 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>

настройки набора тестов

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

test_suites: ["general-tests"],

При таких настройках тест упаковывается в файл general-tests.zip на целевом объекте test_suites .