Напишите программу запуска тестов 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 или runner, вы реализуете 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 для тестов, которые должны или не должны запускаться.

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