Automated tests 黄瓜中BDD场景的有效执行

Automated tests 黄瓜中BDD场景的有效执行,automated-tests,cucumber,bdd,cucumber-jvm,cucumber-java,Automated Tests,Cucumber,Bdd,Cucumber Jvm,Cucumber Java,我已经开始使用Selenium+BDD Cumber,我发现这两种技术配合得非常好。我有点担心,如果Cucumber提供了前后注释,以便以更高的粒度在特定领域实现更快的验证,那么可以改进的方法会更多。比如说,我想写这个场景(我是故意泛化的,只是为了表明我的观点) 作为一个场景大纲,意味着它将作为3个单独的场景执行3次。我在这里看到的问题是,每一次场景都会从头开始,让您每次登录都有延迟(或者通常执行所有操作以达到您想要的目的) 可以使用@Before,但不会有太大变化,因为每次都会执行这些操作(而

我已经开始使用Selenium+BDD Cumber,我发现这两种技术配合得非常好。我有点担心,如果Cucumber提供了前后注释,以便以更高的粒度在特定领域实现更快的验证,那么可以改进的方法会更多。比如说,我想写这个场景(我是故意泛化的,只是为了表明我的观点)

作为一个场景大纲,意味着它将作为3个单独的场景执行3次。我在这里看到的问题是,每一次场景都会从头开始,让您每次登录都有延迟(或者通常执行所有操作以达到您想要的目的)

可以使用@Before,但不会有太大变化,因为每次都会执行这些操作(而且我也不完全确定在BDD中这样做是否正确)

一些人建议在一系列When/Then中交替检查每个字段,这似乎违反了BDD的基本原则。此外,在这种特定情况下,这意味着3个场景将压缩在一个场景中,如果客户未能更新名称字段,则其他场景将不会执行,给我一个0%的通过率,而它可能是66%(为简单起见,假设我们只有1个场景,其他两个字段已成功更新)。此外,如果更新名称和更新地址都有错误,我只会在第一个错误中意识到问题,并且只有在“更新名称”步骤成功时才能理解另一个错误

一个BeforeAll可能会解决这个问题,但在Cumber中没有

我希望实现的是执行一系列步骤,以进入特定页面,然后对每个字段执行测试(或以不同的粒度级别),并以“当我这样做时,我应该看到…”的方式执行所有测试这样,如果任何事情失败了,我知道什么失败了,什么通过了,但至少我确信所有的事情都被覆盖了,没有因为前面的步骤失败而被跳过

我为这篇长篇大论道歉,但我希望尽可能最好地解释我的观点。不确定它是否清晰或有意义


感谢您的回复

将此限制为每个字段一个场景对于BDD来说太僵化了。我喜欢将场景视为一种独特的行为,与确保行为正常运行的断言相结合。测试所有字段是否都在更新是合适的,除非一组字段可以作为单独的行为隔离,例如更改电子邮件应该发送验证。这应该是与电子邮件字段得到更新这一事实不同的场景

这就是数据表变得易于使用的地方。为要更新的字段指定数据表,以便可以在单个场景中指定多个字段。您可以在断言中使用数据表,以便一次比较多个字段

Scenario: The customer can update their details
    Given I am logged in the platform       
    And I navigate to my details page
    When I update my details with:
        | Field   | Value        |
        | Name    | Bob          |
        | Surname | Jr           |
        | Address | 123 Smith St |
     And Save
     Then my details should be:
        | Field   | Value        |
        | Name    | Bob          |
        | Surname | Jr           |
        | Address | 123 Smith St |

我认为,当您需要在整个场景和表格中显示数据时,场景大纲非常有用,因为只有特定步骤需要数据。实际上,在这里,通过使用表,您可以分两步强制复制数据。也许我编的例子太简单了,无法说明我的意思…@Giuseppe使用这个答案作为跳板,你可以在后端构建被测对象的图片——当你更新字段、更新变量或在cucumber world对象中设置值时。这意味着您只需声明一次值,就可以重用它们,将最后一步更改为:“那么我的详细信息应该已经更新了”@KyleFrains,我不明白。您建议在When中仍然使用一个表,然后通过更抽象的方式更改为不使用它?这边走。我仍然需要跨步骤传递状态(我认为,正如您所建议的,这不是问题)2。我将失去良好的粒度级别,如果我的测试因名称字段而失败,并且可能因地址字段而失败,我将只因名称问题而失败,因为其他两个字段上的其他检查可能不会执行(除非实现更复杂的逻辑)
Scenario: The customer can update their details
    Given I am logged in the platform       
    And I navigate to my details page
    When I update my details with:
        | Field   | Value        |
        | Name    | Bob          |
        | Surname | Jr           |
        | Address | 123 Smith St |
     And Save
     Then my details should be:
        | Field   | Value        |
        | Name    | Bob          |
        | Surname | Jr           |
        | Address | 123 Smith St |