diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java index 5b11277e78..29c5f4e64c 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java @@ -74,6 +74,9 @@ public class MsScenario extends MsTestElement { @JSONField(ordinal = 29) private boolean environmentEnable; + @JSONField(ordinal = 30) + private Boolean variableEnable; + private static final String BODY_FILE_DIR = FileUtils.BODY_FILE_DIR; public MsScenario() { @@ -136,22 +139,24 @@ public class MsScenario extends MsTestElement { if (config != null && !config.getExcludeScenarioIds().contains(this.getId())) { scenarioTree = MsCriticalSectionController.createHashTree(tree, this.getName(), this.isEnable()); } - // 场景变量和环境变量 + // 环境变量 Arguments arguments = arguments(this.isEnvironmentEnable() ? newConfig : config); - if (arguments != null) { + if (arguments != null && (this.variableEnable == null || this.variableEnable)) { Arguments valueSupposeMock = ParameterConfig.valueSupposeMock(arguments); // 这里加入自定义变量解决ForEach循环控制器取值问题,循环控制器无法从vars中取值 scenarioTree.add(valueSupposeMock); scenarioTree.add(ElementUtil.argumentsToProcessor(valueSupposeMock)); } - ElementUtil.addCsvDataSet(scenarioTree, variables, this.isEnvironmentEnable() ? newConfig : config, "shareMode.group"); - ElementUtil.addCounter(scenarioTree, variables, false); - ElementUtil.addRandom(scenarioTree, variables); - if (CollectionUtils.isNotEmpty(this.headers)) { - if (this.isEnvironmentEnable()) { - newConfig.setHeaders(this.headers); - } else { - config.setHeaders(this.headers); + if (this.variableEnable == null || this.variableEnable) { + ElementUtil.addCsvDataSet(scenarioTree, variables, this.isEnvironmentEnable() ? newConfig : config, "shareMode.group"); + ElementUtil.addCounter(scenarioTree, variables, false); + ElementUtil.addRandom(scenarioTree, variables); + if (CollectionUtils.isNotEmpty(this.headers)) { + if (this.isEnvironmentEnable()) { + newConfig.setHeaders(this.headers); + } else { + config.setHeaders(this.headers); + } } } // 添加全局前置 @@ -175,7 +180,7 @@ public class MsScenario extends MsTestElement { } private void setGlobProcessor(ParameterConfig config, HashTree scenarioTree, boolean isPre) { - if (config.getConfig() != null) { + if (config.getConfig() != null && (this.variableEnable == null || this.variableEnable)) { config.getConfig().forEach((k, environmentConfig) -> { if (environmentConfig != null) { MsJSR223Processor processor = isPre ? environmentConfig.getPreStepProcessor() : environmentConfig.getPostStepProcessor(); @@ -211,14 +216,14 @@ public class MsScenario extends MsTestElement { LinkedList sourceHashTree = mapper.readValue(element.getString("hashTree"), new TypeReference>() { }); // 场景变量 - if (StringUtils.isNotEmpty(element.getString("variables"))) { + if (StringUtils.isNotEmpty(element.getString("variables")) && (this.variableEnable == null || this.variableEnable)) { LinkedList variables = mapper.readValue(element.getString("variables"), new TypeReference>() { }); this.setVariables(variables); } // 场景请求头 - if (StringUtils.isNotEmpty(element.getString("headers"))) { + if (StringUtils.isNotEmpty(element.getString("headers")) && (this.variableEnable == null || this.variableEnable)) { LinkedList headers = mapper.readValue(element.getString("headers"), new TypeReference>() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/controller/loop/MsWhileController.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/controller/loop/MsWhileController.java index 4ed9a8cc67..32b8144e59 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/controller/loop/MsWhileController.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/controller/loop/MsWhileController.java @@ -7,6 +7,6 @@ public class MsWhileController { private String variable; private String operator; private String value; - private int timeout; + private long timeout; private Object requestResult; } diff --git a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java index 2c0692bc28..f92363cabd 100644 --- a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java +++ b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java @@ -223,6 +223,9 @@ public class ApiScenarioEnvService { * @param apiScenarioWithBLOBs */ public void setScenarioEnv(ApiScenarioWithBLOBs apiScenarioWithBLOBs, RunScenarioRequest request) { + if (apiScenarioWithBLOBs == null) { + return; + } String environmentType = apiScenarioWithBLOBs.getEnvironmentType(); String environmentJson = apiScenarioWithBLOBs.getEnvironmentJson(); String environmentGroupId = apiScenarioWithBLOBs.getEnvironmentGroupId(); @@ -245,68 +248,70 @@ public class ApiScenarioEnvService { } public boolean checkScenarioEnv(ApiScenarioWithBLOBs apiScenarioWithBLOBs, TestPlanApiScenario testPlanApiScenarios) { - String definition = apiScenarioWithBLOBs.getScenarioDefinition(); - MsScenario scenario = JSONObject.parseObject(definition, MsScenario.class); boolean isEnv = true; - Map envMap = scenario.getEnvironmentMap(); - if (testPlanApiScenarios != null) { - String envType = testPlanApiScenarios.getEnvironmentType(); - String envJson = testPlanApiScenarios.getEnvironment(); - String envGroupId = testPlanApiScenarios.getEnvironmentGroupId(); - if (StringUtils.equals(envType, EnvironmentType.JSON.toString()) - && StringUtils.isNotBlank(envJson)) { - envMap = JSON.parseObject(testPlanApiScenarios.getEnvironment(), Map.class); - } else if (StringUtils.equals(envType, EnvironmentType.GROUP.name()) - && StringUtils.isNotBlank(envGroupId)) { - envMap = environmentGroupProjectService.getEnvMap(envGroupId); - } else { - envMap = new HashMap<>(); - } - } - ScenarioEnv apiScenarioEnv = getApiScenarioEnv(definition); - // 所有请求非全路径检查环境 - if (!apiScenarioEnv.getFullUrl()) { - try { - if (envMap == null || envMap.isEmpty()) { - isEnv = false; + if (apiScenarioWithBLOBs != null) { + String definition = apiScenarioWithBLOBs.getScenarioDefinition(); + MsScenario scenario = JSONObject.parseObject(definition, MsScenario.class); + Map envMap = scenario.getEnvironmentMap(); + if (testPlanApiScenarios != null) { + String envType = testPlanApiScenarios.getEnvironmentType(); + String envJson = testPlanApiScenarios.getEnvironment(); + String envGroupId = testPlanApiScenarios.getEnvironmentGroupId(); + if (StringUtils.equals(envType, EnvironmentType.JSON.toString()) + && StringUtils.isNotBlank(envJson)) { + envMap = JSON.parseObject(testPlanApiScenarios.getEnvironment(), Map.class); + } else if (StringUtils.equals(envType, EnvironmentType.GROUP.name()) + && StringUtils.isNotBlank(envGroupId)) { + envMap = environmentGroupProjectService.getEnvMap(envGroupId); } else { - Set projectIds = apiScenarioEnv.getProjectIds(); - projectIds.remove(null); - if (CollectionUtils.isNotEmpty(envMap.keySet())) { - for (String id : projectIds) { - Project project = projectMapper.selectByPrimaryKey(id); - if (project == null) { - id = apiScenarioWithBLOBs.getProjectId(); - } - String s = envMap.get(id); - if (StringUtils.isBlank(s)) { - isEnv = false; - break; - } else { - ApiTestEnvironmentWithBLOBs env = apiTestEnvironmentMapper.selectByPrimaryKey(s); - if (env == null) { + envMap = new HashMap<>(); + } + } + ScenarioEnv apiScenarioEnv = getApiScenarioEnv(definition); + // 所有请求非全路径检查环境 + if (!apiScenarioEnv.getFullUrl()) { + try { + if (envMap == null || envMap.isEmpty()) { + isEnv = false; + } else { + Set projectIds = apiScenarioEnv.getProjectIds(); + projectIds.remove(null); + if (CollectionUtils.isNotEmpty(envMap.keySet())) { + for (String id : projectIds) { + Project project = projectMapper.selectByPrimaryKey(id); + if (project == null) { + id = apiScenarioWithBLOBs.getProjectId(); + } + String s = envMap.get(id); + if (StringUtils.isBlank(s)) { isEnv = false; break; + } else { + ApiTestEnvironmentWithBLOBs env = apiTestEnvironmentMapper.selectByPrimaryKey(s); + if (env == null) { + isEnv = false; + break; + } } } + } else { + isEnv = false; } - } else { - isEnv = false; } + } catch (Exception e) { + isEnv = false; + LogUtil.error(e.getMessage(), e); } - } catch (Exception e) { - isEnv = false; - LogUtil.error(e.getMessage(), e); } - } - // 1.8 之前环境是 environmentId - if (!isEnv) { - String envId = scenario.getEnvironmentId(); - if (StringUtils.isNotBlank(envId)) { - ApiTestEnvironmentWithBLOBs env = apiTestEnvironmentMapper.selectByPrimaryKey(envId); - if (env != null) { - isEnv = true; + // 1.8 之前环境是 environmentId + if (!isEnv) { + String envId = scenario.getEnvironmentId(); + if (StringUtils.isNotBlank(envId)) { + ApiTestEnvironmentWithBLOBs env = apiTestEnvironmentMapper.selectByPrimaryKey(envId); + if (env != null) { + isEnv = true; + } } } } diff --git a/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java b/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java index ab723b4129..d46e3bbf0f 100644 --- a/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java +++ b/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java @@ -48,6 +48,7 @@ public class MsHashTreeService { private static final String ENABLE = "enable"; private static final String NUM = "num"; private static final String ENV_ENABLE = "environmentEnable"; + private static final String VARIABLE_ENABLE = "variableEnable"; private static final String DISABLED = "disabled"; private static final String VERSION_NAME = "versionName"; private static final String VERSION_ENABLE = "versionEnable"; @@ -217,10 +218,16 @@ public class MsHashTreeService { private JSONObject setRefScenario(JSONObject element) { boolean enable = element.containsKey(ENABLE) ? element.getBoolean(ENABLE) : true; + if (!element.containsKey(VARIABLE_ENABLE)) { + element.put(VARIABLE_ENABLE, true); + } + ApiScenarioDTO scenarioWithBLOBs = extApiScenarioMapper.selectById(element.getString(ID)); if (scenarioWithBLOBs != null && StringUtils.isNotEmpty(scenarioWithBLOBs.getScenarioDefinition())) { boolean environmentEnable = element.containsKey(ENV_ENABLE) ? element.getBoolean(ENV_ENABLE) : false; + boolean variableEnable = element.containsKey(VARIABLE_ENABLE) + ? element.getBoolean(VARIABLE_ENABLE) : true; if (StringUtils.equalsIgnoreCase(element.getString(REFERENCED), REF)) { element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition()); @@ -229,6 +236,9 @@ public class MsHashTreeService { } element.put(ID, scenarioWithBLOBs.getId()); element.put(ENV_ENABLE, environmentEnable); + if (!element.containsKey(VARIABLE_ENABLE)) { + element.put(VARIABLE_ENABLE, variableEnable); + } this.setElement(element, scenarioWithBLOBs.getNum(), enable, scenarioWithBLOBs.getVersionName(), scenarioWithBLOBs.getVersionEnable()); } else { if (StringUtils.equalsIgnoreCase(element.getString(REFERENCED), REF)) { diff --git a/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue b/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue index 116a661e2a..4d1b701765 100644 --- a/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue @@ -43,11 +43,24 @@