В этом документе приведены пошаговые инструкции по созданию модулей, оптимизированных для любых устройств, и указаны известные ограничения.
Образец
Предоставляется многопользовательский модуль CTS с поддержкой Wi-Fi Aware. Он отправляет сообщение с одного устройства по 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 или при непрерывном выполнении.
В Android фрагменты кода Mobly Bundled Snippets доступны в каталоге external/mobly-bundled-snippets/.
Как создавать специальные фрагменты
Для некоторых модулей, предназначенных для нескольких устройств, могут потребоваться специальные фрагменты кода Mobly. Пример теста содержит фрагмент кода для Wi-Fi Aware по адресу 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-файла фрагмента:
- Первоначальная проверка концепции была обновлена, чтобы устанавливать APK-файлы фрагментов с помощью target_preparer. Это было сделано после обсуждения с командой Coverage. Чтобы гарантировать, что данные о покрытии не будут удалены слишком рано, лучше использовать для удаления Harness, а не код тестирования в исполняемых файлах Python.
Шаг 5. Запустите локальное тестирование с помощью команды atest
В настоящее время многоустройственные тесты проводятся только на физических устройствах. Перед запуском теста убедитесь, что тестовые устройства находятся в нужном состоянии. Команда adb
devices должна показать список подключенных устройств. Если в списке есть устройства, которые не предназначены для тестирования, укажите устройства для тестирования с помощью флага -s.
Для тестов Wi-Fi убедитесь, что на устройствах включен Wi-Fi (после сброса настроек).
Вы можете запустить тест локально с помощью atest:
$ atest CtsWifiAwareTestCases
В заголовке сводки в последнем выводе команды atest должно быть указано количество устройств, например Test executed with 2 device(s).
Устранение неполадок
Если при локальном тестировании возникает ошибка:
Ошибка Virtualenv
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.
Ожидалось получить не менее двух объектов контроллера, получен один.
Тестовые модули могут быть одно- или многоустройственными, смешанных модулей не бывает. Если вы попытаетесь запустить модуль для нескольких устройств, не подключив их, то увидите следующую ошибку:
Expected to get at least 2 controller objects, got 1
Чтобы устранить проблему, запустите модуль в режиме нескольких устройств.
Для CTS можно использовать сегментирование, чтобы запустить его (например, --shard-count 2) или run cts-multidevces.