Тестирование на нескольких устройствах

VTS поддерживает тесты, требующие взаимодействия между несколькими устройствами Android.

Архитектура

VTS использует фреймворк TradeFed для получения и передачи серийных номеров устройств тестовым модулям.

Рисунок 1. Последовательные номера устройств, передающих данные по системе VTS.

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

распределение устройств

Инфраструктура тестирования (обычно планировщик тестов) выделяет доступные устройства, удовлетворяющие требованиям, указанным в конфигурации плана тестирования, для фреймворка VTS. Выделенные устройства резервируются для плана тестирования, даже если тестовый модуль их не использует. Затем исполняемые файлы агента VTS загружаются и запускаются на всех выделенных устройствах (если специально не указано иное). Это гарантирует доступность TCP-соединений для команд оболочки и RPC-вызовов HAL для всех устройств в тестовом сценарии.

Подготовка к экзаменам

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

  • Инструменты подготовки целевых устройств для одного устройства (пример на VtsDeviceInfoCollector ):
    • Этот параметр можно указать только в конфигурации плана тестирования с необходимым списком устройств (в будущих версиях будет предусмотрена возможность настройки на уровне модулей).
    • Принимается только один серийный номер устройства.
    • Выполните задачи подготовки и очистки для конкретного устройства.
  • Инструменты подготовки целевых сред для нескольких устройств (пример в VtsPythonVirtualenvPreparer ):
    • Может быть указан в конфигурации плана тестирования или конфигурации тестового модуля.
    • Получить все серийные номера устройств
    • Запустите задачи подготовки и очистки для каждого устройства или для всех устройств.

Тестовые модули

После завершения настройки хоста/устройств тестовые модули получают список устройств. Для каждого многоустройственного тестового модуля запускается один тестовый модуль на Python на стороне хоста. Доступ к выделенным устройствам Android из тестовых модулей Python осуществляется в виде списка объектов AndroidDevice :

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

Все выделенные устройства резервируются для плана тестирования, даже если в тестовом модуле плана используется только одно устройство.

Взаимодействие устройства во время тестирования

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

Тип 1: Тесты HAL на стороне хоста

В тестах HAL на стороне хоста можно использовать драйверы VTS HAL, которые по умолчанию загружаются на устройства:

Рисунок 2. Тест HAL на стороне хоста.

В этом сценарии:

  • Тестовая логика выполняется на хосте.
  • На стороне хоста тестовый скрипт отправляет RPC-вызовы драйверам на каждом устройстве.
  • Взаимодействие устройств координируется на стороне хоста.

Тип 2: Тестирование на стороне хоста с использованием агентов.

Вместо использования агентов VTS на устройстве, тест на стороне хоста может также отправлять собственный агент (приложение или исполняемый файл) на каждое устройство:

Рисунок 3. Тестирование на стороне хоста с использованием агента.

В этом сценарии:

  • Тестовая логика выполняется на хосте.
  • Приложение-агент (или исполняемый файл) устанавливается на каждое устройство.
  • Тестовый скрипт на стороне хоста отправляет команды приложениям на каждом устройстве.
  • Взаимодействие устройств координируется на стороне хоста.

Например, тесты Next Billion User в текущем репозитории VTS представляют собой тесты на стороне хоста, на основе приложений и на нескольких устройствах.

Тип 3: Тесты HIDL на стороне цели

В тестах HIDL для целевых устройств вся логика тестирования размещается в тестовых бинарных файлах на стороне устройства, что требует синхронизации устройств во время выполнения тестов:

Рисунок 4. Целевой тест HIDL.

В этом сценарии:

  • Тестовая логика выполняется на устройствах.
  • Фреймворк на стороне хоста обеспечивает первоначальную идентификацию устройства.
  • Для запуска тестового исполняемого файла на целевой стороне требуется синхронизация:
    • Один и тот же тестовый бинарный файл для всех устройств.
    • Для каждой роли используются разные тестовые исполняемые файлы.

Пример: План тестирования на нескольких устройствах

В этом примере задаются параметры конфигурации для двух устройств:

  • Устройство 1 включает в себя поставщик сборки и средство подготовки целевых объектов VtsDeviceInfoCollector .
  • Устройство 2 включает в себя дополнительный модуль подготовки FilePusher , который отправляет на устройство группу связанных файлов, управляемых хостом.
<configuration description="VTS Codelab Plan">
  ...
<device name="device1">
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
</device>
<device name="device2" >
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
<option name="push-group" value="HostDrivenTest.push" />
</target_preparer>
</device>
<option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" />
</configuration>

Пример: Тестовый скрипт на Python на стороне хоста

Подробную информацию и примеры использования средств подготовки тестов см. в разделе «Средства подготовки тестов» . Полный пример работы на нескольких устройствах на стороне хоста см. в практическом руководстве hello_world_multi .

def setUpClass(self):
logging.info('number of device: %s', self.android_devices)
asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.')
self.dut1 = self.android_devices[0]
self.dut2 = self.android_devices[1]
self.shell1 = self.dut1.shell
self.shell2 = self.dut2.shell

def testSerialNotEqual(self):
'''Checks serial number from two device not being equal.'''
command = 'getprop | grep ro.serial'
res1 = self.shell1.Execute(command)
res2 = self.shell2.Execute(command)

def getSerialFromShellOutput(output):
'''Get serial from getprop query'''
return output[const.STDOUT][0].strip().split(' ')[-1][1:-1]
serial1 = getSerialFromShellOutput(res1)
serial2 = getSerialFromShellOutput(res2)

logging.info('Serial number of device 1 shell output: %s', serial1)
logging.info('Serial number of device 2 shell output: %s', serial2)
asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same')
asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial')
asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')