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

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 на стороне хоста могут использовать драйверы HAL VTS, которые по умолчанию загружаются на устройства:

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

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

  • Логика тестирования выполняется на хосте.
  • Сценарий тестирования на стороне хоста отправляет вызовы RPC драйверам на каждом устройстве.
  • Сторона хоста координирует взаимодействие устройств.

Тип 2: Тесты на основе агента на стороне хоста

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

Рис. 3. Агентный тест на стороне хоста.

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

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

Например, тесты «Следующий миллиард пользователей » в текущем репозитории 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')