На этой странице рассказывается, как написать новый тест-раннер в Tradefed.
Фон
Если вы хотите узнать больше о месте тест-раннеров в архитектуре Tradefed, ознакомьтесь со статьей Структура тест-раннера.
Это не является обязательным условием для написания нового средства запуска тестов; средства запуска тестов могут быть написаны изолированно.
Минимальные требования: реализуйте интерфейс
Чтобы считаться исполнителем тестов Tradefed, необходимо реализовать интерфейс IRemoteTest и, в частности, метод run(TestInformation testInfo, ITestInvocationListener listener).
Этот метод вызывается тестовой средой при использовании средства запуска тестов, аналогично Java Runnable.
Каждая часть этого метода считается частью выполнения средства запуска тестов.
Отчеты о результатах тестирования от средства запуска тестов
Метод run в базовом интерфейсе предоставляет доступ к объекту прослушивателя типа ITestInvocationListener. Этот объект позволяет передавать структурированные результаты тестирования из средства запуска тестов в оболочку.
При использовании структурированных результатов тестирования у средства запуска тестов есть следующие свойства:
- Сообщить список всех выполненных тестов, время их выполнения и результаты (пройден, не пройден или другой статус).
- При необходимости укажите отчетные показатели, связанные с тестированием, например показатели времени установки.
- Подходит для большинства инструментов инфраструктуры, например для отображения результатов и показателей.
- Обычно отладка проще, поскольку есть более подробная трассировка выполнения.
Однако отправлять структурированные результаты необязательно. Тестировщик может просто оценить состояние всего запуска как PASSED или FAILED без каких-либо подробностей о фактическом выполнении.
Для уведомления тестовой среды о текущем ходе выполнения можно вызвать следующие события:
- 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 для тестов, которые должны или не должны выполняться.
По нашему соглашению, тест будет запущен, ТОЛЬКО ЕСЛИ он соответствует одному или нескольким фильтрам включения И не соответствует ни одному из фильтров исключения. Если фильтры включения не заданы, должны выполняться все тесты, которые не соответствуют ни одному из фильтров исключения.