【问题标题】:Same step using different step definitions Serenity Cucumber相同的步骤使用不同的步骤定义 Serenity Cucumber
【发布时间】:2017-02-05 20:10:04
【问题描述】:

我正在使用带有 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 ...

我该如何解决这个问题

【问题讨论】:

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


    【解决方案1】:

    “给定”描述了场景发生的上下文。它要么描述一个状态,要么描述已经发生的事情。所以用现在进行时或过去时来表达它。

    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
    

    “应该”这个词还有一个额外的好处。早在开发 Waterfall 的日子里,我们曾经试图正确地满足所有需求,但我们从来没有完全做到。

    通过使用“应该”这个词,我们概括了不确定性仍然存在的想法。它鼓励人们质疑需求是否准确,以及面对不断变化的技术和创新,它们是否仍然准确。当一个想法不使用“必须”或“将”时更容易改变它,因为这些词表达了确定性,如果你确信别人对某事是确定的,你就不太可能推回.

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

    当然,它有助于区分“Given”和“Then”(但希望不是“When”,因为无论如何都会用主动语态表达)。

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

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

    现在,您的场景步骤中没有一个是相似的,而且您也已经阐明了它们的真正含义。

    我不久前写过a blog post,如果它作为参考有帮助的话。

    【讨论】:

    • 是的,Liz 说的。
    【解决方案2】:

    对于 Cucumber 步骤定义前面的关键字 (Given,When,Then,And..) 没有任何区别,它是为了词汇清晰和美观。那就是说当你这样做时

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

    相当于:

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

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

    所以不要得到重复的步骤定义,您只需要查看文本而不是关键字:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多