我是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 Cucumber
和Given I am a cuke noob
(尽管在语义上不是相同的)足够接近,因此我可以以完全相同的方式实现,因此我希望能够将它们链接到相同的方法,但是@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();
}
可以正常工作,但需要很多代码来完成简单的事情,我很确定还有其他方法。
甚至,当我问自己写下这个问题时,“我是从右边简单地解决这个问题吗?”,就BDD而言,我是否正在尝试实现一个好主意?
我认为这并不全是坏事,因为小 cucumber 被认为具有语义和句子结构,而词汇选择则取决于上下文(因此场景)。但是我应该以自己喜欢的任何方式自由执行它。
因此,将其全部包装起来:
@Given
应该是@Repeatable
吗?最佳答案
关于多表达@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的人来说,最简单,最明显的解决方案通常是最好,最优雅的解决方案。