Во время тестирования 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
.
Платформа 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')