【问题标题】:In “Given-When-Then” style BDD tests, is it OK to have multiple “When”s conjoined with an “And”?在“Given-When-Then”风格的 BDD 测试中,是否可以将多个“When”与“And”连在一起?
【发布时间】:2016-11-10 00:18:11
【问题描述】:

我阅读了 Bob Martin 关于如何将“Given-When-Then”实际与 FSM 进行比较的精彩文章。它让我思考。 BDD 测试可以有多个“When”吗?

例如。

GIVEN my system is in a defined state
WHEN an event A occurs
 AND an event B occurs
 AND an event C occurs
THEN my system should behave in this manner

我个人认为这些应该是 3 种不同的测试,以实现良好的意图分离。但除此之外,是否有任何令人信服的理由支持或反对这种方法?

【问题讨论】:

    标签: testing bdd gherkin


    【解决方案1】:

    如果在执行实际断言 (THEN) 之前需要多个步骤 (WHEN),我更喜欢将它们分组在初始条件部分 (GIVEN) 中,并在 WHEN 部分中只保留一个。这种情况表明,真正触发我的 SUT 的“动作”的事件是这个,而前一个是到达那里的更多步骤。

    你的测试会变成:

    GIVEN my system is in a defined state
     AND an event A occurs
     AND an event B occurs
    WHEN an event C occurs
    THEN my system should behave in this manner
    

    但我猜这更多是个人喜好。

    【讨论】:

      【解决方案2】:

      如果您确实需要测试系统在这些特定条件下以特定方式运行,那么这是一种完全可以接受的编写测试的方式。

      【讨论】:

        【解决方案3】:

        我发现另一个限制因素可能是在 E2E 测试场景中,您希望多次重用一个语句。在我的例子中,我选择的 BDD 框架(pytest_bdd)的实现方式是给定语句可以具有单个返回值,并且它通过映射到给定步骤的函数的名称自动映射 then 输入参数。现在这种设计阻止了可重用性,而在我的情况下,我想要这样。简而言之,我需要创建对象并将它们添加到另一个给定语句提供的序列对象中。我解决这个限制的方法是使用一个测试夹具(我命名为 test_context),它是一个 python 字典(一个 hashmap),并且在没有相同单数要求的语句中使用,因此 '(when)add object to sequence' 步骤在上下文中查找序列并将有问题的对象附加到它。所以现在我可以多次重复使用 add 对象来序列操作。

        这个要求很棘手,因为 BDD 的目标是描述性的。因此,我可以将单个给定语句与我想要对其执行测试操作的序列对象的腌制内存映射一起使用。但是它会有用吗?我想不是。我需要先构建序列,并且需要可重用的语句。虽然这不在 BDD 圣经中,但我认为最终它是一个非常实际的 E2E 描述性测试问题的实用且务实的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多