Знает ли Cucumber/Gherkin что-то вроде концепции Gauge?

Некоторое время я использовал Gauge, и у них есть идея концепции, которая определяется как «Концепции предоставляют возможность объединять многократно используемые логические группы шагов в единое целое. Концепция представляет собой краткое изложение бизнес-намерения путем объединения логических групп шагов» (Контактная документация по датчику).

При этом можно легко сгруппировать несколько шагов и повторно использовать их как один шаг в другом тестовом примере.

Мне было интересно, есть ли что-то подобное у Cucumber/Gherkin?

Предыстория заключается в том, что у меня есть тестовый пример end2end, который содержит несколько промежуточных утверждений, которые мне нравится распутывать и создавать несколько сценариев. Но тогда у меня было бы несколько сценариев с повторяющимися шагами — я хотел бы сгруппировать соответствующие и таким образом свести к минимуму отдельные шаги внутри соответствующих сценариев.

Спасибо :)


person emersoncod    schedule 06.03.2020    source источник


Ответы (2)


Gauge — это фреймворк для написания приемочных тестов. Спецификация в Gauge — это, по сути, сценарий ручного тестирования, который стал исполняемым. Из-за этого имеет смысл повторно использовать шаги, поскольку они, как правило, описывают низкоуровневые операции.

Cucumber, с другой стороны, облегчает BBD, и вы используете Gherkin для захвата поведения системы, а не операций в тесте. Таким образом, вместо Login as user "Charles: and create project "Firebird", описывающего операции, вы должны написать Given Administrator "Charles" created the project "Firebird".

Это значительный сдвиг в перспективе, но он помогает четко объяснить, что программное обеспечение должно делать, а не то, как оно должно работать.

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

Например, предположим, что у нас есть два шага, каждый из которых создает пользователя:

  • Given Administrator "Charles" created the project "Firebird"
  • And "Jullia" is added to project "Firebird"
@Given("{role} {persona} created the project {project}")
public void persona_with_role_creates_a_project(Role role, Persona persona, Project project){
    createRole(role);
    createUserForPersona(persona);
    addRoleToUserForPersona(persona, role);
    loginUserForPersona(persona);
    createProject(project);
}

@And("{persona} is added to project {project}")
public void persona_with_role_creates_a_project(Persona persona, Project project){
    createUserForPersona(persona);
    addUserForPersonaToProject(persona, project);
}


@ParameterType("\"([^"]+)\"")
public Persona persona(String name){
   // look up the persona by name from somewhere e.g. a config file
}

ect...

private void createRole(Role role){
    // API calls to make a role here
    // For test isolation it is important you don't reuse anything between tests.
}

private void createUserForPersona(Persona persona){
   // API calls to create a user
   // Don't forget to store the credentials for the persona somewhere
}

ect..

Обратите внимание, что для создания пользователя и проекта может потребоваться довольно много информации. Таким образом, вместо того, чтобы излагать всю эту информацию в файле функций, мы ссылаемся на персонажей («Чарльз», «Жар-птица»), которые действуют как шаблоны для типа создаваемого нами проекта. Мы можем предоставить их объектам определения шагов, а не простым строкам, используя типы параметров ({persona}, {project}). Они преобразуют строку в объект до выполнения шага.

person M.P. Korstanje    schedule 06.03.2020

В Gherkin вы просто создаете определение шага для своей группы шагов и используете его так же, как и в человеческом языке. Пример Ruby ниже иллюстрирует повторное использование Данный "действительный пользователь" в разделе Данный "пользователь находится на странице входа".

Given /^a valid user$/ do
  @user = User.create!({
             :email => "[email protected]",
             :password => "password"
           })
end
Given /^user is on the login page$/ do
  Given "a valid user"
  visit signin_url
end
When /^user fills in Username with (.*?)/ do |username|
  fill_in "Email", :with => username
end
And /^user fills in Password with (.*?)$/ do |password|
  fill_in "Password", :with => password
end
And /^user presses "Login"$/ do 
  click_button "Sign in"
end
Then /^user should be on the users home page$/ do 
  assert_equal (getCurrentUrl(), 
  "https://www.linkedin.com/feed/")
end
person Anatoliy Sakhno    schedule 10.03.2020