一个Gherkin场景中是否可以有多个Given/When/Then组?

28

我正在使用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”语句的多个场景是否更好的做法?


哦,这并未回答是否可能的问题。现在继续谷歌搜索吧... - djangofan
我不同意被接受的答案;我在这个重复的问题中添加了我的答案 - Dave Schweisguth
2个回答

44

记住一次只测试一个行为/功能。经验法则是你应该只使用一个 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步骤,没有任何And步骤作为其下属。如果你使用多个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模式等。并阅读有关基于示例的规范的内容。


感谢您的有益回复。我明白您所说的让规格反映功能的核心业务逻辑,从而使它们更具未来性的方法。那么,使用功能/场景来测试围绕功能的特定UI实现是否不合适?如果是这样,有什么更好的选择?我理解,在我的例子中,功能和特定UI组件之间存在一些模糊的边界。 - Geoffrey Hing
  1. 对于UI测试,仅在(由于使用的工具、框架等)这是最快捷的方法时才使用Gherkin。
  2. 如果您使用Gherkin与他人沟通,请专注于用户目标,而不是UI,并使用PageObjects来包装底层逻辑。对于前者,请使用最快的工具 - 大多数业务人员不会关心文本区域和输入字段之间的差异。例如,我仅使用PageObjects + JavaScript单元测试来测试UI逻辑,因为在我们的情况下,这是最快的方法。
- Michael Szymczak
1
Gherkin旨在涵盖您的业务规则,而不是您的代码。BDD关注的是应用程序设计,而不是应用程序测试。如果您有需要测试的功能元素,则使用功能测试框架或全面的单元测试集。 - Greg Gauthier
@GregGauthier 对不起,我回复你的评论有些迟了。我同意你的观点。如果你读了我的第一点,我反对使用Gherkin语言作为UI测试框架。我说过,只有在其他所有选项都更糟糕/更慢的情况下,才应该考虑使用它,而现在这种情况可能永远不会出现。你可以阅读我的http://www.michaelszymczak.com/article/testing-business-rules.html系列文章,看到我更喜欢使用Gherkin来指定业务规则。我们在这方面是一致的。 - Michael Szymczak

3
与以前的答案不同,没有严格的规定如何定义步骤。Cucumber官方文档(https://cucumber.io/docs/gherkin/reference/)建议仅使用一个When,因为一个验收标准只列出了行为。这只是一些建议,而不是规则。Cucumber文档主要关注验收标准规范,而不是测试自动化。
在自动化测试中,可以根据实际需求选择最适合您的方式。
我建议使用较少的"And"关键字来合并不同的步骤。以下是我建议的内容(这只是一些建议,而不是规则 :)):
1.在一个场景流程中,只使用一个Given、When和Then关键字,如果需要在适当的事件中指定额外步骤,则使用"And"关键字。 2.如果使用太多的"And"关键字,请尝试合并多个这样的步骤。
事实上,我们不能在测试自动化中仅使用一个When,因为:
1.自动化测试中的测试数量会增加。 2.自动化执行时间增加。 3.如果我们仅使用一个"When",可能会在多个场景中执行许多冗余操作。考虑到您需要执行5个步骤作为10个不同操作的初始条件进行测试的情况。在这里,当您仅使用一个"When"时,您将执行这5个步骤10次-这会消耗太多时间,导致测试不稳定,并对您的应用程序造成更多负荷。 4.由于测试数量增加,我们需要花费更多的时间来分析结果,更多的时间来维护。
我还建议根据要求测试行为。如果您的要求是验证“测试区域”中的某些内容而不是“输入区域”,则您的步骤应该指示这一点。请记住,如果要求发生变化,则开发代码会发生变化,因此测试自动化代码也会发生变化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接