Тестовые шаблоны

AOSP включает шаблоны тестирования для тестовых модулей, которые не являются подклассом Python на стороне хоста для BaseTest средства запуска VTS.

Рисунок 1. Тестирование архитектуры шаблона.

Разработчики могут использовать эти шаблоны, чтобы упростить интеграцию таких тестов. В этом разделе рассказывается, как настраивать и использовать шаблоны тестов (находящиеся в каталоге VTS testcases/template) и приводятся примеры часто используемых шаблонов.

Шаблон BinaryTest

Используйте шаблон BinaryTest, чтобы интегрировать тесты, выполняемые на целевом устройстве в VTS. Тестирование на целевой странице включает:

  • C++: тесты компилируются и отправляются на устройство.
  • Тесты на Python, скомпилированные в двоичные файлы на целевой стороне.
  • Сценарии командной строки, исполняемые на устройствах

Эти тесты можно интегрировать в VTS с шаблоном BinaryTest или без него.

Как интегрировать тесты на целевой стороне с помощью шаблона BinaryTest

Шаблон BinaryTest предназначен для того, чтобы разработчики могли легко интегрировать тесты на стороне целевого устройства. В большинстве случаев достаточно добавить несколько простых строк в файл AndroidTest.xml. Пример конфигурации из VtsDeviceTreeEarlyMountTest:

<configuration description="Config for VTS VtsDeviceTreeEarlyMountTest.">
  ...
<test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
<option name="test-module-name" value="VtsDeviceTreeEarlyMountTest"/>
<option name="binary-test-source" value="_32bit::DATA/nativetest/dt_early_mount_test/dt_early_mount_test" />
<option name="binary-test-source" value="_64bit::DATA/nativetest64/dt_early_mount_test/dt_early_mount_test" />
<option name="test-timeout" value="5m"/>
</test>
</configuration>

В этой конфигурации:

  • binary-test-source и binary-test-type относятся к определенному шаблону.
  • Указание относительного пути к хосту для исходного файла тестового исполняемого файла позволяет шаблону выполнять подготовку, передачу файлов, выполнение тестов, анализ результатов и очистку.
  • Шаблон содержит методы, связанные с созданием тестовых случаев, которые могут переопределять подклассы.
  • Шаблон предполагает один отчет о тестировании для каждого тестового исполняемого модуля, а имя исходного исполняемого файла по умолчанию используется в качестве имени отчета о тестировании.

Варианты конфигурации

Шаблон BinaryTest поддерживает следующие варианты конфигурации:

Название варианта Тип значения Описание
binary-test-source струны Пути к исходным файлам тестов в двоичном формате относительно каталога тестовых случаев VTS на хосте.
Пример: DATA/nativetest/test
binary-test-working-directory струны Рабочие каталоги (путь на устройстве).
Пример: /data/local/tmp/testing/
binary-test-envp струны Переменные среды для двоичного файла.
Пример: PATH=/new:$PATH
binary-test-args струны Аргументы или флаги теста.
Пример: --gtest_filter=test1
binary-test-ld-library-path струны переменной среды LD_LIBRARY_PATH.
Пример: /data/local/tmp/lib
binary-test-disable-framework Логическое значение Выполните команду adb stop, чтобы отключить Android Framework перед тестированием. Пример: true
binary-test-stop-native-servers Логическое значение Во время тестирования остановите все правильно настроенные собственные серверы. Пример: true
binary-test-type строка Тип шаблона. Другие типы шаблонов расширяют этот шаблон, но вам не нужно указывать этот параметр для этого шаблона, поскольку вы уже указали binary-test-source.

Для параметров с типом значения strings можно добавить несколько значений, повторив параметры в конфигурации. Например, задайте binary-test-source дважды (как показано в примере VtsDeviceTreeEarlyMountTest).

Тестовые теги

Вы можете добавить тестовые теги, поставив перед вариантами с stringsзначениями префикс и используя :: в качестве разделителя. Тестовые теги особенно полезны, когда вы включаете двоичные источники с одинаковыми названиями, но разной разрядностью или родительскими каталогами. Например, чтобы избежать конфликта при отправке файлов или названии результатов для источников с одинаковым названием, но из разных каталогов с исходными файлами, вы можете указать разные теги для этих источников.

Как показано в примере VtsDeviceTreeEarlyMountTest с двумя источниками dt_early_mount_test, тестовые теги – это префиксы _32bit:: и _64bit:: в binary-test-source. Теги, заканчивающиеся на 32bit или 64bit, автоматически помечают тесты как доступные для одной разрядности ABI. Например, тесты с тегом _32bit не выполняются на 64-битных ABI. Если не указать тег, это будет равносильно использованию тега с пустой строкой.

Варианты с одинаковыми тегами группируются и изолируются от других тегов. Например, binary-test-args с тегом _32bit применяется только к binary-test-source с тем же тегом и выполняется в binary-test-working-directory с тем же тегом. Параметр binary-test-working-directory необязателен для двоичных тестов. Он позволяет указать один рабочий каталог для тега. Если параметр binary-test-working-directory не указан, для каждого тега используются каталоги по умолчанию.

Название тега добавляется к названию тестового случая в отчете о результатах. Например, тестовый случай testcase1 с тегом _32bit в отчете о результатах будет представлен как testcase1_32bit.

Как интегрировать тесты на стороне целевого устройства без шаблона BinaryTest

В VTS по умолчанию используются тесты Python на стороне хоста, расширенные из BaseTest в средстве запуска VTS. Чтобы интегрировать тесты на целевом устройстве, сначала нужно передать на него файлы тестов, выполнить тесты с помощью команд оболочки, а затем проанализировать результаты с помощью скриптов Python на хосте.

Отправка тестовых двоичных файлов

Рекомендуем отправлять файлы с помощью средства подготовки целевых объектов VtsFilePusher. Пример:

<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
        <option name="push" value="DATA/test->/data/local/tmp/test"/>
    </target_preparer>

VtsFilePusher выполняет следующие действия:

  1. Проверяет подключение устройства.
  2. Определяет абсолютный путь к исходному файлу.
  3. Отправляет файлы с помощью команды adb push.
  4. Удаляет файлы после завершения тестирования.

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

Запустить тесты

После отправки файлов на устройство запустите тест, используя команды оболочки в тестовом скрипте Python на стороне хоста. Пример:

device = self.android_devices[0]
res = device.shell.Execute(["chmod a+x /data/local/tmp/test", "/data/local/tmp/test"])
asserts.AssertFalse(any(res[return_codes]))

Шаблон GtestBinaryTest

Шаблон GtestBinaryTest содержит двоичные файлы тестов GTest, каждый из которых обычно включает несколько тестовых сценариев. Этот шаблон расширяет шаблон BinaryTest, переопределяя методы настройки, создания тестовых примеров и синтаксического анализа результатов, поэтому все конфигурации BinaryTest наследуются.

GtestBinaryTest добавляет параметр gtest-batch-mode:

Название варианта Тип значения Описание
binary-test-type строка Тип шаблона. Используется значение gtest.
gtest-batch-mode Логическое значение Запускать исполняемые файлы Gtest в пакетном режиме. Пример: true

В целом, если для параметра gtest-batch-mode задать значение true, производительность повысится, а надежность немного снизится. В тестах на соответствие VTS многие модули используют пакетный режим для повышения производительности. Однако для обеспечения надежности, если режим не указан, по умолчанию используется режим без пакетной обработки.

Режим без пакетной обработки

В режиме без пакета выполняются отдельные вызовы двоичного файла GTest для каждого тестового примера. Для Например, если исполняемый файл GTest содержит 10 отчетов о тестировании (после фильтрации по конфигурации на стороне хоста), исполняемый файл вызывается 10 раз в оболочке устройства каждый раз с другим тестовым фильтром. Для каждого тестового случая создается уникальный XML-файл с результатами GTest, который обрабатывается шаблоном.

Рисунок 2. Режим без пакетной обработки.

Преимущества использования режима без пакетной обработки:

  • Изоляция тестовых случаев. Сбой или зависание в одном тестовом случае не влияет на другие.
  • Детализация. Проще получить профилирование/покрытие для каждого тестового случая измерение, systrace, bugreport, logcat и т. д. Результаты тестов и журналы извлекаются сразу после завершения каждого тестового случая.

Недостатки использования режима без пакетной обработки:

  • Избыточная загрузка. Каждый раз, когда вызывается двоичный файл GTest, он загружает связанные библиотеки и выполняет начальную настройку класса.
  • Служебный трафик. После завершения теста хост и целевое устройство обмениваются данными для анализа результатов и выполнения следующих команд (в будущем возможна оптимизация).

Пакетный режим

В пакетном режиме GTest исполняемый файл теста вызывается только один раз с длинным значением фильтра test, содержащим все тестовые случаи, отфильтрованные конфигурацией на стороне хоста (это позволяет избежать проблемы избыточной загрузки в непакетном режиме). Результаты тестирования GTest можно анализировать с помощью файла output.xml или вывода в терминале.

При использовании файла output.xml (по умолчанию):

Рисунок 3. Пакетный режим, файл output.xml.

Как и в случае с непакетным режимом, результат теста анализируется с помощью выходного XML-файла GTest. Однако поскольку выходной XML-файл создается после завершения всех тестов, если в результате тестирования произошел сбой исполняемого файла или устройства, XML-файл с результатами не создается.

При использовании вывода терминала:

Рисунок 4. Пакетный режим, вывод в терминал.

Во время выполнения GTest выводит в терминал журнал тестирования и информацию о ходе выполнения в формате, который можно проанализировать с помощью фреймворка для получения данных о статусе, результатах и журналах тестирования.

Преимущества пакетного режима:

  • Изоляция тестовых случаев. Обеспечивает такой же уровень изоляции тестовых случаев, как и режим без пакетов, если после сбоя фреймворк перезапускает двоичный файл или устройство с уменьшенным фильтром тестирования (исключая завершенные и аварийные тестовые случаи).
  • Детализация. Обеспечивает такую же детализацию отчетов о тестировании, как и в обычном режиме.

Недостатки пакетного режима:

  • Стоимость обслуживания. Если формат журнала GTest изменится, все тесты будут нарушены.
  • Замешательство. Тестовый случай может выводить данные в формате, похожем на формат GTest, что может привести к путанице.

Поэтому мы временно убрали возможность использовать вывод командной строки. Мы вернемся к этому варианту в будущем, чтобы повысить надежность функции.

Шаблон HostBinaryTest

Шаблон HostBinaryTest содержит исполняемые файлы на стороне хоста, которых нет в других каталогах или скриптах Python. В частности, мы проводим следующие тесты:

  • Скомпилированные исполняемые файлы тестов на хосте
  • исполняемые скрипты на языке Shell, Python или других языках;

Пример: VTS Security SELinux policy host-side test.

<configuration description="Config for VTS  Security SELinux policy host-side test cases">
    ...
    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
        <option name="test-module-name" value="VtsSecuritySelinuxPolicyHost"/>
        <option name="binary-test-source" value="out/host/linux-x86/bin/VtsSecuritySelinuxPolicyHostTest" />
        <option name="binary-test-type" value="host_binary_test"/>
    </test>
</configuration>

HostBinaryTest не расширяет шаблон BinaryTest, но использует похожие конфигурации тестирования. В приведенном выше примере параметр binary-test-source задает относительный путь к исполняемому файлу теста на стороне хоста, а binary-test-type – это host_binary_test. Как и в шаблоне BinaryTest, по умолчанию в качестве названия тестового случая используется название двоичного файла.

Как расширить существующие шаблоны

Шаблоны можно использовать непосредственно в конфигурации тестирования, чтобы включить тесты, написанные не на Python, или расширить их в подклассе для выполнения определенных требований. Шаблоны в репозитории VTS имеют следующие расширения:

Рисунок 5. Расширение существующих шаблонов в репозитории VTS.

Разработчики могут расширять существующие шаблоны в соответствии с требованиями к тестированию. Распространенные причины для расширения шаблонов:

  • Специальные процедуры тестирования, например подготовка устройства с помощью специальных команд.
  • Генерировать разные тестовые сценарии и названия тестов.
  • Анализ результатов путем чтения результата выполнения команды или использования других условий.

Чтобы упростить расширение существующих шаблонов, в них содержатся методы, предназначенные для каждой функции. Если у вас есть улучшенные варианты дизайна для существующих шаблонов, мы рекомендуем вам внести свой вклад в базу кода VTS.