Когда корпус тестов большой или время выполнения становится большим, мы предлагаем возможность разделения тестов на несколько устройств: шардинг .
У сегментирования есть необходимые условия для запуска тестов для поддержки сегментирования.
Большинство основных средств запуска тестов уже поддерживают сегментирование, поэтому дополнительная работа не требуется. Они уже поддерживают сегментирование: инструментальные тесты, тесты на стороне хоста, 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-карту для запуска, но ни на одном устройстве нет SIM-карты, тестовый модуль не работает.
Реализация
Передайте этот флаг функции в основную командную строку Tradefed:
--enable-token-sharding