使用不同步骤定义的相同步骤Serenity Cucumber

时间:2017-02-05 20:10:05

标签: bdd cucumber-jvm cucumber-java serenity-bdd

我正在使用带有Serenity + Cucumber-jvm的BDD自动化系统,我有一些情况,可以使用相同的步骤作为任何关键字步骤定义。 例如:

Given something
When do something
Then other thing
And do something

如您所见,do somethingwhenthen一起使用,但如果我使用这两个注释定义相同的方法:

@When("do something")
@Then("do something")
public void doSomething() {
}

我收到以下错误:

cucumber.runtime.DuplicateStepDefinitionException: Duplicate step definitions in ...

如何解决此问题

2 个答案:

答案 0 :(得分:2)

“Given”描述了场景发生的上下文。它描述了一个状态,或描述了发生的事情。所以用连续现在或过去时态来表达它。

Given the invoice is two weeks late <-- continuous present
Given the invoice was submitted     <-- past

您还会注意到它没有说明谁提交了发票。对于上下文来说这很好,因为它到底是怎么回事。我们称之为“被动”而不是“主动”的声音。

“当”描述发生的事件。我喜欢把它放在现在紧张,积极的声音中。 “狗咬男孩”是主动的声音。 “这个男孩被咬了”是被动的,因为它没有提到是谁做的。通过提及是谁,我们提醒人们,即使该用户是另一个系统,也会涉及用户。

When I check my accounts
When the admin creates a new record
When the ETL begins

“然后”描述了在那种情况下该事件应该发生的事情。我喜欢使用“应该”这个词,这是一个条件时态。它也处于被动语态,因为“何时”应该涵盖它的发生方式。

Then the invoice should be marked as paid
Then I should receive an email <-- "I" am not the doer so this is still passive voice

“应该”这个词有额外的好处。回到瀑布开发的时代,我们曾经尝试过正确的所有要求,但我们从未完全管理它。

通过使用“应该”这个词,我们概括了不确定性仍然存在的观点。它鼓励人们质疑这些要求是否准确,面对不断变化的技术和创新,是否仍然仍然准确。当它没有使用“必须”或“意志”时,更容易改变一个想法,因为那些是表达确定性的词,如果你确信别人对某些事情是肯定的,你就不太可能反击

通过推回并提出其他建议我们得到“通过实例探索”,它是规范的前身或通过实例测试,这是很好的副产品。理想情况下,您将通过比实际保留的更多场景进行讨论,并决定哪些场景在范围之内和之外。 “应该”这个词确实对此有所帮助,并且在捕获这些场景时保留它并将其写下来也有帮助。

然而,当然,它有助于区分“给定”和“然后”(但希望不是“何时”,因为无论如何,这将用主动语态表达。)

所以,如果我使用你的“做某事”的例子,我可能会说:

Given something was done
When someone does something
Then something else should have happened.

现在你的情景步骤都不相似,而且你已经澄清了他们的真正含义。

如果有帮助作为参考,我前一段时间写了a blog post

答案 1 :(得分:0)

对于Cucumber前面的关键字步骤定义(Given,When,Then,And ..)没有任何区别它是词汇的清晰度和美感。那说你什么时候

@When("do something")
@Then("do something")

相当于:

@When("do something")
@When("do something")

@Then("do something")
@Then("do something") 

因此,不要只需要查看文本而不是关键字来获取重复的步骤定义:)

相关问题