Повторное использование огурцов шаги



Я хочу повторно использовать некоторые шаги огурца, но не могу найти правильный путь.



Я хочу написать шаг как:



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


поэтому при тестировании аутентификации пользователя я могу использовать первый, но в большинстве других мест я могу использовать последний, и на самом деле не нужно повторять код.



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

538   5  

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

вызов шагов из определений шагов является плохой практикой и имеет недостатки:

  1. если сценарий завершится неудачно и есть вложенные вызовы шагов, вы получите только последнее вызванное определение шага в трассировке стека. Может быть, трудно найти, с какого места был вызван этот последний stepdef
  2. вызов stepdef иногда труднее найти и прочитать, чем метод ruby
  3. 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

    Ничего не найдено.