Модули для нескольких устройств

В этом документе представлены пошаговые инструкции по созданию многоустройственных модулей, а также указаны известные ограничения.

Образец

Предоставляется многоустройственный модуль 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 доступны в 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-файлов:

  • Первоначальный прототип был обновлен и теперь устанавливает APK-файлы фрагментов кода через target_preparer в связи с обсуждением с командой по анализу покрытия кода: чтобы гарантировать, что результаты измерений покрытия не будут удалены слишком рано, удаление с помощью Harness, а не тестовым кодом в бинарных файлах Python, обеспечивает лучшие гарантии с точки зрения времени выполнения.

Шаг 5: Запустите тест локально: test

В настоящее время многоустройственные тесты выполняются только на физических устройствах. Перед запуском теста убедитесь, что ваши тестовые устройства находятся в надлежащем состоянии. Команда adb devices должна вывести список подключенных устройств. Если список содержит устройства, не предназначенные для тестирования, укажите устройства для теста с помощью флага -s.

Для проверки Wi-Fi убедитесь, что Wi-Fi включен на устройствах (после сброса до заводских настроек).

Вы можете запустить тест локально с помощью команды `test`:

$ atest CtsWifiAwareTestCases

В сводке результатов тестирования вы должны увидеть количество использованных устройств в заголовке, примерно так: 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

Ожидалось получить как минимум 2 объекта контроллера, получен 1.

Тестовые модули бывают либо для нескольких устройств, либо для одного устройства; смешанных модулей не существует. Если вы попытаетесь запустить модуль для нескольких устройств без указания конкретного устройства, вы увидите следующую ошибку:

Expected to get at least 2 controller objects, got 1

Запуск модуля в многоустройственном режиме решит проблему.

Для CTS: вы можете использовать шардинг для его запуска (например: --shard-count 2) или run cts-multidevces .