24

我正在 Gherkin 中编写验收测试,我想根据初始操作测试 Web 应用程序 UI 中的多项更改。这是一个例子:

        Scenario: Cancel editing a new text asset
            Given the user "test_user@fakedomain.com" is logged in
            When the user navigates to "/build/"
            And the user clicks the "Sandbox" link
            And the user inputs "Test story for canceling editing of a new text asset" for the "title" field
            And the user inputs "Test User" for the "byline" field 
            And the user inputs "My summary, so exciting!" for the "summary" textarea
            And the user clicks on "Untitled Section" in the section list
            And the user clicks the "Text" icon in the "center" container 
            And the user inputs the following text in the rich text editor:
                    """
                    Test text for asset. This is cool. 
                    """
            And the user clicks the "cancel" button
            Then the following text is not present: 
                    """
                    Test text for asset. This is cool. 
                    """
            And the "Image" icon is present
            And the "Text" icon is present
            When the user refreshes the browser 
            And the user clicks on "Untitled Section" in the section list
            Then the following text is not present:
                    """
                    Test text for asset. This is cool. 
                    """
            When the user opens the asset drawer
            Then the following text is not present:
                    """
                    Test text for asset. This is cool.
                    """

请注意,有多组 When/Then 步骤,用于测试初始操作的响应。虽然大多数步骤的实现都忽略了前缀关键字,而且我很确定我可以让这个测试运行,但有没有更好的方法来测试不同的结果?使用相同的设置但不同的“Then”语句编写多个场景是否更好?

4

2 回答 2

38

请记住,您一次只能测试一种行为/功能。经验法则是您应该只使用一个 When 步骤

Given some state before action
  And some other state before action
  ...
When  only one action
Then  assert correct output
  And assert correct output
  ...

你看——只有一行When,在When下没有任何Ands。如果您改用许多 When 步骤,您将创建测试脚本,而不是规范。您的测试将难以理解,并且您会注意到当底层实现发生变化时您会添加越来越多的步骤。

您还需要隐藏底层逻辑,因为您不想每次更改不相关的内容时都更改它。例子:

用户输入“我的总结,好激动!” 对于“摘要”文本区域

如果将汇总字段从文本区域更改为输入类型怎么办?您必须更改场景(维护噩梦)或让您的场景躺着(比没有场景更糟糕)。你应该改写:

When the user describes it as "so exciting!"

但是,整个场景的结构仍然很糟糕。问自己一个问题:我要检查什么?如果我是一个想了解该功能的业务逻辑的人,我希望看到如下内容:

Scenario: Cancel editing a new text asset
  Given I edit the Sandbox details with some data
  When  I cancel editing
  Then  Sandox details should be empty

而已!

如何实现?更深入地移动所有不相关的逻辑,使用PageObject 模式等。并阅读有关示例的规范

于 2013-10-16T10:35:04.253 回答
1

与上一个答案相比,对于如何使用定义步骤没有严格的规定。https://cucumber.io/docs/gherkin/reference/ 上的 Cucumber 官方文档建议只使用一个 When,因为只有一个行为被列在一个接受标准中。这只是一个建议,而不是规则。Cucumber 文档主要关注验收标准规范,而不是测试自动化。因此,在自动化测试方面,绝对有可能遵循它最适合您的要求。我建议通过合并不同的步骤来使用更少的“和”关键字。我推荐以下几点(这是建议,但不是规则:)):

  1. 在场景的一个流程中仅使用一个 Given、When 和 Then 关键字,如果您需要在适当的事件中指定额外的步骤,请使用“And”关键字
  2. 如果您遇到使用太多“与”关键字,请尝试合并多个此类步骤

实际上,我们不能在测试自动化中只使用一个When,因为:

  1. 自动化中的测试数量增加
  2. 自动化的总执行时间增加
  3. 如果我们只使用一个When,我们可能会在多个场景中执行大量冗余操作。假设您需要执行 5 个步骤作为测试 10 个不同操作的初始条件。在这里,当您只使用一个“When”时,您将执行这 5 个步骤 10 次 - 这会消耗太多时间,并导致测试不稳定,并导致应用程序负载增加
  4. 由于测试次数的增加,我们需要花更多的时间来分析结果,更多的时间来维护

我还建议根据要求测试行为。如果您的要求是关于验证“测试区域”而不是“输入区域”中的某些内容,那么您的步骤应该表明这一点。请记住,如果需求改变了,开发就会改变代码,因此测试自动化代码也会改变。

于 2021-12-14T22:42:35.617 回答