Cucumber场景独立JSON文件生成问题:多余文件生成求助
问题描述
基于混合自动化框架生成Cucumber报告格式的JSON文件,需求是为每个场景创建一个独立的JSON文件。但执行代码后生成了3个文件:
- cucumber_report.jsonMy_Scenario.json
- cucumber_report1.jsonAnother_Scenario.json
- cucumber_report1.jsonMy_Scenario.json
预期仅生成2个文件:
- cucumber_report.jsonMy_Scenario.json
- cucumber_report1.jsonAnother_Scenario.json
代码文件
Main.java
package com.demo.jdbc; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class jsonCucumber { public static void main(String[] args) throws IOException { //CucumberJSONGenerator3 cucumberJSONGenerator = new CucumberJSONGenerator3(); //CucumberJSONGenerator2 cucumberJSONGenerator = new CucumberJSONGenerator2(); CucumberJSONGenerator cucumberJSONGenerator = new CucumberJSONGenerator(); // Add a scenario with tags String[] tags = {"tag1", "tag2"}; cucumberJSONGenerator.addScenario("My Scenario", tags); cucumberJSONGenerator.addStep("Given I navigate to the homepage", "passed"); cucumberJSONGenerator.addStep("When I click the login button", "passed"); cucumberJSONGenerator.addStep("Then I should see the dashboard", "failed"); cucumberJSONGenerator.executionFinish("cucumber_report.json"); //cucumberJSONGenerator.executionFinish(); // Add a scenario without tags cucumberJSONGenerator.addScenario("Another Scenario",new String[]{}); cucumberJSONGenerator.addStep("Given I open the application", "passed"); cucumberJSONGenerator.addStep( "When I enter my username", "passed"); cucumberJSONGenerator.addStep( "And I enter my password", "passed"); cucumberJSONGenerator.addStep( "Then I should be logged in", "passed"); // cucumberJSONGenerator.executionFinish(); cucumberJSONGenerator.executionFinish("cucumber_report1.json"); } }
CucumberJSONGenerator.java
package com.demo.jdbc; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonArray; import java.io.FileWriter; import java.io.IOException; public class CucumberJSONGenerator { private JsonObject cucumberReport; private JsonArray cucumberFeatures; private JsonObject cucumberFeature; private JsonArray cucumberElements; private JsonObject cucumberElement; private JsonArray cucumberSteps; private JsonObject cucumberStep; public CucumberJSONGenerator() { cucumberReport = new JsonObject(); cucumberFeatures = new JsonArray(); } public void addScenario(String scenarioName, String[] tags) { cucumberFeature = new JsonObject(); cucumberFeature.addProperty("name", scenarioName); if (tags == null) { tags = new String[0]; } cucumberFeature.add("tags", generateTagsArray(tags)); cucumberElements = new JsonArray(); cucumberFeature.add("elements", cucumberElements); cucumberSteps = new JsonArray(); cucumberElement = new JsonObject(); cucumberElement.add("steps", cucumberSteps); cucumberElements.add(cucumberElement); cucumberFeatures.add(cucumberFeature); } public void addStep(String stepName, String status) { cucumberStep = new JsonObject(); cucumberStep.addProperty("name", stepName); cucumberStep.addProperty("result", status); cucumberSteps.add(cucumberStep); } public void executionFinish(String filePath) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonObject currentScenario = cucumberFeatures(); for (int i = 0; i < cucumberFeatures.size(); i++) { JsonObject cucumberReport = new JsonObject(); cucumberReport.addProperty("name", "Cucumber Report"); cucumberReport.addProperty("description", "This is a sample Cucumber report generated using Java."); cucumberReport.addProperty("keyword", "Feature"); JsonArray features = new JsonArray(); features.add(cucumberFeatures.get(i)); cucumberReport.add("features", features); String scenarioName = cucumberFeatures.get(i).getAsJsonObject().get("name").getAsString(); String fileName = scenarioName.replaceAll(" ", "_") + ".json"; String fileWithPath = filePath + fileName; FileWriter writer = new FileWriter(fileWithPath); writer.write(gson.toJson(cucumberReport)); writer.close(); } } catch (IOException e) { e.printStackTrace(); } } private JsonObject cucumberFeatures() { return cucumberFeatures.get(cucumberFeatures.size() - 1).getAsJsonObject(); } private JsonArray generateTagsArray(String[] tags) { JsonArray tagsArray = new JsonArray(); for (String tag : tags) { JsonObject tagObject = new JsonObject(); tagObject.addProperty("name", tag); tagsArray.add(tagObject); } return tagsArray; } }
解决方案
问题根源在于CucumberJSONGenerator类中的cucumberFeatures数组是全局存储的,每次调用addScenario都会往数组里添加新场景,但第一次调用executionFinish后没有清空数组。第二次调用executionFinish时,会遍历整个数组(此时数组里有2个场景),所以会生成2个文件,加上第一次生成的1个,总共3个。
有两种修改方案:
方案1:每次执行完executionFinish后清空cucumberFeatures数组
修改executionFinish方法,在遍历完成后清空数组,确保下次添加场景时数组是干净的:
public void executionFinish(String filePath) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); for (int i = 0; i < cucumberFeatures.size(); i++) { JsonObject cucumberReport = new JsonObject(); cucumberReport.addProperty("name", "Cucumber Report"); cucumberReport.addProperty("description", "This is a sample Cucumber report generated using Java."); cucumberReport.addProperty("keyword", "Feature"); JsonArray features = new JsonArray(); features.add(cucumberFeatures.get(i)); cucumberReport.add("features", features); String scenarioName = cucumberFeatures.get(i).getAsJsonObject().get("name").getAsString(); String fileName = scenarioName.replaceAll(" ", "_") + ".json"; String fileWithPath = filePath + fileName; FileWriter writer = new FileWriter(fileWithPath); writer.write(gson.toJson(cucumberReport)); writer.close(); } // 清空数组,避免下次执行时重复处理历史场景 cucumberFeatures.clear(); } catch (IOException e) { e.printStackTrace(); } }
方案2:每次executionFinish只处理最后添加的场景
如果希望每次调用只处理当前最新添加的场景,而不是遍历整个数组,可以修改executionFinish方法,去掉循环,直接处理数组最后一个元素:
public void executionFinish(String filePath) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); // 只处理最后添加的场景 if(cucumberFeatures.isEmpty()){ return; } JsonObject currentFeature = cucumberFeatures.get(cucumberFeatures.size()-1).getAsJsonObject(); JsonObject cucumberReport = new JsonObject(); cucumberReport.addProperty("name", "Cucumber Report"); cucumberReport.addProperty("description", "This is a sample Cucumber report generated using Java."); cucumberReport.addProperty("keyword", "Feature"); JsonArray features = new JsonArray(); features.add(currentFeature); cucumberReport.add("features", features); String scenarioName = currentFeature.get("name").getAsString(); String fileName = scenarioName.replaceAll(" ", "_") + ".json"; String fileWithPath = filePath + fileName; FileWriter writer = new FileWriter(fileWithPath); writer.write(gson.toJson(cucumberReport)); writer.close(); // 移除已处理的场景,避免重复处理 cucumberFeatures.remove(cucumberFeatures.size()-1); } catch (IOException e) { e.printStackTrace(); } }
两种方案都能解决问题,方案1适合批量处理场景后一次性生成所有文件;方案2更符合当前代码的调用逻辑,每次添加一个场景后生成对应文件。
内容的提问来源于stack exchange,提问作者Hiruthere
相关产品推荐
相关产品推荐

