我非常注意到,使用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如何不仅依赖正则表达式而且依赖于步骤类型(对我来说,这应该是默认行为)?
答案 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
版本:Avast
,Aye
,Blimey
,Gangway
,Letgoandhaul
;)
每个人都没有特定的顺序或语义 - 他们只是正则表达式持有者。
修改强>
注释独立于要素文件中使用的表达式。您可以在要素文件中使用默认的Given / When / Then和en_pirate Avast
,Aye
,Blimey
注释 - Cucumber将匹配它们。
然而,Gherkin解析器解析了这些特征文件本身(正如@ Ar3s正确指出的那样),您可以使用supported spoken languages中的一个来代替
#language: <language code, eg. fr>
在功能文件的第一行。您可以在Gherkin i18n JSON中找到默认英语关键字与其他语言之间的映射。但是,要素文件的语言和注释的语言不需要匹配。