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

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