Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

Thucydides StepListener отслеживание выполнения тестов

Дек26
2012
Написал Tatyana

Интерфейс net.thucydides.core.steps.StepListener представляет собой класс, прослушивающий ход выполнения теста и получающий данные или результаты в определенных точках его выполнения. StepListener получает информацию от Thucydides на уровне выполнения самих тестовых методов и их шагов (stepStarted, stepIgnored, stepFailed и т.д.). Thucydides использует этот интерфейс для собственных нужд, но также предоставляет нам возможность создать и зарегистрировать свой собственный listener. Для этого нужно реализовать в классе интерфейс net.thucydides.core.steps.StepListener и зарегистрировать его в Thucydides:

import net.thucydides.core.model.Story;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.steps.ExecutedStepDescription;
import net.thucydides.core.steps.StepFailure;
import net.thucydides.core.steps.StepListener;
 
public class MyProjectStepListener implements StepListener {
 
    public void skippedStepStarted(ExecutedStepDescription arg0) {
         
    }
 
    public void stepFailed(StepFailure arg0) {
         
    }
 
    public void stepFinished() {
         
    }
 
    public void stepIgnored() {
         
    }
 
    .
    .
    .
}

Регистрацию MyProjectStepListener можно осуществить двумя способами:

  1. Использовать метод registerListener(final StepListener listener) класса net.thucydides.core.steps.StepEventBus. Класс StepEventBus является своеобразным средством передачи соответствующих уведомлений о ходе выполнения теста всем зарегистрированным слушателям. StepEventBus использует внутри себя разделение на потоки, поэтому работа с ним осуществляется через статический метод getEventBus(), который возвращает экземпляр StepEventBus для текущего потока:
    MyProjectStepListener myProjectStepListener = 
                                                new MyProjectStepListener();
    StepEventBus.getEventBus().registerListener(myProjectStepListener);

    Отменить регистрации можно с помощью метода dropListener:

    StepEventBus.getEventBus().dropListener(myProjectStepListener);

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

  2. Установить класс MyProjectStepListener как сервис-провайдер (service provider) для интерфейса net.thucydides.core.steps.StepListener, тогда класс StepEventBus автоматически обнаружит слушателя и добавит его в список зарегистрированных. Пользовательские слушатели загружаются и регистрируется один раз во время запуска теста. Для того, чтобы установить Ваш класс в качестве сервис-провайдера, нужно расположить конфигурационный файл в директории
    META-INF/services

    Директория в свою очередь должна быть расположена в одной из src папок проекта (например, в src/main/java). Конфигурационный файл представляет собой обычный текстовый файл, имя которого является полным именем типа службы, в нашем случае это net.thucydides.core.steps.StepListener (следите за тем, чтобы у файла не было расширения .txt).
    Структура Thucydides проекта
    Файл должен содержать список имен классов-провайдеров, реализующих методы интерфейса, каждый с новой строки. Для нашего примера в нем будет единственная строка с именем класса MyProjectStepListener:

    example.support.MyProjectStepListener
    

Помимо регистрации слушателей класс StepEventBus предоставляет несколько других полезных методов, например, aStepInTheCurrentTestHasFailed. Используя этот метод можно предотвратить выполнение нежелательных действий после того, как один из шагов закончился неудачно. Необходимость в этом может возникнуть, потому что Thucydides даже после падения одного из шагов, продолжает запускать последующие шаги на выполнение, блокируя обращение только к драйверу. В итоге получается, что сопутствующие действия, вроде записи в файл или изменения ресурсов, продолжают выполняются даже после того, как тест по сути провалился. Проверяя результат метода aStepInTheCurrentTestHasFailed можно запретить, например, выполнение дальнейших запросов к БД, которые после провала теста не представляют никакой ценности:

private static boolean isTestFailed() {
        return StepEventBus.getEventBus().aStepInTheCurrentTestHasFailed();
}
  • Нравится
  • Tweet

Опубликовано в Thucydides - Помечено Thucydides
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← Параллельное выполнение Thucydides тестов с помощью Jenkins
Selenium WebDriver: прокрутка страницы (scrolling) →

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/u0420283/data/www/internetka.in.ua/wp-includes/class-wp-comment-query.php on line 405

29 комментариев

  1. Юрий's Gravatar Юрий
    27.12.2012 at 07:16 | Permalink

    Татьяна, спасибо за статью.
    Я пока не очень хорошо ориентируюсь в Thucydides. Поэтому хотел спросить, как применить на практике то, о чем Вы написали, в каких случаях можно/нужно использовать StepListener?

    • Tatyana's Gravatar Tatyana
      27.12.2012 at 07:56 | Permalink

      Использование StepListener совсем не обязательно. Его стоит использовать только, если Вы хотите реализовать какие-то свои дополнительные функции во время выполнения тестов, например, проверять какие-либо значения перед запуском каждого step-а или после, или может быть Вы захотите делать свой скриншот при каждом изменении на странице (notifyScreenChange). Можно, например, закрыть подключение к БД в случае stepFailed для того, чтобы не выполнялись дальнейшие ненужные запросы. Примеров может быть очень много, StepListener просто дает Вам возможность получить управление в некоторых точках выполнения шагов теста. Как это использовать — зависит от Ваших задач.

      • Николай Алименков's Gravatar Николай Алименков
        10.01.2013 at 13:57 | Permalink

        Добрый день, Татьяна! Вы интересно пишете, не хотите поделиться своим опытом с WebDriver на конференции Selenium Camp 2013 (http://seleniumcamp.com)?

        • Tatyana's Gravatar Tatyana
          11.01.2013 at 07:59 | Permalink

          Добрый день! Большое спасибо за приглашение. К сожалению, в этот раз посетить конференцию я не смогу. Постараюсь принять участие в следующий раз.

  2. Алексей's Gravatar Алексей
    11.01.2013 at 07:46 | Permalink

    Спасибо большое за статью. Очень помогла. Долго бился над решением этого вопроса, а тут всё уже решено. Спасибо.

    • Tatyana's Gravatar Tatyana
      11.01.2013 at 07:47 | Permalink

      Пожалуйста)

  3. Наталья's Gravatar Наталья
    14.02.2013 at 12:17 | Permalink

    Добрый день!
    Спасибо за еще одну очень информативную и полезную статью.
    Я хотела узнать, если в ходе прохождения теста thucydides на мой взгляд делает слишком много ненужных скриншотов, но при этом не делает скриншоты на шагах, где они нужны (вернее делает в первой и последней точке шага, показывая по сути одну и ту же страницу, пропуская при этом средний шаг — где как раз нужно сделать было скриншот). Поможет ли мне StepListener решить эту проблему? Можно ли с его помощью указать thucydides где именно следует делать скриншоты в ходе прохождения теста?

    Спасибо!

  4. Наталья's Gravatar Наталья
    14.02.2013 at 12:38 | Permalink

    Небольшое добавление. Я нашла и попробовал аннотацию @Screenshots(FOR_EACH_ACTION), но все равно получаю тот же результат — т.е. картинку в начале шага, когда нажимается кнопка на главной странице и в конце шага, когда драйвер возвращается на исходную — главную же — страницу. А скриншота подтверждающего то, что драйвер при выполнении шага действительно перешел на заданную страницу — нет.

    • Tatyana's Gravatar Tatyana
      14.02.2013 at 15:22 | Permalink

      StepListener в данном случае никак не поможет, потому что Thucydides использует его же для снятия скриншотов в BaseStepListener, делает скриншот в том числе и для notifyScreenChange().
      Можно попробовать вызвать снятие скриншота в нужный момент принудительно такой вот функцией на странице:

      StepEventBus.getEventBus().notifyScreenChange();
      

      Но это только предположение, потому что там еще присутствует логика проверки дублирования скринов, может и не заработать.

      А вообще, скриншоты можно отключить через установку свойства thucydides.only.save.failing.screenshots в true. Это значительно ускорит процесс выполнения тестов, а проверить открытие страницы можно по урлу с помощью аннотации @At.

  5. Михаил's Gravatar Михаил
    28.02.2013 at 12:38 | Permalink

    Добрый день!
    В отчете есть вкладка Progress и график Project Progress (Requirements), он у меня пустой, какой аннотацией он подключается или чем то еще?

  6. Алексей's Gravatar Алексей
    12.03.2013 at 15:05 | Permalink

    Добрый день Татьяна)
    Скажите пожалуйста можно ли с помощь этого листерна переопределить поведение тестов, то есть например сделать «сломанные тесты» если будет ексепшен типа НоСачЕлмент то вы давать не тест фейлед, а тест брокен? и есть ли подобные листерны в TestNG?

    • Tatyana's Gravatar Tatyana
      12.03.2013 at 18:56 | Permalink

      Добрый день,
      нет, такого сделать нельзя. В целом, листнеры совсем не предназначены для такого глобального изменения поведения.
      StepListener относится именно к библиотеке Thucydides, а не к JUnit, поэтому нельзя проводить параллель с TestNG.

  7. Алексей's Gravatar Алексей
    13.03.2013 at 07:52 | Permalink

    Понял, спасибо)

  8. Евгений's Gravatar Евгений
    29.03.2013 at 08:20 | Permalink

    Татьяна, добрый день!
    Спасибо за статью, правда не совсем понял как использовать метод isTestFailed.

    Я правильно понимаю, что этот метод надо использовать каждый раз, когда в шаге предполагается использовать базу данных (методы без драйвера) в тестовом шаге:


    @Test
    public void TestWithDB(){
    ...
    endUser.step1();
    ...
    if (!isTestFailed){
    endUser.step_with_db_query();
    }
    ...
    if (!isTestFailed){
    endUser.step_with_db_query();
    }
    }

    Можно ли как-то перехватывать isTestFailed=true ?

    Как можно проверять текущее состояние шага, Чтобы такие проверки можно было делать непосредственно в шаге?

    • Tatyana's Gravatar Tatyana
      30.03.2013 at 09:14 | Permalink

      Функция isTestFailed() просто пример того, как можно использовать StepEventBus не подключая своих листнеров. Обратиться к StepEventBus можно откуда угодно, в том числе непосредственно в шаге. Можно также вызывать isTestFailed из класса, который непосредственно работает с базой.

      Что касается перехватов событий, то для этого как раз нужно создать и подключить свой собственный listener.

      • Евгений's Gravatar Евгений
        02.04.2013 at 20:43 | Permalink

        Спасибо 🙂

  9. Алексей's Gravatar Алексей
    03.04.2013 at 09:50 | Permalink

    Добрый день, Татьяна!)
    А не подскажите, как сделать чтоб логи выводились одновременно с выполнением тестов, а то они все выводятся только по завершению всех тестов?? Есть какой то параметр или надо свой listener писать?

    • Tatyana's Gravatar Tatyana
      03.04.2013 at 19:21 | Permalink

      Добрый день,
      Если я правильно понимаю, то эта проблема у Вас только при запуске из командной строки. Логи выводятся после завершения тестов, если в проекте настроен параллельный запуск.
      А по умолчанию в Thucydides проекте он включен, уберите в pom файле <parallel>classes</parallel> в конфигурации maven-failsafe-plugin, и тогда логи будут выводиться одновременно с выполнением.

  10. Алексей's Gravatar Алексей
    04.04.2013 at 07:06 | Permalink

    Спасибо))
    А еще не подскажите, как запускать тесты (для отладки в IDE) не через Firefox, а в специально созданyом профиле FF ? Через консоль все норм если запустить webdriver.firefox.profile в от через IDE (Idea) не выходит.

    • Tatyana's Gravatar Tatyana
      04.04.2013 at 08:00 | Permalink

      Нужно настроить конфигурацию запуска — Run -> Edit Configurations. Выберите конфигурацию JUnit для вашего теста и создайте новую environment variables для webdriver.firefox.profile.

      И посмотрите вот эту статью FirefoxDriver: способы создания профилей Firefox. В ней тоже есть альтернативные способы задания профиля.

  11. Алексей's Gravatar Алексей
    04.04.2013 at 13:20 | Permalink

    Если юзать в качестве фреймворка thucydides то почему то не выходит запустить тесты в профиле через IDE http://screencast.com/t/fDrqkwCEKB и даже если в переменную указать полный путь к профилю все равно не работает((

    • Tatyana's Gravatar Tatyana
      04.04.2013 at 18:33 | Permalink

      Странно, но больше похоже на проблему IDE, из командной строки же все работает.

      Можно еще создать Maven Run configuration и имитировать запуск из командной строки, правда тогда еще нужно будет настроить выборочный запуск теста по имени.

  12. Алексей's Gravatar Алексей
    08.04.2013 at 08:55 | Permalink

    Спасибо) А не подскажите как запустить не все тест сьюты, а какой то один? Пробывал через -Dtest=SimpletestSuit test не выходит, все тесты запускаются

    • Tatyana's Gravatar Tatyana
      08.04.2013 at 19:05 | Permalink

      Все зависит от настроек pom файла, идею можно почерпнуть отсюда, в конце статьи есть пример.

  13. Alexander's Gravatar Alexander
    13.09.2013 at 11:09 | Permalink

    Татьяна, спасибо огромное за подробную и интересную статью!
    второй способ подключения Listener работает только, если папка META-INF находится в «src\main\resources\», проверял на версии 0.9.208.
    а подскажите пожалуйста, как получить доступ к драйверу внутри Listener? Thucydides при скипе шага начинает ожидать элементы, которые определены через @FindBy и использует при этом тайм-аут имплицитного ожидания.

    • Tatyana's Gravatar Tatyana
      16.09.2013 at 08:14 | Permalink

      получить доступ к текущему драйверу можно так:
      ThucydidesWebDriverSupport.getDriver();
      это потокобезопасный метод

      • Alexander's Gravatar Alexander
        04.10.2013 at 11:13 | Permalink

        спасибо!

  14. Olha's Gravatar Olha
    11.11.2013 at 14:00 | Permalink

    Можно ли использовать совместно с jbehave?

    • Tatyana's Gravatar Tatyana
      11.11.2013 at 15:22 | Permalink

      Можно

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама


Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика