提问者:小点点

从外部文件加载cucumber/小cucumber中的数据


我在一个JS/Node项目中使用cucumber(并用gherkin编写测试),我发现自己在不同的例子中复制了大量的测试数据(场景概要例子)。

大多数情况下使用的是具有不同属性的用户列表,需要使用这些属性来确保网页的不同部分适用于所有用户。

因此,测试结果如下:

Scenario: s1
  Given xxx
  Then yyy <field1>
  Then zzz <field2>

Examples:
  | username | field1 | field2 |
  | user1    | f11    | f21    |
  | user2    | f12    | f22    |

Scenario: s2
  Given xxx
  Then yyy <field1>
  Then zzz <field2>

Examples:
  | username | field1 | field2 |
  | user1    | f11    | f21    |
  | user2    | f12    | f22    |

如您所见,场景 s1s2 的示例是相同的...所以我认为从外部文件加载它们是个好主意,以便于跨场景/文件共享(这只是一个具有 2 个场景的简单示例,但请考虑一个具有许多功能的真实应用程序)。

如果用户的数据被更新,这意味着我必须更新所有示例......而如果我只是从外部文件加载它,它只是一个更新的地方。

我已经看到一些网站提供了该功能,例如这里,但是我自己无法弄清楚如何做到这一点:

Scenario: s2
  Given xxx
  Then yyy <field1>
  Then zzz <field2>

Examples: {"dataFile":"./users.csv"}

总是有替代方案,例如,预处理.feature文件并将这些行替换为文件的内容或类似的东西......但我想知道是否有更原生或更直接的东西,因为我不想走那条路,或者重度定制......

我找不到任何东西,所以一切都会受到欢迎。


共1个答案

匿名用户

不能使用功能文件进行任何编程。这是设计的,因为特征文件旨在成为人类可读的文档形式;它应该以业务和it利益相关者都能理解的方式描述系统的预期行为。

考虑到这一点,问题就变成了是否需要在要素文件中添加字段及其值的详细信息。有了这些细节,文件是否更容易理解?(剧透:没有)。

我的建议是将这些细节移到步骤定义中,并仅以高级术语描述特定情况(步骤/场景/示例)。

例如,我工作的一个系统处理订单。我们有不同类型的订单,不同类型的产品,交付方式,付款方式等。虽然每个订单都需要填写所有这些字段,但并非所有字段都与任何特定场景相关。因此,我们在功能文件中描述相关部分,并对其余数据使用默认值。这些数据设置在创建我们需要的对象的辅助方法中,步骤定义调用特定步骤/场景的相关辅助方法。

因此,步骤给定一个使用信用卡付款的订单将创建一个默认订单并添加一个信用卡付款。步骤给定一个包含多个产品的订单创建一个包含多个产品的订单(以及默认付款信息等)。

(虽然你可以将这些数据存储在Excel或其他文件中并从那里读取,但我可以从经验中告诉你,这会让你的生活更困难,而不是更容易。设置这个会比使用编程语言创建对象/数据花费更多的时间,而且你的测试运行时间会更长,因为处理文件需要时间)。