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

Во время тестирования 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 результат (ы) команды в сообщение protobuf .

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

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

  • Надежность. Драйвер оболочки VTS использует nohup для выполнения команд по умолчанию. Поскольку тесты VTS в основном являются тестами HAL и ядра более низкого уровня, nohup гарантирует, что команды оболочки не зависают во время выполнения.
  • Производительность . Хотя команда adb shell кэширует некоторые результаты (например, перечисление файлов в каталоге), у нее возникают накладные расходы на соединение при выполнении таких задач, как выполнение тестового двоичного файла. Драйвер оболочки VTS поддерживает активное соединение на протяжении всего теста, поэтому единственными накладными расходами являются USB-соединение. В нашем тестировании использование драйвера оболочки VTS для выполнения команды со 100 вызовами пустого двоичного файла gtest примерно на 20 процентов быстрее, чем использование adb shell ; реальная разница больше, поскольку для обмена данными с оболочкой VTS ведется обширное ведение журнала.
  • Государственность . Драйвер оболочки VTS поддерживает сеанс терминала для каждого имени терминала (имя терминала по умолчанию - по умолчанию ). Переменные среды, установленные в одном сеансе терминала, доступны только для последующих команд в том же сеансе.
  • Расширяемый . Командная связь оболочки между инфраструктурой 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')