在“给定时间”风格的BDD测试中,是否可以将多个“When”与“And”连接在一起



我读了鲍勃·马丁(Bob Martin)关于如何将"给定时间"与FSM实际进行比较的精彩文章。这让我思考。BDD 测试可以有多个"何时"吗?

例如。

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 种不同的测试,以实现良好的意图分离。但除此之外,是否有任何令人信服的理由支持或反对这种方法?

当你在做实际断言(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

但我想这更像是个人喜好。

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

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

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

最新更新