为什么@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 Cucumber
和 Given 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
应该是 @Repeatable
吗?
- 如果是,为什么不是?还有别的办法吗?
- 如果不是,我在方法方面缺少什么?
希望不大但不会:
@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 让我记住最简单和最明显的解决方案通常是最好和最优雅的。
我是 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
(虽然在语义上 不相同 )足够接近,我可以用完全相同的方式实现,我想能够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
应该是@Repeatable
吗?- 如果是,为什么不是?还有别的办法吗?
- 如果不是,我在方法方面缺少什么?
希望不大但不会:
@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 让我记住最简单和最明显的解决方案通常是最好和最优雅的。