Напишите программу запуска тестов Tradefed

На этой странице описывается, как написать новую программу запуска тестов в Tradefed.

Фон

Если вам интересно место средств запуска тестов в архитектуре Tradefed, см. Структура средства запуска тестов .

Это не является обязательным условием для написания нового средства запуска тестов; программы запуска тестов могут быть написаны изолированно.

Минимум: реализация интерфейса.

Минимум для того, чтобы квалифицироваться как средство запуска тестов Tradefed, — это реализовать интерфейс IRemoteTest и, более конкретно, метод run(TestInformation testInfo, ITestInvocationListener listener) .

Этот метод вызывается программой при использовании средства запуска тестов, аналогично Java Runnable.

Каждая часть этого метода считается частью выполнения средства запуска тестов.

Сообщите о результатах тестировщика

Метод run в базовом интерфейсе предоставляет доступ к объекту-прослушивателю типа ITestInvocationListener . Этот объект является ключом к сообщению структурированных результатов от тестировщика к программному обеспечению.

Сообщая структурированные результаты, средство запуска тестов обладает следующими свойствами:

  • Сообщите правильный список всех выполненных тестов, сколько времени они заняли и были ли они пройдены по отдельности, не пройдены или какие-либо другие состояния.
  • Сообщите о показателях, связанных с тестами, если это применимо, например, о показателях времени установки.
  • Установите большинство инструментов инфраструктуры, например отображение результатов и показателей и т. д.
  • Обычно легче отлаживать, поскольку существует более детальная трассировка выполнения.

Тем не менее, представление структурированных результатов не является обязательным; участник тестирования может просто захотеть оценить состояние всего выполнения как ПРОЙДЕНО или НЕУДАЧНО, без каких-либо подробностей фактического выполнения.

Следующие события могут быть вызваны в прослушивателе, чтобы уведомить обвязку о текущем ходе выполнения:

  • testRunStarted: уведомляет о начале группы связанных друг с другом тестовых случаев.
    • testStarted: уведомляет о начале запуска тестового примера.
    • testFailed/testIgnored: уведомляет об изменении состояния текущего тестового примера. Тестовый пример без какого-либо изменения состояния считается пройденным.
    • testEnded: уведомляет об окончании тестового примера.
  • testRunFailed: уведомляет, что общий статус выполнения группы тестовых случаев — сбой. Тестовый запуск может быть успешным или неудачным независимо от результатов тестовых случаев, в зависимости от того, чего ожидало выполнение. Например, двоичный файл, выполняющий несколько тестовых случаев, может сообщить обо всех тестовых случаях, но с кодом завершения с ошибкой (по любой причине: утечка файлов и т. д.).
  • testRunEnded: уведомляет об окончании группы тестовых случаев.

Ответственность за поддержание и обеспечение правильного порядка обратных вызовов лежит на разработчике средства запуска тестов, например, за обеспечение вызова testRunEnded в случае исключения с использованием finally .

Обратные вызовы тестовых случаев ( testStarted , testEnded и т. д.) не являются обязательными. Тестовый запуск может осуществляться без каких-либо тестовых примеров.

Вы могли заметить, что эта структура событий основана на типичной структуре JUnit . Это сделано специально для того, чтобы держать вещи ближе к чему-то базовому, о чем обычно знают разработчики.

Отчеты журналов от средства запуска тестов

Если вы пишете свой собственный тестовый класс или средство выполнения Tradefed, вы реализуете IRemoteTest и получаете ITestInvocationListener с помощью метода run() . Этот прослушиватель можно использовать для регистрации файлов следующим образом:

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

Тестирование с помощью устройства

Минимальный интерфейс, указанный выше, позволяет запускать очень простые тесты, изолированные и не требующие каких-либо особых ресурсов, например модульные тесты Java.

Авторам тестов, которые хотят перейти к следующему этапу тестирования устройств, потребуются следующие интерфейсы:

  • IDeviceTest позволяет получить объект ITestDevice , который представляет тестируемое устройство и предоставляет API для взаимодействия с ним.
  • IBuildReceiver позволяет тесту получить объект IBuildInfo созданный на этапе поставщика сборки, содержащий всю информацию и артефакты, связанные с настройкой теста.

Разработчики тестов обычно интересуются этими интерфейсами, чтобы получить артефакты, связанные с выполнением, например дополнительные файлы, и получить тестируемое устройство, которое будет выбрано во время выполнения.

Тестирование с несколькими устройствами

Tradefed поддерживает одновременное выполнение тестов на нескольких устройствах. Это полезно при тестировании компонентов, требующих внешнего взаимодействия, например сопряжения телефона и часов.

Чтобы написать средство запуска тестов, которое может использовать несколько устройств, вам потребуется реализовать IMultiDeviceTest , который позволит получить карту ITestDevice в IBuildInfo , содержащую полный список представлений устройств и связанную с ними информацию о сборке.

Метод установки из интерфейса всегда будет вызываться перед методом run , поэтому можно с уверенностью предположить, что структура будет доступна при вызове run .

Тесты знают свои настройки

Некоторым реализациям средства запуска тестов для правильной работы может потребоваться информация об общей настройке, например, некоторые метаданные о вызове или о том, какой target_preparer запускался ранее и т. д.

Для этого исполнитель теста может получить доступ к объекту IConfiguration , частью которого он является и в котором он выполняется. Дополнительные сведения см. в описании объекта конфигурации .

Для реализации средства запуска тестов вам потребуется реализовать IConfigurationReceiver для получения объекта IConfiguration .

Гибкий инструмент для запуска тестов

Разработчики тестов могут предоставить гибкий способ запуска своих тестов, если у них есть детальный контроль над ними, например, исполнитель тестов JUnit может запускать каждый модульный тест индивидуально.

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

Поддержка фильтрации описана в интерфейсе ITestFilterReceiver , который позволяет получать наборы фильтров include и exclude для тестов, которые следует или не следует запускать.

Наше соглашение заключается в том, что тест будет запущен, если он соответствует одному или нескольким включенным фильтрам И не соответствует ни одному из исключающих фильтров. Если фильтры включения не заданы, следует запускать все тесты, пока они не соответствуют ни одному из фильтров исключения.