为什么@Given 不可重复?

Why isn't @Given repeatable?

我是 Cucumber(jvm) 的新手,一切看起来都很好,但是 :

我真的不知道如何用一个方法实现以各种方式(优雅地)编写的多个初始条件(来自各种场景)。

例如:

Scenario: I really am bad
    Given I really am inexperienced with Cucumber
    When I try to work
    Then what I produce is of poor quality

Scenario: I am on the way to become good (hopefully)
    Given I am a noob
    When I learn new things
    And I practice
    Then my level improves

因为 Given I really am inexperienced with CucumberGiven I am a cuke noob(虽然在语义上 不相同 )足够接近,我可以用完全相同的方式实现,我想能够link他们使用相同的方法但是

@Given("^I really am inexperienced with Cucumber$")
@Given("^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

但是上面显示的代码不会编译,因为 cucumber.api.java.en.@Given 注释不是 java.lang.annotation.@Repeatable ...

一个简单的解决方案是做类似

的事情
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

@Given("^I really am inexperienced with Cucumber$")
public void check_I_really_am_inexperienced_with_Cucumber() throws Throwable {
    checkMyLevelIsGenerallyLow();
}

@Given("^I am a cuke noob$")
public void check_I_am_a_cuke_noob() throws Throwable {
    checkMyLevelIsGenerallyLow();
}

这会工作得很好,但需要大量代码来处理简单的事情,我很确定还有其他方法。

甚至,当我问自己写下这个问题时,"Am I simply approaching this question from the right side ?" 是我想要实现的 BDD 方面的一个好主意吗?

我认为这还不错,因为小黄瓜应该保持语义和句子结构,词汇选择取决于上下文(因此场景)。然而,我应该可以自由地以任何我喜欢的方式实施它。

总结一下:

希望不大但不会:

@Given("^I really am inexperienced with Cucumber$")
@And("^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

按预期工作?

注释不可重复的一个原因是,可重复注释是 Java 8 的新功能。因此,将它们用于库仍然存在问题,因为您将大大限制用户群。 (请记住,特别是大公司在适应新技术方面进展缓慢。)

作为替代方案,您可以使用相同的 Java 函数和类似的 Given 描述;比如

Given My cucumber level is low because I'm a cuke noob

Given My cucumber level is low because I'm inexperienced

两者都可以被

抓住
@Given("My cucumber level is low because I'm (.*)")
public void checkMyLevelIsGenerallyLow(String reason) throws Throwable {
    // ...
}

这也会将原因作为第一个参数传递给函数。但是我不确定你是否应该在这里使用相同的函数,因为情况不同。

关于多重表达@given

这可能不是最好的方法,但我挠头想到了:

@Given("^I really am inexperienced with Cucumber$|^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

而且有效! 这正是我一直在寻找的东西,甚至可以像这样变得更具可读性:

@Given("^I really am inexperienced with Cucumber$"+
      "|^I am a cuke noob$")

关于不可重复性@given

如 blalasaadri 所述,@Given 可能是 @Repeatable,但仅来自 Java8,而且自从 @Repeatable 在 Java8 中引入以来更进一步。

特别感谢

Ceiling Gecko 让我记住最简单和最明显的解决方案通常是最好和最优雅的。