[英]Cucumber-JVM considers all (@Given, @When, @Then) annotations to be interchangeable
我已經(非常殘酷地)注意到,使用黃瓜 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: acquire 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
之間沒有@But
,我真的不知道它們的意圖是什么因為首先因為這些只是“與我剛剛所做的一樣”的語法糖)
但正如實施所表明的那樣,這 3 個步驟彼此截然不同。 每個句子都正確地描述了測試應該做什么,隨后的實現是單義的。
我在那里缺少什么?
有沒有辦法告訴 Cucumber 如何不僅依賴正則表達式,還依賴步驟類型(對我來說,這應該是默認行為)?
是的,這就是它應該如何工作。 步驟名稱本身應該足夠清楚,以了解它是關於測試設置(Given)、某些操作(When)還是驗證結果(Then)。
操作步驟通常可以措辭,因此它包含一個動詞,為了區分設置和斷言,我同意有時非常困難。 您必須在這里提出自己的約定,一種可能性如下:
Given Jack is broke
When Jack earns 5 dollars
Then Jack should have 5 dollars
您的診斷是正確的 - 注釋無關緊要,只有正則表達式才重要。
此外,您可以用自己喜歡的語言定義自己的一組注釋來充當關鍵字。 您如何理解和使用它們取決於您。
看看里面的cucumber-java.jar
- 你會在cucumber.api.java
包(非拉丁字母)中找到不同語言的不同注釋集,例如。 en_pirate
版本: Avast
, Aye
, Blimey
, Gangway
, Letgoandhaul
;)
它們中的每一個都沒有特定的順序或語義——它們只是正則表達式持有者。
編輯
注釋獨立於特征文件中使用的表達式。 您可以使用鑒於/時/然后在特征文件和en_pirate默認Avast
, Aye
, Blimey
注解-黃瓜會匹配。
但是,特征文件本身是由 Gherkin 解析器解析的(正如下面@Ar3s 正確指出的那樣),您可以使用一種受支持的口語代替
#language: <language code, eg. fr>
在特征文件的第一行。 您可以在Gherkin i18n JSON 中找到默認英文關鍵字與其他語言之間的映射。 盡管如此,特征文件的語言和注釋的語言不需要匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.