You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:32:20