Сложная конфигурация тестирования

Некоторые тестовые модули могут требовать специальных шагов настройки и завершения, которые нельзя выполнить в самом тестовом случае. Примеры:

  • устанавливать другие APK-файлы (помимо тестового);
  • передавать некоторые файлы на устройство;
  • выполнять команды (например, adb shell pm …);

Раньше командам, работающим над компонентами, приходилось писать тесты на стороне хоста, чтобы выполнять такие задачи. Для этого нужно было разбираться в тестовой среде Trade Federation, что обычно усложняло тестовый модуль.

Заимствуя из CTS, мы ввели концепцию конфигурации тестового модуля для поддержки таких задач. Список общих задач, приведенный выше, можно выполнить с помощью всего нескольких строк конфигурации. Для максимальной гибкости вы можете реализовать собственный инструмент подготовки целевых объектов, как определено в ITargetPreparer или ITargetCleaner, и настроить его для использования в конфигурации собственного тестового модуля.

Файл конфигурации тестового модуля – это обязательный XML-файл, который добавляется в исходную папку модуля верхнего уровня и называется AndroidTest.xml. Он имеет формат файла конфигурации, используемого в системе автоматизации тестирования Trade Federation. В настоящее время основными тегами, обрабатываемыми через конфигурации тестовых модулей, являются теги target_preparer и test.

Целевые специалисты по подготовке

Тег target_preparer, как следует из названия, определяет подготовитель целевого устройства (см. ITargetPreparer), который предлагает метод настройки, вызываемый перед выполнением тестового модуля. Если класс, на который ссылается тег target_preparer, также реализует интерфейс ITargetCleaner, то после завершения тестового модуля будет вызван его метод teardown.

Чтобы использовать встроенную конфигурацию общего модуля, добавьте новый файл AndroidTest.xml в папку верхнего уровня для тестового модуля и заполните его следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<!-- [insert standard AOSP copyright here] -->
<configuration description="Test module config for Foo">
<!-- insert options here -->
</configuration>

Например, мы можем добавить следующие теги вариантов (в комментарий "insert" выше):

    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
        <option name="run-command" value="settings put secure accessibility_enabled 1" />
        <option name="teardown-command" value="settings put secure accessibility_enabled 0" />
    </target_preparer>

Эти параметры настраивают тестовую программу для:

  1. перед вызовом тестового модуля выполните на устройстве команду оболочки "settings put secure accessibility_enabled 1"
  2. После завершения модуля тестирования выполните команду оболочки "settings put secure accessibility_enabled 0".

В этом примере специальные возможности включаются и отключаются до и после выполнения тестового модуля соответственно. Мы привели простой пример, но теперь нужно рассказать подробнее о том, как используется тег option. Как показано выше, у тега может быть два атрибута: name и value. Атрибут name должен ссылаться на один из вариантов, предлагаемых разработчиком.

Точное назначение поля зависит от того, как автор определил параметр: это может быть строка, число, логическое значение или даже путь к файлу. Ниже приведено краткое описание трех распространенных целевых подготовителей:

  • название класса: PushFilePreparer

    • short name: push-file
    • function: передает произвольные файлы из папки тестового случая в целевую папку на устройстве.
    • notes:
      • Подготовитель может переносить файлы и папки по отдельности. Это означает, что вы не можете перенести файл в папку на устройстве, не указав название файла в этой папке.
    • options:
      • push-file: спецификация push-запроса, указывающая локальный файл и путь, по которому он должен быть отправлен на устройство. Может повторяться. Если для отправки по одному и тому же удаленному пути настроено несколько файлов, будет отправлен последний из них.
      • push: (устарело) Спецификация push-уведомлений в формате /path/to/srcfile.txt->/path/to/destfile.txt или /path/to/srcfile.txt->/path/to/destdir/. Может повторяться. Этот путь может быть указан относительно каталога тестового модуля или каталога out.
      • post-push: команда, которая будет выполнена на устройстве (с помощью adb shell <your command>) после того, как все попытки отправки будут предприняты. Обычно для управления разрешениями используется команда chmod.
  • название класса: InstallApkSetup;

    • short name:install-apk
    • function: отправляет произвольные APK-файлы в целевой каталог на устройстве.
    • Варианты:
      • test-file-name: название APK-файла, который нужно установить на устройство.
      • install-arg: дополнительные аргументы, которые будут переданы команде pm install, включая дефис в начале, например "-d". Может повторяться
  • название класса: RunCommandTargetPreparer

    • short name: run-command
    • function: выполняет произвольные команды оболочки до или после выполнения тестового модуля.
    • options:
      • run-command: команда adb shell, которую нужно выполнить. Может повторяться
      • teardown-command: команда adb shell, которая выполняется на этапе демонтажа. Может повторяться

Тестовый класс

Тестовый класс – это класс Trade Federation, который используется для выполнения теста.

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="android.test.example.helloworld"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

Вот три распространенных класса тестов:

  • название курса: GTest

    • short name: gtest
    • function: тест, который запускает пакет нативных тестов на указанном устройстве.
    • Варианты:
      • native-test-device-path: путь на устройстве, где находятся нативные тесты.
  • название класса: InstrumentationTest

    • short name: instrumentation
    • function: тест, который запускает пакет инструментальных тестов на указанном устройстве;
    • options:
      • package: название пакета манифеста тестового приложения Android, которое нужно запустить.
      • class: название класса теста, который нужно запустить.
      • method: название метода тестирования, который нужно запустить.
  • название класса: AndroidJUnitTest;

    • function: Тест, который запускает пакет инструментальных тестов на указанном устройстве с помощью android.support.test.runner.AndroidJUnitRunner. Это основной способ выполнения инструментальных тестов.