【问题标题】:Creating Examples for ScenarioOutline in code在代码中为 ScenarioOutline 创建示例
【发布时间】:2019-04-05 12:58:10
【问题描述】:
我想在功能文件中为 ScenarioOutline 动态创建多个示例。是否有可能在 @before 钩子中以某种方式做到这一点?
我知道你不应该这样使用黄瓜,但怎么可能呢?
我已经尝试在钩子中访问场景,但是没有方法可以获取所有步骤及其变量/占位符
【问题讨论】:
标签:
java
selenium
cucumber
scenarios
【解决方案1】:
这已被问过几次,通常是更具体的问题“如何从 CSV 导入场景大纲示例?”。您可能会通过研究该问题找到适合您的解决方法,例如建议使用QAF Gherkin scenario factory 的this answer 或建议将CSV 传递到场景中的this answer,然后使用示例表对其进行索引。
但是,也就是说,从文件动态定义场景在 Cucumber FAQ 中作为反模式特别列出
我们建议您不要使用 Excel 或 csv 文件来定义您的测试用例;使用 Excel 或 csv 文件被认为是一种反模式。
Cucumber 的目标之一是拥有可执行的规范。这意味着您的功能文件应该包含正确级别的信息来记录系统的预期行为。如果您的测试用例保存在单独的文件中,您将如何阅读文档?
有时当被问到这个问题时,有一个strong response 来自那些知道使用被滥用的 BDD 工具带来痛苦的人,实际上是在乞求他们不要这样做。
Cucumber 作为 BDD 工具涉及很多开销(编写功能文件)并提供一定的价值(可能是对产品应该如何工作的充满活力的、团队范围内的理解)。如果您编写的功能文件无法为您带来价值,那么您将所有这些时间都投入到测试框架的一个昂贵的、不必要的层上。 Cucumber 基本上成为了一个荣耀的测试运行器,如果你真的不需要 BDD 应该提供的价值,还有更便宜的方法来运行你的测试。
【解决方案2】:
Cucumber 不鼓励在特性文件之外有示例。
但是,很少有非标准方式可用于黄瓜使用功能文件之外的示例。其中之一,您可以参考grasshopper's post。
另一个替代方案是使用gherkin with QAF,它提供了许多内置data-providers 的功能,包括XML/CSV/JSON/EXCEL/DB。它还支持提供使用自定义数据提供程序通过代码生成的示例。例如:
Scenario Outline: scenario with dynamic test-data
....
Examples:{"dataProvider":"dynamic-examples", "dataProviderClass":"my.project.impl.CustomExamplesProvider"}
package my.project.impl;
public class CustomExamplesProvider{
@DataProvider(name="dynamic-examples")
public static Object[][] dataProviderForBDD(){
//generate and return data.
//This is just example with hard-coded values and you can generate and return data as per need.
Map<Object, Object> ex1 = Maps.newHashMap();
ex1.put("fruit", "grapes");
ex1.put("color", "green");
Map<Object, Object> ex2 = Maps.newHashMap();
ex2.put("fruit", "banana");
ex2.put("color", "yellow");
return new Object[][] {{ex1},{ex2}} ;
}
}