我的要求是从黄瓜的外部资源中加载参数
例如:
Scenario Outline: eating
Given there are <start> cucumbers
When I eat <eat> cucumbers
Then I should have <left> cucumbers
Examples:
| start | eat | left |
| 12 | 5 | 7 |
| 20 | 5 | 15 |
在上面的示例中,我想将示例数据移动到任何外部源(如excel或JSON)中,并且我也希望相同的行为将单个方案用于多次迭代。当前,如果我将数据移至外部源,则需要重复场景n次,并使用@before,然后再从外部源读取数据,这对我来说似乎很奇怪。
在上钩之前,我们可以从Excel中读取已经完成的数据。问题是由于示例数据已超出功能范围,因此成为方案而不是方案大纲,该方案仅运行方案一次。如果我在步骤定义函数中加入循环,那么如果任何一个数据示例失败,那么它将使整个场景失败,从而使其不可靠
我发现了一篇关于相同内容的类似文章,但没有提供任何说明,答案也没有提供任何关于相同内容的JSON结构,文档等
Integrating external data source with Cucumber feature file
我们在黄瓜中是否有相同的规定?或者我们可以重写任何现有功能以实现相同的目的
我想知道是否有人已经做过,如果可以,请与我们分享。
答案 0 :(得分:0)
这是解决方案的草稿,它将为您提供一个想法,您可以对此进行完善。基本上,您必须单独调用此方法,该方法将更新功能文件,并且示例表将使用json数据进行更新。
String jsonPath = "C:\\xxx\\sample.json";
String featurePath = "C:\\xxx\\sample.feature";
String tempFilePath = "C:\\xxx\\sample.temp";
// copy all the steps till example from orinal file to temp
File fin = new File(featurePath);
FileInputStream fis = new FileInputStream(fin);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
FileWriter fstream = new FileWriter(tempFilePath, true);
BufferedWriter out = new BufferedWriter(fstream);
String aLine = null;
while ((aLine = in.readLine()) != null) {
//Process each line and add output to Dest.txt file
out.write(aLine);
out.newLine();
if (aLine.contains("Examples:")) {
break;
}
}
// open the json
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode root = objectMapper.readTree(new File(jsonPath));
system.out.println(root);
// for each object in root
out.write("|start|eat|left|");
out.newLine();
for (JsonNode row : root) {
String start = row.get("start").toString();
String eat = row.get("eat").toString();
String left = row.get("left").toString();
// add these deatils to the examples table
out.write("|" + start + "|" + eat + "|" + left + "|" );
out.newLine();
}
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
in.close();
out.close();
fin.delete();
new File(tempFilePath).renameTo(fin);