Команды оболочки устройства

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

Использование оболочки ADB

Тесты, требующие отключения USB-порта или перезагрузки устройства во время тестирования, должны использовать оболочку ADB, поскольку драйвер оболочки VTS недоступен без постоянного USB-подключения. Вы можете вызвать оболочку ADB из объекта AndroidDevice в тестовом сценарии Python. Примеры:

  • Получите объект устройства Android:
    self.device = self.android_devices[0]
    
  • Выполните одну команду оболочки:
    result = self.device.adb.shell(‘ls')
    

Использование драйвера оболочки VTS

Драйвер оболочки VTS — это двоичный агент, который запускается на устройстве и выполняет команды оболочки. По умолчанию VTS использует драйвер оболочки, если драйвер работает на устройстве, потому что этот метод имеет меньшую задержку, чем использование команды adb shell .

Рисунок 1. Драйвер оболочки VTS.

Инфраструктура VTS поддерживает тестирование на нескольких устройствах, где каждое устройство Android представлено как объект AndroidDevice в базовой программе выполнения. По умолчанию платформа VTS отправляет исполняемые файлы агента VTS и драйвера оболочки VTS на каждое устройство Android и устанавливает TCP-соединения с агентами VTS на этих устройствах.

Чтобы выполнить команду оболочки, сценарий Python на стороне хоста вызывает функцию объекта ShellMirror внутри объекта AndroidDevice. Объект ShellMirror упаковывает тексты команд оболочки в сообщение protobuf и отправляет его (по TCP-каналу) агенту VTS на Android-устройстве. Затем агент, работающий на устройстве, перенаправляет команду оболочки драйверу оболочки VTS через сокет Unix.

Когда драйвер оболочки VTS получает команду оболочки, он выполняет команду через nohup в оболочке устройства, чтобы предотвратить зависание. Stdout, stderr и код возврата затем извлекаются из nohup и отправляются обратно агенту VTS. Наконец, агент отвечает хосту, заключая результаты команды в сообщение protobuf .

Преимущества

Преимущества использования драйвера оболочки VTS вместо adb shell включают в себя:

  • Надежность. Драйвер оболочки VTS использует nohup для выполнения команд по умолчанию. Поскольку тесты VTS в основном представляют собой тесты HAL и ядра более низкого уровня, nohup гарантирует, что команды оболочки не зависают во время выполнения.
  • Производительность . Несмотря на то, что команда adb shell кэширует некоторые результаты (например, список файлов в каталоге), при выполнении таких задач, как выполнение тестового двоичного файла, возникает дополнительная нагрузка на подключение. Драйвер оболочки VTS поддерживает активное соединение на протяжении всего теста, поэтому единственными накладными расходами является связь через USB. В нашем тестировании использование драйвера оболочки VTS для выполнения команды со 100 вызовами пустого двоичного файла gtest примерно на 20 процентов быстрее, чем использование adb shell ; фактическая разница больше, поскольку связь оболочки VTS имеет обширную регистрацию.
  • Сохранение состояния . Драйвер оболочки VTS поддерживает сеанс терминала для каждого имени терминала (имя терминала по умолчанию — default ). Переменные среды, установленные в одном терминальном сеансе, доступны только для последующих команд в том же сеансе.
  • Расширяемый . Коммуникации команд оболочки между инфраструктурой VTS и драйвером устройства завернуты в protobuf, чтобы обеспечить потенциальное сжатие, удаленное взаимодействие, шифрование и т. д. в будущем. Также доступны другие возможности для повышения производительности, в том числе синтаксический анализ результатов на стороне устройства, когда накладные расходы на связь становятся больше, чем синтаксический анализ строки результата.

Недостатки

К недостаткам использования драйвера оболочки VTS вместо adb shell относятся:

  • Дополнительные бинарники . Файлы агента VTS должны быть отправлены на устройство и очищены после выполнения теста.
  • Требуется активное подключение . Если TCP-соединение между хостом и агентом потеряно во время тестирования (из-за отключения USB, закрытия порта, сбоя устройства и т. д.) намеренно или непреднамеренно, команда оболочки не может быть передана агенту VTS. Даже при автоматическом переключении на adb shell результат и состояние команды до отключения были бы неизвестны.

Примеры

Примеры использования команд оболочки в тестовом сценарии Python на стороне хоста VTS:

  • Получите объект устройства Android:
    self.device = self.android_devices[0]
    
  • Получить объект оболочки для выбранного устройства:
    self.shell = self.device.shell
    
  • Выполните одну команду оболочки:
    results = self.shell.Execute(‘ls')
    
  • Выдать список команд оболочки:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Объект результата команды

Объект, возвращаемый из выполнения команды оболочки, представляет собой словарь, содержащий ключи stdouts , stderrs и return_codes . Независимо от того, предоставляется ли команда оболочки в виде одной строки или списка командных строк, каждое значение результирующего словаря всегда является списком.

Чтобы проверить код возврата списка команд, тестовый сценарий должен проверить индексы. Пример:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

В качестве альтернативы сценарий может проверять индекс каждой команды по отдельности. Пример:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')