Расширение шага огурца - PullRequest
3 голосов
/ 20 марта 2019

У меня есть шаг огурца, который выглядит следующим образом:

When I enter the credentials for the user

, а другой -

When I enter the correct credentials for the user

Соответствующие определения шага:

@When("I enter the ([^\"]*) for the user$")
public void stepDefinition(String cred){
    //code
}
@When("I enter the correct ([^\"]*) for the user$")
public void otherStepDefinition(String cred){
    //other code
}

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

  1. Как это исправить?
  2. Я новичок в регулярных выражениях.Можно ли исключить «правильную» часть из шага «Когда», чтобы у меня был базовый шаг, который можно «расширить» с помощью «правильной» части?

Ответы [ 4 ]

2 голосов
/ 22 марта 2019

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

When an authorised user enters their credentials

или на основе ролей

When an Administrator is authorised

Если вход в систему является обязательным условием для тестируемой функции, тогда что-тотакие как:

Given an authorised user

или

Given an authorised Administrator

Их можно создать с помощью диспетчера учетных данных.

... = ExpectedData.credentialsFor("@authorised");

Тег должен представлять характеристики, а неидентичность ожидаемых данных, которые будут получены из тестовых данных db или csv, содержащих что-то вроде:

@admin, administrator, password
@authorised, user, password
@unauthorised, user, wrong

Такой же подход должен использоваться для ввода всех тестовых данных, например:

Given a Cash Customer
Given a Credit Customer
Given a Customer with an overdue account

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

2 голосов
/ 21 марта 2019

Первое правило должно быть изменено на

@When("I enter the (\\S+) for the user$")

Здесь \S+ соответствует 1 или более непробельным символам. Если не может быть символов без пробелов, используйте \S*.

Для сопоставления двух «слов» вы можете использовать

@When("I enter the (\\S+\\s+\\S+) for the user$")

Обратите внимание, что вы можете контролировать количество «слов», используя квантификаторы, например, это будет соответствовать 2 или 3 словам:

@When("I enter the (\\S+(?:\\s+\\S+){1,2}) for the user$")

Для совпадения 2 или более слов:

@When("I enter the (\\S+(?:\\s+\\S+){1,}) for the user$")
@When("I enter the (\\S+(?:\\s+\\S+)+) for the user$")
2 голосов
/ 22 марта 2019

Есть несколько способов улучшить эти шаги и избежать использования регулярных выражений.

1) Пусть пользователь знает свои учетные данные, и шаг попросит его ввести учетные данные

Так что у вас будет


Given I am a user
  @user = create_user # method creates a user with credentials
end

When `I enter the users credentials` do
  fill_in username: @user.username
  fill_in password: @user.password
end

When `I enter the wrong credentials for the user` do
  fill_in username: @user.username
  fill_in password: @user.bad_password # or perhaps just bad_password
end

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

2) Иметь больше аргументов для определения вашего шага

When 'I enter the credentials user: (\\S+) password: (\\S+) do |username, password|
  fill_in username: username
  fill_in password: password 
end

When 'I enter the bad credentials user: (\\S+) password: (\\S+) do |username, password|
  fill_in username: username
  fill_in password: password 
end

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

Я курил еще до того, как был назван Cucumber, и теперь никогда не использую схемы регулярных выражений или сценариев, когда я кукаю. Вам тоже не нужно.

0 голосов
/ 20 марта 2019

Пожалуйста, выполните приведенные ниже определения шагов и сообщите нам, если работали для вас.

@When("^I enter the ([^\"]*) for the user$")
public void stepDefinition(String cred){
    //code
}
@When("^I enter the correct ([^\"]*) for the user$")
public void otherStepDefinition(String cred){
    //other code
}

Без параметра

Feature File Steps implementation Output

с параметром

enter image description here enter image description here enter image description here

Два метасимвола (^, $) называются якорями, поскольку они используются для привязки каждого конца регулярного выражения кначало и конец строки, с которой они совпадают.

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