Cucumber-JVM认为所有(@ Given,@ When,@ Then)注释都是可互换的

问题描述 投票:9回答:2

(非常残酷地引起了我的注意,对于cumming-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) ...

还有一堆其他无关紧要的话,我会饶你的。

诊断

[黄瓜似乎并没有使@Given("a")@When("a")@Then("a")之间(以及@And@But之间没有区别),我真的不知道它们的初衷是因为只是“与我刚才所做的相同”的语法糖))>

但是正如实现所建议的那样,这三个步骤彼此之间有很大不同。每个句子都正确地描述了测试应该做什么,并且随之而来的实现是明确的。

“给定”步骤应设置测试先决条件

    “何时”步骤应触发操作或等待操作
  • 随后,“然后”步骤应声明系统状态。
  • 我在那里想念什么?
  • 是否有一种方法可以告诉Cucumber如何不仅依赖于正则表达式,而且还依赖于步骤类型(对我来说,应该是默认行为)?
  • (非常残酷地)引起了我的注意,使用Cucumber-JVM,当您定义特征的步骤具有相似的名称时,它们就被认为是可互换的。给定特征:抓住...

是的,这应该是这样工作的。步骤名称本身应该足够清楚,以查看它是关于测试设置(Given),某些操作(何时)还是验证结果(然后)。
动作步骤通常可以用措词表达,所以它包含一个动词,以区分设置和断言,我同意有时很难。您将不得不在这里提出自己的约定,一种可能是以下情况:

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

您的诊断是正确的-批注无关紧要,只有正则表达式才重要。
此外,您可以使用自己喜欢的语言定义自己的注释集,以用作关键字。您如何理解和使用它们取决于您。

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

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


编辑

注释独立于功能文件中使用的表达式。您可以在功能文件中使用默认的Given / When / Then和en_pirate AvastAyeBlimey批注-黄瓜将与它们匹配。

但是,功能文件本身是由Gherkin解析器(如@ Ar3s在下面正确指出的那样解析的,您可以使用supported spoken languages中的一个,而不必放置a

#language: <language code, eg. fr>

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

java annotations cucumber-jvm
2个回答
1
投票
动作步骤通常可以用措词表达,所以它包含一个动词,以区分设置和断言,我同意有时很难。您将不得不在这里提出自己的约定,一种可能是以下情况:

0
投票
此外,您可以使用自己喜欢的语言定义自己的注释集,以用作关键字。您如何理解和使用它们取决于您。

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

© www.soinside.com 2019 - 2024. All rights reserved.