Тестирование сегментирования

Если тестовый корпус большой или время выполнения становится слишком долгим, мы предлагаем возможность разделить тесты между несколькими устройствами – шардинг.

Для поддержки сегментирования в тест-раннере должны быть выполнены предварительные условия.

Большинство основных средств запуска тестов уже поддерживают сегментирование, поэтому дополнительная работа не требуется. Эти тесты уже поддерживают сегментирование: инструментальные тесты, тесты, управляемые хостом, GTest.

В Tradefed поддерживаются два типа сегментирования: локальное и распределенное. У них есть общие свойства, которые описаны на этой странице.

Общие свойства

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

Основное различие между формами сегментирования заключается в том, как выполняются тесты. Подробная информация приведена в разделах ниже.

Локальное сегментирование

Локальное сегментирование означает, что все устройства, участвующие в выполнении сегментированного вызова, подключены к одному физическому хосту.

Выполнение

При локальном сегментировании используется то, что все устройства подключены к одному хосту. Создается пул тестов, которые нужно выполнить, и каждое устройство опрашивает тесты, когда оно свободно (то есть завершило предыдущий тест). Это позволяет оптимизировать использование устройств. Мы также называем это динамическим сегментированием.

Параметры

--shard-count XX

Распределенное сегментирование

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

Выполнение

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

Главная особенность этой формы в том, что сегменты не знают друг о друге и могут выходить из строя независимо.

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

Параметры

--shard-count XX --shard-index XX

Сегментирование токенов

Разделение токенов можно использовать только с локальным сегментированием. Этот флаг не работает в случаях, когда сегментирование не является локальным. Иногда одно из устройств, участвующих в сегментировании, содержит специальные ресурсы, которых нет у других, например SIM-карту. Некоторые тесты могут работать только при наличии этого специального ресурса и в противном случае завершатся ошибкой.

Для таких случаев мы предлагаем сегментирование токенов. Тестовые модули могут указывать, какие специальные ресурсы им нужны, в файле AndroidTest.xml, а Tradefed направляет тесты на устройство, на котором есть эти ресурсы.

Конфигурация XML

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

value токена соответствует TokenProperty Tradefed и связано с обработчиком в TokenProviderHelper.

Это позволяет запускать тестовые модули на устройствах, которые могут правильно выполнять тесты.

Что делать, если ни одно устройство не может выполнить тест?

Если ни на одном из доступных устройств нет ресурса, соответствующего тестовому модулю, модуль не проходит проверку и пропускается, поскольку его нельзя выполнить правильно.

Например, если для работы тестового модуля требуется SIM-карта, но ни на одном устройстве ее нет, модуль не будет работать.

Реализация

Передайте этот флаг функции в основную командную строку Tradefed:

--enable-token-sharding