На этой странице рассказывается, как написать тест на стороне хоста, который не требует устройства, например тест, выполняемый на экземпляре 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.