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

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

Архитектура

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

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

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

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

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

Составители тестов

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

  • Подготовители целей для одного устройства (пример в 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 подготовки целевого объекта VtsDeviceInfoCollector .
  • Устройство 2 включает в себя дополнительную FilePusher подготовки FilePusher которая 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')