我在一个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 |
如您所见,场景
s1
和 s2
的示例是相同的...所以我认为从外部文件加载它们是个好主意,以便于跨场景/文件共享(这只是一个具有 2 个场景的简单示例,但请考虑一个具有许多功能的真实应用程序)。
如果用户的数据被更新,这意味着我必须更新所有示例......而如果我只是从外部文件加载它,它只是一个更新的地方。
我已经看到一些网站提供了该功能,例如这里,但是我自己无法弄清楚如何做到这一点:
Scenario: s2
Given xxx
Then yyy <field1>
Then zzz <field2>
Examples: {"dataFile":"./users.csv"}
总是有替代方案,例如,预处理.feature
文件并将这些行替换为文件的内容或类似的东西......但我想知道是否有更原生或更直接的东西,因为我不想走那条路,或者重度定制......
我找不到任何东西,所以一切都会受到欢迎。
不能使用功能文件进行任何编程。这是设计的,因为特征文件旨在成为人类可读的文档形式;它应该以业务和it利益相关者都能理解的方式描述系统的预期行为。
考虑到这一点,问题就变成了是否需要在要素文件中添加字段及其值的详细信息。有了这些细节,文件是否更容易理解?(剧透:没有)。
我的建议是将这些细节移到步骤定义中,并仅以高级术语描述特定情况(步骤/场景/示例)。
例如,我工作的一个系统处理订单。我们有不同类型的订单,不同类型的产品,交付方式,付款方式等。虽然每个订单都需要填写所有这些字段,但并非所有字段都与任何特定场景相关。因此,我们在功能文件中描述相关部分,并对其余数据使用默认值。这些数据设置在创建我们需要的对象的辅助方法中,步骤定义调用特定步骤/场景的相关辅助方法。
因此,步骤给定一个使用信用卡付款的订单
将创建一个默认订单并添加一个信用卡付款。步骤给定一个包含多个产品的订单
创建一个包含多个产品的订单(以及默认付款信息等)。
(虽然你可以将这些数据存储在Excel或其他文件中并从那里读取,但我可以从经验中告诉你,这会让你的生活更困难,而不是更容易。设置这个会比使用编程语言创建对象/数据花费更多的时间,而且你的测试运行时间会更长,因为处理文件需要时间)。