В этом документе представлены пошаговые инструкции по созданию модулей для нескольких устройств и указаны текущие ограничения, если они известны.
Образец
Предоставляется модуль CTS для нескольких устройств с поддержкой Wi-Fi. Он отправляет сообщение с одного устройства через Wi-Fi и проверяет его получение другим устройством.
Исходный код модуля находится по адресу packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ .
Мы добавили в пример столько комментариев, сколько сочли полезными.
Шаг 1. Создайте папку модуля.
Рекомендуется создать папку для вашего модуля нескольких устройств в проекте пакета, к которому он принадлежит. Например: cts/hostsidetests/multidevices/ . Мы рекомендуем это, чтобы все модули для нескольких устройств оставались размещенными по крайней мере сначала, что облегчит поиск примеров.
Все файлы этого модуля должны быть помещены в отдельную папку модуля. Например: wifi_aware
.
Шаг 2. Создайте тест
Здесь вы реализуете свою тестовую логику. Это сильно зависит от того, что тестируется.
Создайте источник теста Mobly, например: wifi_aware_test.py .
Шаг 3. Создайте файл сборки: Android.bp.
Добавьте файл Android.bp, например packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp . Определите модуль python_test_host, аналогичный:
python_test_host {
name: "CtsWifiAwareTestCases",
main: "wifi_aware_test.py",
srcs: ["wifi_aware_test.py"],
test_suites: [
"cts",
"general-tests",
],
test_options: {
unit_test: false,
},
data: [
// Package the snippet with the mobly test
":wifi_aware_snippet",
],
}
Укажите фрагменты теста с полем данных, которое будет упаковано в двоичный файл и может быть найдено и установлено в тесте с помощью ATest или в режиме непрерывного выполнения.
Mobly Bundled Snippets доступны в Android по адресу external/mobly-bundled-snippets/ .
Необязательно: создайте собственные фрагменты.
Для некоторых модулей, поддерживающих несколько устройств, могут потребоваться специальные фрагменты Mobly. Пример теста включает фрагмент с поддержкой Wi-Fi по адресу packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java , который создан с помощью библиотеки Mobly Snippet Lib, доступной для Android по адресу: external /mobly-snippet-lib/ .
Фрагмент должен быть определен с помощью правила android_test в Android.bp, как и стандартный инструментарий:
android_test {
name: "wifi_aware_snippet",
sdk_version: "current",
srcs: [
"CallbackUtils.java",
"WifiAwareSnippet.java",
],
manifest: "AndroidManifest.xml",
static_libs: [
"androidx.test.runner",
"guava",
"mobly-snippet-lib",
],
}
Шаг 4. Создайте конфигурацию модуля: AndroidTest.xml.
Добавьте файл AndroidTest.xml, например packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml . В этой тестовой конфигурации вам необходимо указать два устройства для теста, аналогично:
<configuration description="Config for CTS Wifi Aware test cases">
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="wifi" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
<device name="device1">
<!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
So it's a lot easier to install APKs outside the python code.
-->
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
<!-- Any python dependencies can be specified and will be installed with pip -->
<option name="dep-module" value="mobly" />
</target_preparer>
</device>
<device name="device2">
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
</device>
<test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
<!-- The mobly-par-file-name should match the module name -->
<option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
<!-- Timeout limit in milliseconds for all test cases of the python binary -->
<option name="mobly-test-timeout" value="60000" />
</test>
</configuration>
Обратите внимание:
- Этот пример теста зависит от Mobly. Для
PythonVirtualenvPreparer
можно указать любую зависимость, которая будет установлена с помощью pip. -
mobly-par-file-name
дляMoblyBinaryHostTest
должно совпадать с именем модуля, как в Android.bp. - Обязательно укажите тайм
mobly-test-timeout
для теста. Оно измеряется в миллисекундах и применяется к полному двоичному выполнению Python (все тестовые случаи вместе). Это нужно для того, чтобы тест-кейсы не зависали навсегда в случае каких-то проблем. - Каждый тег
device
может содержать отдельные настройки для каждого устройства. Конфигурация Mobly получит их в том же порядке, как указано в XML.
Связано с установкой фрагмента apk:
- Первоначальный POC был обновлен для установки APK-файлов фрагментов через target_preparer благодаря разговору с командой покрытия: чтобы гарантировать, что измерения покрытия не удаляются слишком рано, удаление с помощью Harness, а не с помощью тестового кода в двоичных файлах Python, дает лучшие гарантии с точки зрения времени.
Шаг 5. Запустите тест локально: atest
В настоящее время тесты на нескольких устройствах выполняются только на физических устройствах. Перед запуском теста убедитесь, что ваши тестовые устройства находятся в правильном состоянии. Команда adb devices
должна сообщить список подключенных вами устройств. Если в списке есть устройства, не предназначенные для тестирования, укажите устройства для тестирования с помощью флага -s.
Для проверки Wi-Fi убедитесь, что Wi-Fi включен на устройствах (после сброса настроек).
Вы можете запустить тест локально с помощью atest:
$ atest CtsWifiAwareTestCases
Вы должны увидеть количество используемых устройств в сводном заголовке выходных данных теста, что-то вроде Test executed with 2 device(s)
.
Поиск неисправностей
Если тест не пройден при локальном запуске по следующим причинам:
Ошибка виртуального окружения
java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory
Пожалуйста, убедитесь, что virtualenv
находится в вашем PATH. Добавление «~/.local/bin» в PATH должно исправить это. если virtualenv не установлен, следуйте: https://virtualenv.pypa.io/en/latest/installation.html.
Ожидалось получить как минимум 2 объекта контроллера, получено 1
Тестовые модули бывают многоустройствными или одноустройствными, смешанных модулей не существует. Если вы попытаетесь запустить модуль с несколькими устройствами без нескольких устройств, вы увидите эту ошибку:
Expected to get at least 2 controller objects, got 1
Запуск модуля в режиме нескольких устройств решит проблему.
Для CTS: вы можете использовать сегментирование для его запуска (например: --shard-count 2) или run cts-multidevces
.
В этом документе представлены пошаговые инструкции по созданию модулей для нескольких устройств и указаны текущие ограничения, если они известны.
Образец
Предоставляется модуль CTS для нескольких устройств с поддержкой Wi-Fi. Он отправляет сообщение с одного устройства через Wi-Fi и проверяет его получение другим устройством.
Исходный код модуля находится по адресу packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ .
Мы добавили в пример столько комментариев, сколько сочли полезными.
Шаг 1. Создайте папку модуля.
Рекомендуется создать папку для вашего модуля нескольких устройств в проекте пакета, к которому он принадлежит. Например: cts/hostsidetests/multidevices/ . Мы рекомендуем это, чтобы все модули для нескольких устройств хотя бы поначалу оставались расположенными рядом, что облегчит поиск примеров.
Все файлы этого модуля должны быть помещены в отдельную папку модуля. Например: wifi_aware
.
Шаг 2. Создайте тест
Здесь вы реализуете свою тестовую логику. Это сильно зависит от того, что тестируется.
Создайте источник теста Mobly, например: wifi_aware_test.py .
Шаг 3. Создайте файл сборки: Android.bp.
Добавьте файл Android.bp, например packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp . Определите модуль python_test_host, аналогичный:
python_test_host {
name: "CtsWifiAwareTestCases",
main: "wifi_aware_test.py",
srcs: ["wifi_aware_test.py"],
test_suites: [
"cts",
"general-tests",
],
test_options: {
unit_test: false,
},
data: [
// Package the snippet with the mobly test
":wifi_aware_snippet",
],
}
Укажите фрагменты теста с полем данных, которое будет упаковано в двоичный файл и может быть найдено и установлено в тесте с помощью ATest или в режиме непрерывного выполнения.
Mobly Bundled Snippets доступны в Android по адресу external/mobly-bundled-snippets/ .
Необязательно: создайте собственные фрагменты.
Для некоторых модулей, поддерживающих несколько устройств, могут потребоваться специальные фрагменты Mobly. Пример теста включает фрагмент с поддержкой Wi-Fi по адресу packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java , который создан с помощью библиотеки Mobly Snippet Lib, доступной для Android по адресу: external /mobly-snippet-lib/ .
Фрагмент должен быть определен с помощью правила android_test в Android.bp, как стандартный инструментарий:
android_test {
name: "wifi_aware_snippet",
sdk_version: "current",
srcs: [
"CallbackUtils.java",
"WifiAwareSnippet.java",
],
manifest: "AndroidManifest.xml",
static_libs: [
"androidx.test.runner",
"guava",
"mobly-snippet-lib",
],
}
Шаг 4. Создайте конфигурацию модуля: AndroidTest.xml.
Добавьте файл AndroidTest.xml, например packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml . В этой тестовой конфигурации вам необходимо указать два устройства для теста, аналогично:
<configuration description="Config for CTS Wifi Aware test cases">
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="wifi" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
<device name="device1">
<!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
So it's a lot easier to install APKs outside the python code.
-->
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
<!-- Any python dependencies can be specified and will be installed with pip -->
<option name="dep-module" value="mobly" />
</target_preparer>
</device>
<device name="device2">
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
</device>
<test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
<!-- The mobly-par-file-name should match the module name -->
<option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
<!-- Timeout limit in milliseconds for all test cases of the python binary -->
<option name="mobly-test-timeout" value="60000" />
</test>
</configuration>
Обратите внимание:
- Этот пример теста зависит от Mobly. Для
PythonVirtualenvPreparer
можно указать любую зависимость, которая будет установлена с помощью pip. -
mobly-par-file-name
дляMoblyBinaryHostTest
должно совпадать с именем модуля, как в Android.bp. - Укажите тайм-аут
mobly-test-timeout
для теста. Оно измеряется в миллисекундах и применяется к полному двоичному выполнению Python (все тестовые случаи вместе). Это нужно для того, чтобы тест-кейсы не зависали навсегда в случае каких-то проблем. - Каждый тег
device
может содержать отдельные настройки для каждого устройства. Конфигурация Mobly получит их в том же порядке, как указано в XML.
Связано с установкой фрагмента apk:
- Первоначальный POC был обновлен для установки APK-файлов фрагментов через target_preparer благодаря разговору с командой покрытия: чтобы гарантировать, что измерения покрытия не удаляются слишком рано, удаление с помощью Harness, а не с помощью тестового кода в двоичных файлах Python, дает лучшие гарантии с точки зрения времени.
Шаг 5. Запустите тест локально: atest
В настоящее время тесты на нескольких устройствах выполняются только на физических устройствах. Перед запуском теста убедитесь, что ваши тестовые устройства находятся в правильном состоянии. Команда adb devices
должна сообщить список подключенных вами устройств. Если в списке есть устройства, не предназначенные для тестирования, укажите устройства для тестирования с помощью флага -s.
Для проверки Wi-Fi убедитесь, что Wi-Fi включен на устройствах (после сброса настроек).
Вы можете запустить тест локально с помощью atest:
$ atest CtsWifiAwareTestCases
Вы должны увидеть количество используемых устройств в сводном заголовке выходных данных теста, что-то вроде Test executed with 2 device(s)
.
Поиск неисправностей
Если тест не пройден при локальном запуске по следующим причинам:
Ошибка виртуального окружения
java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory
Пожалуйста, убедитесь, что virtualenv
находится в вашем PATH. Добавление «~/.local/bin» в PATH должно исправить это. если virtualenv не установлен, следуйте: https://virtualenv.pypa.io/en/latest/installation.html.
Ожидалось получить как минимум 2 объекта контроллера, получено 1
Тестовые модули бывают многоустройствными или одноустройствными, смешанных модулей не существует. Если вы попытаетесь запустить модуль с несколькими устройствами без нескольких устройств, вы увидите эту ошибку:
Expected to get at least 2 controller objects, got 1
Запуск модуля в режиме нескольких устройств решит проблему.
Для CTS: вы можете использовать сегментирование для его запуска (например: --shard-count 2) или run cts-multidevces
.