Как я могу заставить огурец пройти все шаги (не пропустить их), даже если один из них не удался? - PullRequest
11 голосов
/ 27 июля 2011

Я использую Cucumber с RubyMine, и у меня есть сценарий с шагами, которые проверяют некоторые специальные элементы управления из формы (я использую Cucumber для автоматизации тестирования).Элементы управления не имеют ничего общего друг с другом, и нет никаких оснований пропускать шаги, если один из них не выполняется.

Кто-нибудь знает, какие конфигурации или команды следует использовать для запуска?все шаги в сценарии, даже если все они терпят неудачу?

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

Я думаю, что единственный способ достичь желаемого поведения (что довольно редко) - это определить пользовательские шаги и ловить исключения в нем самостоятельно.Согласно cucumber wiki шаг не выполняется, если возникает ошибка.Почти все шаги по умолчанию вызывают ошибку, если они не могут найти элемент на странице или взаимодействовать с ним.Если вы поймете это исключение, шаг будет помечен как пройденный, но при спасении вы можете предоставить пользовательский вывод.Также я рекомендую вам тщательно определить исключения, которые вы хотите перехватить, я думаю, если вы в порядке, если selenium не может найти элемент на странице, спасенный только из исключений ElementNotFound, не перехватывайте все исключения.

2 голосов
/ 15 марта 2013

Вопрос старый, но, надеюсь, это будет полезно. То, что я делаю, кажется «неправильным», но это работает. На ваших веб-шагах, если вы хотите продолжать, вы должны ловить исключения. Я делаю это в первую очередь, чтобы добавить полезные сообщения об ошибках. Я проверяю таблицу, полную значений, которые определены в Cucumber, с таблицей, имеющей несколько строк, таких как:

Then my result should be:
| Row Identifier | Column Identifier | Subcolum Identifier | $1,247.50 |

, где идентификаторы имеют смысл в домене приложения, и назовите конкретную ячейку в таблице результатов удобным для человека способом. У меня есть помощники, которые преобразуют человеческие идентификаторы в идентификаторы DOM, которые используются, чтобы сначала проверить, существует ли искомая строка, а затем найти конкретное значение в ячейке в этой строке. Сообщение об ошибке по умолчанию для отсутствующей строки достаточно ясно для меня (ожидалось найти css "tr # my_specific_dom_id", но совпадений не было). Но сообщение об ошибке для проверки определенного текста в ячейке совершенно бесполезно. Поэтому я сделал шаг, который перехватывает исключение и использует информацию о шагах Cucumber и поиск некоторых элементов, чтобы получить хорошее сообщение об ошибке:

Then /^my application domain results should be:$/ do |table|
  table.rows.each do |row|
    row_id = dom_id_for(row[0])
    cell_id = dom_id_for(row[0], row[1], row[2])
    page.should have_css "tr##{row_id}"
    begin
      page.should have_xpath("//td[@id='#{cell_id}'][text()=\"#{row[3].strip.lstrip}\"]")
    rescue Capybara::ExpectationNotMet => exception
      # find returns a Capybara::Element, native returns a Selenium::WebDriver::Element
      contents = find(:xpath, "//td[@id='#{cell_id}']").native.text
      puts "Expected #{ row[3] } for #{ row[0,2].join(' ') } but found #{ contents } instead."
      @step_failures_were_rescued = true
    end
  end
end

Затем я определяю хук в файле features / support / hooks.rb, например:

After do |scenario|
  unless scenario.failed?
    raise Capybara::ExpectationNotMet if @step_failures_were_rescued
  end
end

Это делает общий сценарий неудачным, но маскирует отказ шага от Cucumber, поэтому все результаты шага отображаются зелёным, включая неправильные. Вы должны увидеть сценарий сбоя, а затем посмотреть на сообщения, чтобы увидеть, что не удалось. Это кажется "плохим" для меня, но это работает. В моем случае удобнее получить ожидаемые и найденные значения, перечисленные в дружественном к домену контексте для всей проверяемой таблицы, а не получать сообщение типа «Я искал« $ 123,45 », но не смог найти» Это." Возможно, есть лучший способ сделать это, используя метод «внутри» Капибары. Хотя это лучшее, что я придумал.

1 голос
/ 10 февраля 2016

Я видел много потоков в Интернете о людях, желающих продолжить выполнение шагов в случае неудачи. Я обсуждал с разработчиками Cucumber: они думают, что это плохая идея: https://groups.google.com/forum/#!topic/cukes/xTqSyR1qvSc Во многих случаях сценарии могут быть переработаны, чтобы избежать этой необходимости: сценарии должны быть разбиты на несколько более мелких и независимых сценариев, или несколько проверок могут быть объединены в один, обеспечивая более человеческий сценарий и менее сценарий, похожий на сценарий.

Но если вам ДЕЙСТВИТЕЛЬНО нужна эта функция, как в нашем проекте, мы сделали форк Cucumber-JVM. Эта ветвь позволяет вам аннотировать шаги, чтобы в случае неудачи с определенным исключением они позволили в любом случае разрешить выполнение следующих шагов (а сам шаг помечается как неудачный).

Вилка доступна здесь: https://github.com/slaout/cucumber-jvm/tree/continue-next-steps-for-exceptions-1.2.4 Он опубликован в репозитории OSSRH Maven. См. README.md для использования, скриншота объяснения и зависимости Maven. Это доступно только для языка Java, жесткая: любая помощь приветствуется, например, для адаптации кода к Ruby. Я не думаю, что это будет много работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...