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