簡體   English   中英

Cucumber-JVM 認為所有(@Given、@When、@Then)注解都是可互換的

[英]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版本: AvastAyeBlimeyGangwayLetgoandhaul ;)

它們中的每一個都沒有特定的順序或語義——它們只是正則表達式持有者。


編輯

注釋獨立於特征文件中使用的表達式。 您可以使用鑒於/時/然后在特征文件和en_pirate默認AvastAyeBlimey注解-黃瓜會匹配。

但是,特征文件本身是由 Gherkin 解析器解析的(正如下面@Ar3s 正確指出的那樣),您可以使用一種受支持的口語代替

#language: <language code, eg. fr>

在特征文件的第一行。 您可以在Gherkin i18n JSON 中找到默認英文關鍵字與其他語言之間的映射。 盡管如此,特征文件的語言和注釋的語言不需要匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM