Повторное использование огурцов шаги
Я хочу повторно использовать некоторые шаги огурца, но не могу найти правильный путь.
Я хочу написать шаг как:
Given /^I login with (.*) credentials$/ |type|
# do stuff with type being one of "invalid" or "valid"
end
но тогда есть еще один шаг, таких как:
Given /^I login successfully$
# call "Given I login with valid credentials"
end
поэтому при тестировании аутентификации пользователя я могу использовать первый, но в большинстве других мест я могу использовать последний, и на самом деле не нужно повторять код.
есть ли способ вызвать этот другой шаг, или я просто помещаю логику в вспомогательный метод и вызываю указанный метод из каждой задачи (в основном метод извлечения рефакторинга, который, прочитав мой вопрос, заставляет меня поверить, что это на самом деле лучший способ в любом случае)?
5 ответов:
обновление: метод, описанный ниже, является устаревшим. Рекомендуемый способ вызова шага из другого шага теперь выглядит следующим образом:
Given /^I login successfully$/ step "I login with valid credentials" end
старый, устаревший метод (для справки):
вы можете вызвать шаги из других шагов, как это:
Given /^I login successfully$/ Given "I login with valid credentials" Then "I should be logged in" endЕсли все сценарии в пределах функции требуют этого (или других шагов), вы также можете добавить фон к каждой функции, с общими шагами, такими как Итак:
Background: Given I log in with valid credentials Scenario: Change my password Given I am on the account page
обратите внимание, что метод вызова шагов в шагах изменился в последних версиях cucumber, которые вы увидите, если вы получите сообщение об ошибке типа "предупреждение: использование 'Given/When/Then' в определениях шагов устарело, используйте 'step' для вызова других шагов вместо этого:/path/to/step_definitions/foo_steps.РБ:631:в `блок ' ". Смотрите огурец Вики для сведения.
суть изменений заключается в том, что теперь вы должны использовать
stepилиstepsметоды.When /^I make all my stuff shiny$/ step "I polish my first thing" end When /^I make all my stuff shiny$/ steps %Q{ When I polish my first thing When I shine my second thing } end
вызов шагов из определений шагов является плохой практикой и имеет недостатки:
- если сценарий завершится неудачно и есть вложенные вызовы шагов, вы получите только последнее вызванное определение шага в трассировке стека. Может быть, трудно найти, с какого места был вызван этот последний stepdef
- вызов stepdef иногда труднее найти и прочитать, чем метод ruby
- Ruby методы дают вам больше энергии, чем вызов шагов от шага defs
Аслак Хеллесей рекомендует для извлечения популярных действий в мир вместо того, чтобы использовать шаги. Он изолирует эти действия в одном месте, делает этот код легче найти. Вы также можете извлечь код в обычные классы или модули Ruby.
#/support/world_extensions.rb module KnowsUser def login visit('/login') fill_in('User name', with: user.name) fill_in('Password', with: user.password) click_button('Log in') end def user @user ||= User.create!(:name => 'Aslak', :password => 'xyz') end end World(KnowsUser) #/step_definitions/authentication_steps.rb When /^I login$/ do login end Given /^a logged in user$/ do login endвот полезная дискуссия на эту тему в списке рассылки огурец - ссылке
лучше всего обернуть ваши шаги в % {}, а не в кавычки. Тогда вам не нужно избегать двойных кавычек, которые вам нужно будет часто использовать.:
Given /^I login successfully$ step %{I login with valid credentials} end Given /^I login with (.*) credentials$/ |type| # do stuff with type being one of "invalid" or "valid" end
использовать ключевые слова в файл, который будет обеспечивать возможность повторного использования кода.
настоятельно не рекомендуется вызывать step defs в рамках step defs.
Я бы написал свой файл функций таким образом,
Scenario Outline: To check login functionality Given I login with "<username>" and "<password>" Then I "<may or may not>" login successfully Examples: |username|password|may or may not| |paul |123$ |may | |dave |1111 |may not |в моем определении шага (это Java)
@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$) public void I_login_with_and(String username, String password){ //login with username and password } @Then(I \"([^\"]*)\" login successfully$) public void I_login_successully_if(String validity){ if(validity.equals("may")){ //assert for valid login } else if(validity.equals("may not")){ //assert for invalid login } }таким образом, существует много повторного использования кода. Ваш же данный, а затем обрабатывает как допустимые, так и недопустимые сценарии. В то же время, ваш файл имеет смысл для читателей.
Comments