Cucumber-JVM认为所有的anotations都可以互换

时间:2015-09-09 16:12:17

标签: java annotations bdd cucumber-jvm gherkin

我非常注意到,使用cucumber-JVM,当您定义哪些步骤具有 看似 相同名称的功能时,它们被认为是可互换的。

鉴于

Feature: Grab that cash with both hands and make a stash

  Scenario: Spend it
    Given Jack has 5 dollars
    When  Jack wants to buy Lear Jet
    Then  He doesn't have enough cash

  Scenario: aquire it
    Given Jack is broke
    But   his wealth is slowly growing
    When  Jack has 5 dollars
    Then  He can afford a pack of gum

  Scenario: own it
    Given Jack is broke
    But   he has a job that's paid 5 dollar an hour
    When  He works an hour
    Then  Jack has 5 dollars
@Given("^Jack has 5 dollars$")
public void set_it() throws Throwable {
    this.jack = new Person();
    jack.setCashAmount(5);
}

@When("^Jack has 5 dollars$")
public void wait_it() throws Throwable {
    jack.waitFor(wealth(is(equalTo(5))));
}

@Then("^Jack has 5 dollars$")
public void check_it() throws Throwable {
    assertThat("Jack should have 5 dollars by now",
               jack.getCashAmount(),
               is(equalTo(5)));
}

我用黄瓜运行此功能(使用mvn / intelliJ插件/ eclipse插件/魔法水晶球/其他荒谬的媒介)

然后

我收到以下消息:

cucumber.runtime.DuplicateStepDefinitionException: Duplicate step definitions in my.project.MySteps.wait_it() in file:[...] and my.project.MySteps.set_it() in file:[...]
    at cucumber.runtime.RuntimeGlue.addStepDefinition(RuntimeGlue.java:33)
    at cucumber.runtime.java.JavaBackend.addStepDefinition(JavaBackend.java:151)
    at cucumber.runtime.java.MethodScanner.scan(MethodScanner.java:68)
    at cucumber.runtime.java.MethodScanner.scan(MethodScanner.java:41)
    at cucumber.runtime.java.JavaBackend.loadGlue(JavaBackend.java:86)
...

还有一堆其他不相关的行,我会饶你。

诊断

Cucumber在@Given("a")@When("a")@Then("a")(以及@And@But之间似乎没有什么区别我不知道是什么它们原本打算用于那些因为它们只是“与我刚才所做的相同”的语法糖“)

但正如实施所暗示的那样,这3个步骤彼此截然不同。每个句子都正确地描述了测试应该做什么,并且随后的实现是单一的。

  • “给定”步骤应设置测试前置条件
  • “何时”步骤应触发某个操作或等待一个
  • “然后”步骤应该在之后断言系统的状态。

我在那里错过了什么?

有没有办法告诉Cucumber如何不仅依赖正则表达式而且依赖于步骤类型(对我来说,这应该是默认行为)?

2 个答案:

答案 0 :(得分:1)

是的,这就是应该如何运作的。步骤名称本身应足够清楚,以确定它是关于测试设置(给定),某些操作(何时)还是验证结果(然后)。

行动步骤通常可以措辞,因此它包含一个动词,用于区分设置和断言我同意它有时很难。你必须在这里提出你自己的约定,一种可能性如下:

Given Jack is broke
 When Jack earns 5 dollars
 Then Jack should have 5 dollars

答案 1 :(得分:0)

您的诊断是正确的 - 注释无关紧要,只有正则表达式。

除此之外,您还可以用自己喜欢的语言定义自己的注释集,以充当关键字。你如何理解它们并使用它们取决于你。

查看cucumber-java.jar内部内容 - 您会在cucumber.api.java包中找到不同语言的不同注释集(例如,非拉丁字母表)。 en_pirate版本:AvastAyeBlimeyGangwayLetgoandhaul;)

每个人都没有特定的顺序或语义 - 他们只是正则表达式持有者。

修改

注释独立于要素文件中使用的表达式。您可以在要素文件中使用默认的Given / When / Then和en_pirate AvastAyeBlimey注释 - Cucumber将匹配它们。

然而,Gherkin解析器解析了这些特征文件本身(正如@ Ar3s正确指出的那样),您可以使用supported spoken languages中的一个来代替

#language: <language code, eg. fr>

在功能文件的第一行。您可以在Gherkin i18n JSON中找到默认英语关键字与其他语言之间的映射。但是,要素文件的语言和注释的语言不需要匹配。