Настройка сегментирования

На этой странице описано, как можно настроить модуль набора (AndroidTest.xml) с помощью сегментирования и добиться максимальной скорости при непрерывном выполнении в лаборатории. Мы постараемся описать варианты в общем виде и обосновать использование каждого из них.

При непрерывном запуске набора в лаборатории набор обычно сегментируется на несколько устройств, чтобы сократить общее время завершения. Обычно платформа пытается сбалансировать время выполнения каждого сегмента, чтобы минимизировать общее время выполнения (когда завершается последний сегмент). Однако из-за особенностей некоторых тестов у нас не всегда достаточно информации, и владельцу модуля необходимо настроить определенное поведение.

Можно ли разделить таблицу на сегменты?

Модуль (AndroidTest.xml) можно пометить тегом <option name="not-shardable" value="true" />, чтобы сообщить тестовой системе, что его не нужно разбивать на сегменты.

В большинстве случаев лучше позволить фреймворку разбить модуль на фрагменты (это поведение по умолчанию). Однако иногда вам может понадобиться переопределить это поведение:

  • Если настройка модуля стоит дорого:

При сегментировании модуля подготовка (установка APK, передача файла и т. д.) может выполняться один раз для каждого устройства. Если настройка модуля занимает много времени и стоит дорого, а время выполнения теста невелико, то модуль следует пометить как нешардируемый.

  • Если в модуле мало тестов:

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

Инструментальные тесты: максимальное количество сегментов

Инструментальный тест, запущенный через AndroidJUnitTest, не сообщает тестовому набору, сколько тестов входит в инструментарий, пока мы не установим и не запустим APK. Эти операции требуют больших затрат и не могут быть выполнены во время сегментирования для всех модулей пакета.

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

Поэтому, если в APK-файле инструментального теста мало тестов, добавление тега <option name="not-shardable" value="true" /> к модулю позволит системе понять, что разделять этот модуль нецелесообразно.

У исполнителя AndroidJUnitTest есть специальный параметр, позволяющий указать максимальное количество сегментов, на которые он может разбивать тесты: <option name="ajur-max-shard" value="5" />.

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

Например, если APK-файл инструментального теста содержит только два тестовых сценария, но вы все равно хотите его разделить, значение ajur-max-shard, равное 2, гарантирует, что вы не создадите пустые сегменты.