Тестовый шардинг

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

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

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