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

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

Архитектура

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

Рисунок 1. Серийные номера устройств прохождения СУДС.

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

Рисунок 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')