Статьи

Как работает тестовый фреймворк

Поработав некоторое время с игровой платформой, нам нужно было написать более качественные интеграционные тесты.
Под лучше я имею в виду, что легче поддерживать. Мне нравится Selenium, но есть проблемы повторного использования и обслуживания. В любом случае, не вдаваясь в подробности, мне пришлось выяснить, как работает страница @tests.

Страница @tests для одного из примеров приложений

Прежде всего позвольте мне заверить вас: в этом нет магии. На самом деле это довольно легко следовать, как только вы понимаете, как работает игра. Единственная сложная часть — бит селена.

TestRunner является одним из модулей по умолчанию в игровой среде вместе с secure, crud и некоторыми другими. Вы можете найти его в PLAY_HOME / modules. Вы также можете просмотреть код на GitHub.

Добавление маршрутов — код плагина

Насколько я понимаю, модуль содержит только плагин

Под testRunner есть четыре папки

  • src — исходный код плагина
  • public — содержит все статические html как в каждом игровом проекте
  • приложение — контроллеры и представления
  • firephoque — просто папка библиотеки

Давайте углубимся в детали.

В src есть файл play.plugins, который сообщает платформе, что реализация плагина — play.modules.testrunner.TestRunnerPlugin.

Этот класс расширяет PlayPlugin и имеет 3 метода onLoad (), onRoutesLoaded (), onApplicationReady ().

Эти методы вызываются самим фреймворком … угадайте когда? 🙂

onLoad () просто добавляет тестовую папку в путь к классам для приложения и для всех модулей.

onRoutesLoaded () добавляет тестовые маршруты в приложение

	
@Override
 public void onRoutesLoaded() {
    Router.addRoute("GET", "/@tests", "TestRunner.index");
    Router.addRoute("GET", "/@tests.list", "TestRunner.list");
    Router.addRoute("GET", "/@tests/{<.*>test}", "TestRunner.run");
    Router.addRoute("POST", "/@tests/{<.*>test}", "TestRunner.saveResult");
    Router.addRoute("GET", "/@tests/emails", "TestRunner.mockEmail");
 }

и последний, onApplicationReady () просто печатает тестовый URL в консоль.

Примечание. Затем эта строка используется в режиме автоматического тестирования для определения готовности приложения. Посмотрите на строки base.py 204-215

Другой класс в той же папке, называемый FirePhoque.java , используется в режиме автоматического тестирования для имитации браузера.

Подводя итог, мы до сих пор запускали приложение с некоторыми дополнительными маршрутами, указывающими на методы TestRunner.

Где все это происходит — контроллеры и представления

Давайте посмотрим на контроллер TestRunner . Вы можете увидеть все методы, добавленные в качестве маршрутов в TestRunnerPlugin. Давайте посмотрим, что делают некоторые из методов.

index ()
использует TestEngine, чтобы выяснить, какие из них являются модульными, функциональными и селеновыми. Затем он просто помещает три списка в область рендеринга, и страница просмотра index.html хорошо отображает их в том, что вы видите, когда переходите к / @ tests

list ().
Это список всех тестов, представленных в виде текста. Насколько я знаю, используется только auto-test

run ().
Это метод, который на самом деле запускает Java-тесты и отправляет обратно результаты.

saveResult ()
Этот метод сохраняет файл в папке результатов теста для каждого теста, который был выполнен

Выполнение Java-тестов

 

Модульный и функциональный тест достаточно прост для понимания. Если вы хотите получить больше информации, посмотрите на метод run в TestEngine

Выполнение тестов Selenium

Теперь перейдем к сложной части.

Файлы, оканчивающиеся на .test.html, являются тестами селена и передаются в контроллер TestRunner как .test.html.suite.

Контроллер просто выполнить

test = test.substring(0, test.length() - 6);
render("TestRunner/selenium-suite.html", test);

Теперь, если вы посмотрите на selenium-suite.html, вы почесываете голову, потому что нет ничего, кроме таблицы со строкой и ссылкой на тест.

Чтобы понять, нужно взглянуть на
строки
index.html 362-380.

Этот код просто загружает ядро ​​селенового ядра (чистый DHTML) в iframe, делает его видимым и вызывает контроллер Testrunner для получения результата каждые 2 секунды, пока он не вернет либо HTTP 500 (для неудачного теста), либо HTTP 200 (как вы уже догадались, тест пройден)

одна картинка стоит тысячи слов

Кадр между тем вызывает контроллер (строки 82-100) загружает html-тест, как любая другая страница приложения, используя TemplateLoader.

Вот почему вы можете использовать теги в тестах на селен! Разве это не здорово?

Теперь ядро ​​selenium запускает html-тест и вызывает метод контроллера saveResult (строки 120-131), который сохраняет файл .passed или .failed в зависимости от результата теста.

Это позволит потоку в index.html перейти к следующему тесту.

Довольно хорошо, не правда ли?

Спасибо за чтение, пожалуйста, оставьте любой отзыв / исправления, которые вы чувствуете.

 

От http://www.devinprogress.info/2011/04/how-play-framework-test-runner-works.html