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

Ar3*_*r3s 9 java annotations cucumber-jvm

我已经注意到了(非常野蛮地)使用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
Run Code Online (Sandbox Code Playgroud)
@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)));
}
Run Code Online (Sandbox Code Playgroud)

什么时候

我用黄瓜运行这个功能(用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)
...
Run Code Online (Sandbox Code Playgroud)

还有一堆其他不相干的线,我会饶你.

诊断

黄瓜似乎并没有使之间的差异@Given("a"),@When("a")并且@Then("a")(和@And@But,我真的不知道他们打算什么摆在首位,因为这些都只是对"同我只是做了"语法糖)

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

  • "给定"步骤应设置测试前置条件
  • "When"步骤应该触发一个动作或等待一个动作
  • "然后"步骤应该在之后断言系统的状态.

我在那里错过了什么?

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

Ada*_*lik 0

您的诊断是正确的 - 注释并不重要,只有正则表达式才重要。

此外,您可以用您喜欢的语言定义自己的一组注释作为关键字。如何理解它们并使用它们取决于您。

看看里面cucumber-java.jar- 你会发现包中不同语言的不同注释集cucumber.api.java(也包括非拉丁字母),例如。en_pirate版本:AvastAyeBlimeyGangwayLetgoandhaul;)

它们中的每一个都没有特定的顺序或语义——它们只是正则表达式的持有者。


编辑

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

但是,功能文件本身是由 Gherkin 解析器解析的(正如@Ar3s 在下面正确指出的那样),您可以使用一种受支持的口语语言,只需将

#language: <language code, eg. fr>
Run Code Online (Sandbox Code Playgroud)

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