如何在外部源中移动黄瓜示例数据

时间:2019-07-03 08:43:16

标签: cucumber cucumber-jvm cucumber-java cucumber-junit cucumber-serenity

我的要求是从黄瓜的外部资源中加载参数

例如:

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

我们在黄瓜中是否有相同的规定?或者我们可以重写任何现有功能以实现相同的目的

我想知道是否有人已经做过,如果可以,请与我们分享。

1 个答案:

答案 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);