Несколько месяцев назад состоялся релиз Cucumber JVM 3.0.0. Новая версия призвана сделать работу с данным BDD фреймвоком более очевидной и гибкой. В данной статье я расскажу об изменениях и новых фичах, а также приведу примеры их использования.
# language: ru
Функция: Передача аргументов различных типов
Сценарий:
* передадим в метод шага целое число 15
* передадим в метод шага "текст"
* передадим в метод шага hello
@Допустим("передадим в метод шага целое число {int}")
public void giveInt(Integer int1) {
System.out.println(int1);
}
@Допустим("передадим в метод шага {string}")
public void giveString(String string) {
System.out.println(string);
}
@Допустим("передадим в метод шага {word}")
public void giveWord(String string) {
System.out.println(string);
}
# language: ru
Функция: Передача пользовательского типа
Сценарий:
* передадим в метод дату 01.06.2018
@Допустим("передадим в метод дату {localdate}")
public void передадим_в_метод_дату(LocalDate localdate) {
System.out.println(localdate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
}
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
// требуется только для определения формата разделителя в float и double
return new Locale("ru");
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
// добавление в реестр определения необходимого типа
typeRegistry.defineParameterType(new ParameterType<>(
// название параметра, используемое в определении шага:
"localdate",
// регулярка, для поиска необходимого значения в фиче:
"[0-9]{2}.[0-9]{2}.[0-9]{4}",
// тип параметра:
LocalDate.class,
// функция, преобразующая входящую строку к нужному типу
(Transformer<LocalDate>) s -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
return LocalDate.parse(s, formatter);
}
));
}
}
@Допустим("Hello, world(s)!")
public void getHello() {
System.out.println("Hello world!");
}
@Допустим("основной/альтернативный текст")
public void getAlternative() {
System.out.println("Hello world!");
}
# language: ru
Функция: Основной и альтернативный текст
Сценарий:
* альтернативный текст
* основной текст
# language: ru
Функция: Передача пользовательского типа через DataTable
Сценарий:
Допустим у нас есть пользователи
| Василий | Чапаев | 09.02.1887 |
| Пётр | Исаев | 23.02.1890 |
import java.time.LocalDate;
public class User {
private String firstName;
private String lastName;
private LocalDate birthDay;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getBirthDay() {
return birthDay;
}
public void setBirthDay(LocalDate birthDay) {
this.birthDay = birthDay;
}
@Override
public String toString() {
return "User{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", birthDay=" + birthDay +
'}';
}
}
@Допустим("у нас есть пользователи")
public void у_нас_есть_пользователи(List<User> users) {
System.out.println(users);
}
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return new Locale("ru");
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
// в этот раз в реестр добавляем DataTableType
typeRegistry.defineDataTableType(new DataTableType(
User.class,
(TableRowTransformer<User>) list -> {
User user = new User();
user.setFirstName(list.get(0));
user.setLastName(list.get(1));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
user.setBirthDay(LocalDate.parse(list.get(2), formatter));
return user;
}
));
}
}
# language: ru
Функция: Фикстуры
@hooks
Сценарий: вызов фикстур до и после сценария, а также перед и после каждого шага
Дано Первый шаг
Когда Второй шаг
Тогда Третий шаг
@only_scenario_hooks
Сценарий: вызов фикстур только до и после сценария
Дано Первый шаг
Когда Второй шаг
Тогда Третий шаг
@only_step_hooks
Сценарий: вызов фикстур только перед и после каждого шага
Дано Первый шаг
Когда Второй шаг
Тогда Третий шаг
// секция not написана исключительно ради демонстрации
// выполнится только перед сценариями с тэгами hooks и only_scenario_hooks
@Before(value = "(@hooks or @only_scenario_hooks) and not @only_step_hooks")
public void before() {
System.out.println("before scenario");
}
// выполнится перед каждым шагом в сценарии с тэгом only_step_hooks
@BeforeStep(value = "@only_step_hooks")
public void beforeStep() {
System.out.println("before step");
}
// выполнится после каждого шага в сценарии с тэгом only_step_hooks
@AfterStep(value = "not(@hooks or @only_scenario_hooks) and @only_step_hooks")
public void afterStep() {
System.out.println("after step");
}
// выполнится только после сценариев с тэгами hooks и only_scenario_hooks
@After(value = "@hooks or @only_scenario_hooks")
public void after() {
System.out.println("after scenario");
}
# language: ru
Функция: Передача аргументов различных типов
Сценарий:
* передадим в метод шага "текст"
* передадим в метод шага hello
@Допустим("передадим в метод шага {string}")
public void giveString(String string) {
System.out.println(string);
}
@Допустим("передадим в метод шага {word}")
public void giveWord(String string) {
System.out.println(string);
}
К сожалению, не доступен сервер mySQL