几个月前,Cucumber JVM 3.0.0发布了。 新版本旨在使使用此BDD框架的工作更加明显和灵活。 在本文中,我将讨论更改和新功能,并提供其用法示例。
黄瓜表达式的实现
在Cucumber JVM的第三个版本中,Cucumber Expressions现在可用,这是一种用于在文本中查找子字符串的简单表达语言。 与正则表达式不同,此语言针对可读性进行了优化,这在Cucumber的上下文中更有意义。 如果需要灵活性,您仍然可以使用正则表达式。
例如,我们具有以下功能:
# 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); }
从示例中可以看到,黄瓜表达式由两个大括号组成,它们的大小与传输的值有关。
现成的齿轮有以下几种类型:
- {int}
- {float}
- {string}
- {word}
- {biginteger}
- {bigdecimal}
- {byte}
- {short}
- {long}
- {double}
{string}对应一个带引号的字符串,{word}对应一个不带引号的单词(在撰写本文时,只能将用拉丁字母书写的单词发送到表达式{word})。
您可以创建自己的数据类型,例如,我们要从功能转移LocalDate类对象:
# language: ru : : * 01.06.2018
@(" {localdate}") public void ___(LocalDate localdate) { System.out.println(localdate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))); }
为此,在胶水指定的包中,您需要创建一个实现TypeRegistryConfigurer接口的类,并通过该类将数据类型添加到注册表中:
public class TypeRegistryConfiguration implements TypeRegistryConfigurer { @Override public Locale locale() {
实现TypeRegistryConfigurer接口的类在项目中必须为1,否则将引发异常。
黄瓜表达式还允许您在方括号中指定可选文本:
@("Hello, world(s)!") public void getHello() { System.out.println("Hello world!"); }
您不能在方括号内使用空格(在撰写本文时,仅支持拉丁字母)。
替代文本通过斜杠指定:
@("/ ") public void getAlternative() { System.out.println("Hello world!"); }
# language: ru : : * *
您可以使用反斜杠对{}和()进行转义。
您不能在同一步骤定义中使用正则表达式和黄瓜表达式。
XStream放弃
在Cucumber的第一版和第二版中,使用正则表达式和XStreamsConverters库来确定传输数据的类型。 在Cucumber的第三个版本中,开发人员放弃了XStreamsConverters库的使用。
放弃XStreamConverters的理由是糟糕的文档,无法使用第三方对象映射器以及缺乏对Java 9的支持。
XStream中的Annotations Delimiter,Format,Transformer和其他注释不再起作用。 相反,您现在需要使用ParameterType或DataTableType。
数据表
DataTable数据类型也发生了变化。
与以前的版本一样,Cucumber 3可以毫无问题地将具有一列的DataTable转换为List,将两列转换为Map等。 但这仅在将数据转换为以下类型之一时才有效:字符串,整数,浮点数,双精度型,字节,短型,长型,BigInteger或BigDecimal。
如果要从DataTable创建其他类的对象,则与自定义数据类型一样,您需要编写自己的转换器:
# language: ru : DataTable : | | | 09.02.1887 | | | | 23.02.1890 |
User.java 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) {
步骤钩之前和之后
另一个创新是前后步骤。 现在,您可以定义在脚本的每个步骤之前和/或之后将被调用的钩子。
步骤挂钩遵循与脚本级别挂钩相同的规则:
- 可以将标签挂在钩子上以仅在某些情况下运行它们;
- 您可以设置钩子的执行顺序。
- 即使应该执行的后续步骤中断,也将执行AfterStep。
# language: ru : @hooks : , @only_scenario_hooks : @only_step_hooks :
总之,我想说的是,即使您在项目中使用了XStream的功能,并且随着向新版本的Cucumber的过渡,也有必要进行一些小的改进,我建议这样做。 黄瓜得到了支持和积极开发,新功能使其使用更加灵活和易于理解。
更新09/23/2018今天,Cucumber 4.0.0已发布。 我不会描述所有更改,而只会说现在黄瓜表达式中通常支持俄语,而且我用{string}和{word}编写的示例将不再起作用。 事实是{word}现在可以包含任何非空格字符,这将在搜索实现步骤时引起冲突:
# language: ru : : * "" * hello
@(" {string}") public void giveString(String string) { System.out.println(string); } @(" {word}") public void giveWord(String string) { System.out.println(string); }
参考文献:
→
文章中的示例→
我关于第一个Cucumber JVM版本的文章