Когда корпус тестов большой или время выполнения становится длительным, мы предлагаем возможность разделения тестов на несколько устройств: шардинг .
Для поддержки шардинга необходимы предварительные условия для тест-раннера.
Большинство основных тестовых программ уже поддерживают шардинг, поэтому никаких дополнительных действий не требуется. Они уже поддерживают шардинг: инструментальные тесты, тесты, управляемые на стороне хоста, 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