【问题标题】:Should Gherkin scenario always have When step?Gherkin 场景应该总是有When步骤吗?
【发布时间】:2019-06-28 23:12:31
【问题描述】:

在 Gherkin 中定义场景时,有时 Given 和 When 步骤之间没有明显区别,即用户没有与系统进行主动交互,验证的目的是验证系统在某些情况下的外观。

考虑以下几点:

Scenario: Show current balance
Given user is on account page
Then user should see his balance

Scenario: Show current balance
When user goes to account page
Then user should see his balance

我不确定我是否会一直使用第二种变体。如果我有多个场景共享上下文“用户在帐户页面上”并且其中一些有额外的用户操作而其他人没有,那么在我看来,将“用户在帐户页面中”作为给定步骤保留应该是有效的即使在某些情况下它可能缺少“何时”。这是一种有效的方法吗?

【问题讨论】:

  • 这只是关于可读性。没有“应该”这样的东西。场景不需要有“When”

标签: cucumber bdd gherkin


【解决方案1】:

在形式上和技术上,Cucumber/SpecFlow 不需要您编写When-step,或者更确切地说 Given/When/Then 只是按照它们在场景中的写入顺序执行。在这方面,您不需要When-step。

但是,正如 Andy Waite 所写,When 步骤显示了您的系统从“设置”采取的操作或事件,以达到您在 Then 步骤中验证的新状态。在这方面,每个测试中都应该出现一个When-step(正如您所写的:否则我们要测试什么)。

留下您的最终评论;仅验证设置怎么样(假设系统已启动,那么数据库是干净的,作为一个幼稚的例子)。在这种情况下,可以跳过何时步骤。

因此,一如既往,它归结为可读性和理解力。编写场景是为了使我们对系统行为的想法具体而清晰。使用优化的形式来理解和学习相关行为。

如果不考虑太多,我可能会猜测一般建议是始终使用使事件或行为非常明显和清晰的When-step。如果可能,我会回避隐含和隐藏的行为。

我希望这会有所帮助。

【讨论】:

  • 谢谢马库斯!有道理。
【解决方案2】:

一般来说,一个场景由三部分组成:

  • 设置(给定)
  • 动作(时间)
  • 验证(当时)

有时不需要设置(或者它是隐式的)。但我想不出任何情况下您不需要采取行动和验证。

【讨论】:

  • 完全同意验证(为什么要测试?)在某些情况下仍然不太确定行动。如果我们只需要验证设置是否正确怎么办?
  • 你可能会在编写测试时这样做,但我认为你不会那样做。
  • 你看到了什么动作,例如here
  • @komarik,看看我对这个问题的回答:stackoverflow.com/a/47945176/10608
【解决方案3】:

同意 Andy + Marcus 的观点,但我有一些可能有用的 cmets。

  1. Gherkin 功能文件应该作为系统行为的活文档。 出于这个原因,场景应该提供足够的细节,以便向开发人员和其他项目利益相关者(产品所有者、测试人员等)传达体现该功能的业务规则。

    我认为您的问题可能源于在阐述场景时未端到端考虑此业务规则。我不得不问别人这个问题,什么是平衡?因此我觉得你可能需要一个步骤来至少传达这个概念——在用户查看他们的余额之前,他们必须有一个。

    Scenario: Show current balance
      Given I have a balance
       When I go to my account page
       Then I should see my balance
    
  2. 设置系统状态(即任何“给定”步骤)以让您清楚地测试系统是否正常工作非常重要 - 否则您将如何确定余额实际上是正确的?您可能希望通过指定一些参数来使其更明确:

    Scenario: Show current balance
      Given my balance is £10
       When I go to my account page
       Then I should see my balance as £10
    
  3. 我不确定您使用的是哪个 BDD 框架,但我使用 Behat,它允许您将多个 Gherkin 步骤映射到一个步骤定义。即

    user is on account page
    user goes to account page
    

    都可以映射到将用户导航到页面的步骤定义。系统行为是相同的,区分两者的唯一原因是让您的场景更具可读性。

【讨论】:

    【解决方案4】:

    据我了解,当您编写场景时,需要 3 个步骤。

    1. 您的应用程序在开始时应处于的状态。
    2. 用户必须做什么才能达到特定状态。
    3. 用户操作的结果/输入,即场景的终点。

    所以场景会是这样的:

    Given the user is on the profile page
    When the user goes to the balance page
    Then the user should see their balance
    

    个人资料页面将是用户可以单击按钮或链接以访问其余额的地方。

    然后有一个背景:

    Given the user is logged in
    And the user has a balance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多