BDD中如何处理抽象的给定步骤?

How to deal with abstract Given steps in BDD?

我们应用程序的基础是一个大的配置集,它定义了抽象的设备组,它们作为 Gherkin 场景的一部分无处不在。

现在我们使用像这样的 Given 步骤作为我们的 Gherkin 规范的一部分:

Given the device is a Zebra

Zebra 在这种情况下只是实际组的占位符,但它包括许多不同的特定设备。像这样的语句非常方便,但它也使这个场景无法测试,因为您必须为每个特定设备自动执行这个场景,而且我不知道有任何框架具有这样的功能。场景大纲也不是解决方案,因为在几乎所有场景 and/or 功能文件中您都会有此设备列表的副本。

这个问题有没有可能的解决方案。也许我们那样使用 BDD 是完全错误的,但是您如何处理这种配置问题?

如果您只想在特定类型的所有场景之前设置一个上下文(您的设备列表),那么这就是 背景上下文 的一个很好的例子; long-lived 很少更改且适用于所有场景的数据。许多 BDD 框架都提供了工具,使您能够在功能/场景文件的顶部设置背景。例如黄瓜有 Background; JBehave does it with GivenStories.

对于不提供此类工具的框架,可以跳过该步骤的细节,只要它对每个使用它的人来说都是 well-understood。所以你可以说:

Given the standard device list
And a Zebra from that list

这将允许您只用几行就可以完成,设备列表的详细信息隐藏在步骤定义中。

但是,如果您想尝试 运行 每个设备 的场景只是为了检查它是否有效,那么这可能超出了 BDD 的范围,当然还有 BDD 框架。

BDD 并不是严格的回归测试。它是关于捕获系统行为的具体示例,最好是通过与专家(理解问题的人,如业务代表)、测试人员和开发人员的对话。如果您有一个设备以特定方式运行的示例,通常足以理解这种理解,至少从 BDD 的角度来看是这样。

如果您必须为每台设备执行一个场景才能彻底,那么可以改用 JUnit 之类的东西。如果您愿意,您仍然可以使用 Given / When / Then 语法,作为代码中的注释或 creating your own DSL,但如果您找到其他方式来表达测试的价值,则不要受限于BDD 的语法或 BDD 工具。这不是测试事物的唯一方法。