feat(接口测试): 处理环境和场景前后置
This commit is contained in:
parent
f065ec134e
commit
9b4431e5a2
|
@ -43,8 +43,10 @@ public abstract class AbstractJmeterElementConverter<T extends MsTestElement> im
|
||||||
*/
|
*/
|
||||||
public void parseChild(HashTree tree, AbstractMsTestElement element, ParameterConfig config) {
|
public void parseChild(HashTree tree, AbstractMsTestElement element, ParameterConfig config) {
|
||||||
if (element != null && element.getChildren() != null) {
|
if (element != null && element.getChildren() != null) {
|
||||||
element.getChildren().forEach(child ->
|
element.getChildren().forEach(child -> {
|
||||||
getConverterFunc.apply(child.getClass()).toHashTree(tree, child, config));
|
child.setParent(element);
|
||||||
|
getConverterFunc.apply(child.getClass()).toHashTree(tree, child, config);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,4 +38,8 @@ public abstract class AbstractMsTestElement implements MsTestElement {
|
||||||
* 子组件
|
* 子组件
|
||||||
*/
|
*/
|
||||||
private LinkedList<AbstractMsTestElement> children;
|
private LinkedList<AbstractMsTestElement> children;
|
||||||
|
/**
|
||||||
|
* 父组件
|
||||||
|
*/
|
||||||
|
private AbstractMsTestElement parent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
package io.metersphere.api.constants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: jianxing
|
||||||
|
* @CreateTime: 2024-02-02 19:15
|
||||||
|
*/
|
||||||
|
public class ApiConstants {
|
||||||
|
public static final String HTTP_PROTOCOL = "HTTP";
|
||||||
|
|
||||||
|
private ApiConstants() {}
|
||||||
|
}
|
|
@ -27,6 +27,13 @@ public class ApiParamConfig extends ParameterConfig {
|
||||||
* value 为对应的插件 ID
|
* value 为对应的插件 ID
|
||||||
*/
|
*/
|
||||||
private Map<Class<? extends AbstractMsTestElement>, String> testElementClassPluginIdMap;
|
private Map<Class<? extends AbstractMsTestElement>, String> testElementClassPluginIdMap;
|
||||||
|
/**
|
||||||
|
* AbstractMsTestElement 实现类与接口协议的映射
|
||||||
|
* key 为 AbstractMsTestElement 实现类对象
|
||||||
|
* value 为对应的接口协议
|
||||||
|
* 环境前后置忽略协议需要使用
|
||||||
|
*/
|
||||||
|
private Map<Class<? extends AbstractMsTestElement>, String> testElementClassProtocalMap;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -53,5 +60,4 @@ public class ApiParamConfig extends ParameterConfig {
|
||||||
String pluginId = testElementClassPluginIdMap.get(msTestElement.getClass());
|
String pluginId = testElementClassPluginIdMap.get(msTestElement.getClass());
|
||||||
return pluginConfigMap.get(pluginId);
|
return pluginConfigMap.get(pluginId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,4 +34,17 @@ public class ApiScenarioParamConfig extends ApiParamConfig {
|
||||||
return super.getProtocolEnvConfig(msTestElement);
|
return super.getProtocolEnvConfig(msTestElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前环境或者环境组的配置
|
||||||
|
* @param projectId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public EnvironmentInfoDTO getEnvConfig(String projectId) {
|
||||||
|
if (BooleanUtils.isTrue(grouped)) {
|
||||||
|
return projectEnvMap.get(projectId);
|
||||||
|
} else {
|
||||||
|
return getEnvConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.api.dto.assertion;
|
||||||
import io.metersphere.project.api.assertion.MsAssertion;
|
import io.metersphere.project.api.assertion.MsAssertion;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,5 +21,5 @@ public class MsAssertionConfig {
|
||||||
/**
|
/**
|
||||||
* 断言列表
|
* 断言列表
|
||||||
*/
|
*/
|
||||||
private List<MsAssertion> assertions;
|
private List<MsAssertion> assertions = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,4 +22,6 @@ public class ApiDebugRunRequest {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Schema(description = "请求内容")
|
@Schema(description = "请求内容")
|
||||||
private Object request;
|
private Object request;
|
||||||
|
@Schema(description = "项目ID")
|
||||||
|
private String projectId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,4 +33,5 @@ public class MsCommonElement extends AbstractMsTestElement {
|
||||||
*/
|
*/
|
||||||
@Valid
|
@Valid
|
||||||
private MsAssertionConfig assertionConfig;
|
private MsAssertionConfig assertionConfig;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import io.metersphere.project.api.processor.MsProcessor;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -15,12 +16,12 @@ import java.util.List;
|
||||||
public class MsProcessorConfig {
|
public class MsProcessorConfig {
|
||||||
/**
|
/**
|
||||||
* 是否启用全局前置
|
* 是否启用全局前置
|
||||||
* 默认为 false
|
* 默认为 true
|
||||||
*/
|
*/
|
||||||
private Boolean enableGlobal = false;
|
private Boolean enableGlobal = true;
|
||||||
/**
|
/**
|
||||||
* 处理器列表
|
* 处理器列表
|
||||||
*/
|
*/
|
||||||
@Valid
|
@Valid
|
||||||
private List<MsProcessor> processors;
|
private List<MsProcessor> processors = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class ApiScenarioAddRequest {
|
||||||
private String environmentId;
|
private String environmentId;
|
||||||
|
|
||||||
@Schema(description = "场景的通用配置")
|
@Schema(description = "场景的通用配置")
|
||||||
private ScenarioConfig scenarioConfig;
|
private ScenarioConfig scenarioConfig = new ScenarioConfig();
|
||||||
|
|
||||||
@Schema(description = "步骤集合")
|
@Schema(description = "步骤集合")
|
||||||
@Valid
|
@Valid
|
||||||
|
|
|
@ -56,6 +56,10 @@ public class ApiScenarioStepCommonDTO {
|
||||||
@Schema(description = "csv文件id集合")
|
@Schema(description = "csv文件id集合")
|
||||||
private List<String> csvFileIds;
|
private List<String> csvFileIds;
|
||||||
|
|
||||||
|
@Schema(description = "项目fk")
|
||||||
|
@NotBlank
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
@Valid
|
@Valid
|
||||||
@Schema(description = "子步骤")
|
@Schema(description = "子步骤")
|
||||||
private List<? extends ApiScenarioStepCommonDTO> children;
|
private List<? extends ApiScenarioStepCommonDTO> children;
|
||||||
|
|
|
@ -16,9 +16,6 @@ public class ApiScenarioStepDTO extends ApiScenarioStepCommonDTO {
|
||||||
@Schema(description = "资源编号")
|
@Schema(description = "资源编号")
|
||||||
private String resourceNum;
|
private String resourceNum;
|
||||||
|
|
||||||
@Schema(description = "项目fk")
|
|
||||||
private String projectId;
|
|
||||||
|
|
||||||
@Schema(description = "版本号")
|
@Schema(description = "版本号")
|
||||||
private String versionId;
|
private String versionId;
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,6 @@ public class ApiScenarioStepRequest extends ApiScenarioStepCommonDTO {
|
||||||
@Size(min = 1, max = 50, message = "{api_scenario_step.resource_num.length_range}")
|
@Size(min = 1, max = 50, message = "{api_scenario_step.resource_num.length_range}")
|
||||||
private String resourceNum;
|
private String resourceNum;
|
||||||
|
|
||||||
@Schema(description = "项目fk")
|
|
||||||
@Size(min = 1, max = 50, message = "{api_scenario_step.project_id.length_range}")
|
|
||||||
private String projectId;
|
|
||||||
|
|
||||||
@Schema(description = "版本号")
|
@Schema(description = "版本号")
|
||||||
@Size(min = 1, max = 50, message = "{api_scenario_step.version_id.length_range}")
|
@Size(min = 1, max = 50, message = "{api_scenario_step.version_id.length_range}")
|
||||||
private String versionId;
|
private String versionId;
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class ApiScenarioUpdateRequest {
|
||||||
private String environmentId;
|
private String environmentId;
|
||||||
|
|
||||||
@Schema(description = "场景的通用配置")
|
@Schema(description = "场景的通用配置")
|
||||||
private ScenarioConfig scenarioConfig;
|
private ScenarioConfig scenarioConfig = new ScenarioConfig();
|
||||||
|
|
||||||
@Valid
|
@Valid
|
||||||
@Schema(description = "步骤集合")
|
@Schema(description = "步骤集合")
|
||||||
|
|
|
@ -13,21 +13,21 @@ public class ScenarioConfig {
|
||||||
/**
|
/**
|
||||||
* 场景变量
|
* 场景变量
|
||||||
*/
|
*/
|
||||||
private ScenarioVariable variable;
|
private ScenarioVariable variable = new ScenarioVariable();
|
||||||
/**
|
/**
|
||||||
* 前置处理器配置
|
* 前置处理器配置
|
||||||
*/
|
*/
|
||||||
private MsProcessorConfig preProcessorConfig;
|
private MsProcessorConfig preProcessorConfig = new MsProcessorConfig();
|
||||||
/**
|
/**
|
||||||
* 后置处理器配置
|
* 后置处理器配置
|
||||||
*/
|
*/
|
||||||
private MsProcessorConfig postProcessorConfig;
|
private MsProcessorConfig postProcessorConfig = new MsProcessorConfig();
|
||||||
/**
|
/**
|
||||||
* 断言配置
|
* 断言配置
|
||||||
*/
|
*/
|
||||||
private MsAssertionConfig assertionConfig;
|
private MsAssertionConfig assertionConfig = new MsAssertionConfig();
|
||||||
/**
|
/**
|
||||||
* 其他配置
|
* 其他配置
|
||||||
*/
|
*/
|
||||||
private ScenarioOtherConfig otherConfig;
|
private ScenarioOtherConfig otherConfig = new ScenarioOtherConfig();
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import lombok.Data;
|
||||||
@Data
|
@Data
|
||||||
public class ScenarioStepConfig extends ApiScenario {
|
public class ScenarioStepConfig extends ApiScenario {
|
||||||
@Schema(description = "是否使用源场景环境")
|
@Schema(description = "是否使用源场景环境")
|
||||||
private Boolean enableScenarioEnv;
|
private Boolean enableScenarioEnv = false;
|
||||||
|
|
||||||
@Schema(description = "是否使用当前场景参数,如果为false,则使用源场景参数")
|
@Schema(description = "是否使用当前场景参数,如果为false,则使用源场景参数")
|
||||||
private Boolean useCurrentScenarioParam = false;
|
private Boolean useCurrentScenarioParam = false;
|
||||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.api.dto.scenario;
|
||||||
import io.metersphere.project.dto.environment.variables.CommonVariables;
|
import io.metersphere.project.dto.environment.variables.CommonVariables;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,9 +15,9 @@ public class ScenarioVariable {
|
||||||
/**
|
/**
|
||||||
* 普通变量
|
* 普通变量
|
||||||
*/
|
*/
|
||||||
private List<CommonVariables> commonVariables;
|
private List<CommonVariables> commonVariables = new ArrayList<>(0);
|
||||||
/**
|
/**
|
||||||
* csv变量
|
* csv变量
|
||||||
*/
|
*/
|
||||||
private List<CsvVariable> csvVariables;
|
private List<CsvVariable> csvVariables = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.parser.api;
|
package io.metersphere.api.parser.api;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.dto.definition.HttpResponse;
|
import io.metersphere.api.dto.definition.HttpResponse;
|
||||||
import io.metersphere.api.dto.converter.ApiDefinitionImport;
|
import io.metersphere.api.dto.converter.ApiDefinitionImport;
|
||||||
import io.metersphere.api.dto.converter.ApiDefinitionImportDetail;
|
import io.metersphere.api.dto.converter.ApiDefinitionImportDetail;
|
||||||
|
@ -279,7 +280,7 @@ public class Swagger3Parser<T> implements ImportParser<ApiDefinitionImport> {
|
||||||
ApiDefinitionImportDetail apiDefinition = new ApiDefinitionImportDetail();
|
ApiDefinitionImportDetail apiDefinition = new ApiDefinitionImportDetail();
|
||||||
apiDefinition.setName(name);
|
apiDefinition.setName(name);
|
||||||
apiDefinition.setPath(formatPath(path));
|
apiDefinition.setPath(formatPath(path));
|
||||||
apiDefinition.setProtocol("HTTP");
|
apiDefinition.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDefinition.setMethod(method);
|
apiDefinition.setMethod(method);
|
||||||
apiDefinition.setProjectId(this.projectId);
|
apiDefinition.setProjectId(this.projectId);
|
||||||
apiDefinition.setCreateUser(importRequest.getUserId());
|
apiDefinition.setCreateUser(importRequest.getUserId());
|
||||||
|
|
|
@ -1,19 +1,37 @@
|
||||||
package io.metersphere.api.parser.jmeter;
|
package io.metersphere.api.parser.jmeter;
|
||||||
|
|
||||||
|
|
||||||
import io.metersphere.api.dto.request.MsCommonElement;
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.project.api.assertion.MsAssertion;
|
import io.metersphere.api.dto.ApiParamConfig;
|
||||||
|
import io.metersphere.api.dto.ApiScenarioParamConfig;
|
||||||
import io.metersphere.api.dto.assertion.MsAssertionConfig;
|
import io.metersphere.api.dto.assertion.MsAssertionConfig;
|
||||||
import io.metersphere.project.api.assertion.MsResponseCodeAssertion;
|
import io.metersphere.api.dto.request.MsCommonElement;
|
||||||
|
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
||||||
import io.metersphere.api.dto.request.processors.MsProcessorConfig;
|
import io.metersphere.api.dto.request.processors.MsProcessorConfig;
|
||||||
|
import io.metersphere.api.parser.jmeter.processor.MsProcessorConverter;
|
||||||
import io.metersphere.api.parser.jmeter.processor.MsProcessorConverterFactory;
|
import io.metersphere.api.parser.jmeter.processor.MsProcessorConverterFactory;
|
||||||
import io.metersphere.api.parser.jmeter.processor.assertion.AssertionConverterFactory;
|
import io.metersphere.api.parser.jmeter.processor.assertion.AssertionConverterFactory;
|
||||||
import io.metersphere.plugin.api.dto.ParameterConfig;
|
import io.metersphere.plugin.api.dto.ParameterConfig;
|
||||||
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
||||||
|
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
|
||||||
|
import io.metersphere.project.api.assertion.MsAssertion;
|
||||||
|
import io.metersphere.project.api.assertion.MsResponseCodeAssertion;
|
||||||
|
import io.metersphere.project.api.processor.MsProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.EnvironmentConfig;
|
||||||
|
import io.metersphere.project.dto.environment.EnvironmentInfoDTO;
|
||||||
|
import io.metersphere.project.dto.environment.processors.ApiEnvProcessorConfig;
|
||||||
|
import io.metersphere.project.dto.environment.processors.ApiEnvRequestProcessorConfig;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvProcessorConfig;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvRequestScriptProcessor;
|
||||||
import io.metersphere.sdk.constants.MsAssertionCondition;
|
import io.metersphere.sdk.constants.MsAssertionCondition;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.jorphan.collections.HashTree;
|
import org.apache.jorphan.collections.HashTree;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: jianxing
|
* @Author: jianxing
|
||||||
* @CreateTime: 2023-10-27 10:07
|
* @CreateTime: 2023-10-27 10:07
|
||||||
|
@ -25,17 +43,24 @@ public class MsCommonElementConverter extends AbstractJmeterElementConverter<MsC
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void toHashTree(HashTree tree, MsCommonElement element, ParameterConfig config) {
|
public void toHashTree(HashTree tree, MsCommonElement element, ParameterConfig config) {
|
||||||
// todo 开关默认开启,关闭则运行该接口时不执行全局前置
|
EnvironmentInfoDTO envInfo = getEnvInfo(element, config);
|
||||||
// preProcessorConfig.getEnableGlobal();
|
// 解析前置处理器,包括环境前置
|
||||||
|
addProcessors(tree, element, config, envInfo, true);
|
||||||
// 解析前置处理器
|
// 解析后置处理器,包括环境后置
|
||||||
handlePreProcessor(tree, element.getPreProcessorConfig(), config);
|
addProcessors(tree, element, config, envInfo, false);
|
||||||
// 解析后置处理器
|
|
||||||
handlePostProcessor(tree, element.getPostProcessorConfig(), config);
|
|
||||||
// 处理断言
|
// 处理断言
|
||||||
handleAssertion(tree, element.getAssertionConfig(), config);
|
handleAssertion(tree, element.getAssertionConfig(), config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private EnvironmentInfoDTO getEnvInfo(MsCommonElement element, ParameterConfig config) {
|
||||||
|
if (config instanceof ApiParamConfig apiParamConfig) {
|
||||||
|
return apiParamConfig.getEnvConfig();
|
||||||
|
} else if (config instanceof ApiScenarioParamConfig apiScenarioParamConfig) {
|
||||||
|
return apiScenarioParamConfig.getEnvConfig(element.getProjectId());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private void handleAssertion(HashTree tree, MsAssertionConfig assertionConfig, ParameterConfig config) {
|
private void handleAssertion(HashTree tree, MsAssertionConfig assertionConfig, ParameterConfig config) {
|
||||||
// todo 开关默认开启,关闭则运行该接口时不执行全局前置
|
// todo 开关默认开启,关闭则运行该接口时不执行全局前置
|
||||||
// assertionConfig.getEnableGlobal();
|
// assertionConfig.getEnableGlobal();
|
||||||
|
@ -56,19 +81,80 @@ public class MsCommonElementConverter extends AbstractJmeterElementConverter<MsC
|
||||||
.forEach(assertion -> AssertionConverterFactory.getConverter(assertion.getClass()).parse(tree, assertion, config, finalIsIgnoreStatus));
|
.forEach(assertion -> AssertionConverterFactory.getConverter(assertion.getClass()).parse(tree, assertion, config, finalIsIgnoreStatus));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handlePreProcessor(HashTree tree, MsProcessorConfig preProcessorConfig, ParameterConfig config) {
|
private void addProcessors(HashTree tree, MsCommonElement msCommonElement, ParameterConfig config,
|
||||||
if (preProcessorConfig == null || preProcessorConfig.getProcessors() == null) {
|
EnvironmentInfoDTO envInfo, boolean isPre) {
|
||||||
|
MsProcessorConfig processorConfig = isPre ? msCommonElement.getPreProcessorConfig() : msCommonElement.getPostProcessorConfig();
|
||||||
|
if (processorConfig == null || processorConfig.getProcessors() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
preProcessorConfig.getProcessors()
|
AbstractMsTestElement parent = msCommonElement.getParent();
|
||||||
.forEach(processor -> MsProcessorConverterFactory.getPreConverter(processor.getClass()).parse(tree, processor, config));
|
String protocol = null;
|
||||||
|
if (parent instanceof MsHTTPElement) {
|
||||||
|
protocol = ApiConstants.HTTP_PROTOCOL;
|
||||||
|
} else {
|
||||||
|
if (config instanceof ApiParamConfig apiParamConfig) {
|
||||||
|
protocol = apiParamConfig.getTestElementClassProtocalMap().get(parent.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MsProcessor> beforeStepProcessors = new ArrayList<>(0);
|
||||||
|
List<MsProcessor> afterStepProcessors = new ArrayList<>(0);
|
||||||
|
|
||||||
|
// 开启全局前置才处理环境前置处理器
|
||||||
|
if (BooleanUtils.isTrue(processorConfig.getEnableGlobal()) && envInfo != null) {
|
||||||
|
EnvironmentConfig envConfig = envInfo.getConfig();
|
||||||
|
EnvProcessorConfig envProcessorConfig = isPre ? envConfig.getPreProcessorConfig() : envConfig.getPostProcessorConfig();
|
||||||
|
addEnvProcessors(envProcessorConfig, beforeStepProcessors, afterStepProcessors, protocol, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Function<Class<?>, MsProcessorConverter<MsProcessor>> getConverterFunc =
|
||||||
|
isPre ? MsProcessorConverterFactory::getPreConverter : MsProcessorConverterFactory::getPostConverter;
|
||||||
|
|
||||||
|
// 处理环境中,步骤前处理器
|
||||||
|
beforeStepProcessors.forEach(processor ->
|
||||||
|
getConverterFunc.apply(processor.getClass()).parse(tree, processor, config));
|
||||||
|
|
||||||
|
processorConfig.getProcessors()
|
||||||
|
.forEach(processor -> getConverterFunc.apply(processor.getClass()).parse(tree, processor, config));
|
||||||
|
|
||||||
|
// 处理环境中,步骤后处理器
|
||||||
|
afterStepProcessors.forEach(processor ->
|
||||||
|
getConverterFunc.apply(processor.getClass()).parse(tree, processor, config));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handlePostProcessor(HashTree tree, MsProcessorConfig postProcessorConfig , ParameterConfig config) {
|
private void addEnvProcessors(EnvProcessorConfig envProcessorConfig,
|
||||||
if (postProcessorConfig == null || postProcessorConfig.getProcessors() == null) {
|
List<MsProcessor> beforeStepProcessors,
|
||||||
return;
|
List<MsProcessor> afterStepProcessors,
|
||||||
|
String protocol,
|
||||||
|
boolean isPre) {
|
||||||
|
// 获取环境中的前后置处理器
|
||||||
|
ApiEnvProcessorConfig apiProcessorConfig = envProcessorConfig.getApiProcessorConfig();
|
||||||
|
ApiEnvRequestProcessorConfig requestProcessorConfig = apiProcessorConfig.getRequestProcessorConfig();
|
||||||
|
List<MsProcessor> processors = requestProcessorConfig.getProcessors();
|
||||||
|
|
||||||
|
for (MsProcessor processor : processors) {
|
||||||
|
if (processor instanceof EnvRequestScriptProcessor requestScriptProcessor) {
|
||||||
|
// 如果是脚本处理器,处理步骤内前置脚本前后配置,以及忽略的协议
|
||||||
|
Boolean beforeStepScript = requestScriptProcessor.getBeforeStepScript();
|
||||||
|
List<String> ignoreProtocols = requestScriptProcessor.getIgnoreProtocols();
|
||||||
|
if (ignoreProtocols.contains(protocol)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (BooleanUtils.isTrue(beforeStepScript)) {
|
||||||
|
beforeStepProcessors.add(processor);
|
||||||
|
} else {
|
||||||
|
afterStepProcessors.add(processor);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 其他处理器
|
||||||
|
if (isPre) {
|
||||||
|
// 如果是前置,则在前置处理器之前执行
|
||||||
|
beforeStepProcessors.add(processor);
|
||||||
|
} else {
|
||||||
|
// 如果是后置,则在后置处理器之后执行
|
||||||
|
afterStepProcessors.add(processor);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
postProcessorConfig.getProcessors()
|
|
||||||
.forEach(processor -> MsProcessorConverterFactory.getPostConverter(processor.getClass()).parse(tree, processor, config));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,34 @@
|
||||||
package io.metersphere.api.parser.jmeter;
|
package io.metersphere.api.parser.jmeter;
|
||||||
|
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiScenarioStepRefType;
|
||||||
import io.metersphere.api.dto.ApiScenarioParamConfig;
|
import io.metersphere.api.dto.ApiScenarioParamConfig;
|
||||||
import io.metersphere.api.dto.request.MsScenario;
|
import io.metersphere.api.dto.request.MsScenario;
|
||||||
|
import io.metersphere.api.dto.request.processors.MsProcessorConfig;
|
||||||
|
import io.metersphere.api.dto.scenario.ScenarioConfig;
|
||||||
import io.metersphere.api.dto.scenario.ScenarioStepConfig;
|
import io.metersphere.api.dto.scenario.ScenarioStepConfig;
|
||||||
|
import io.metersphere.api.parser.jmeter.processor.MsProcessorConverter;
|
||||||
|
import io.metersphere.api.parser.jmeter.processor.MsProcessorConverterFactory;
|
||||||
import io.metersphere.plugin.api.dto.ParameterConfig;
|
import io.metersphere.plugin.api.dto.ParameterConfig;
|
||||||
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
||||||
|
import io.metersphere.project.api.processor.MsProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.EnvironmentConfig;
|
||||||
import io.metersphere.project.dto.environment.EnvironmentInfoDTO;
|
import io.metersphere.project.dto.environment.EnvironmentInfoDTO;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvProcessorConfig;
|
||||||
import io.metersphere.sdk.util.BeanUtils;
|
import io.metersphere.sdk.util.BeanUtils;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.jorphan.collections.HashTree;
|
import org.apache.jorphan.collections.HashTree;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: jianxing
|
* @Author: jianxing
|
||||||
* @CreateTime: 2023-10-27 10:07
|
* @CreateTime: 2023-10-27 10:07
|
||||||
*
|
* <p>
|
||||||
* 脚本解析器
|
* 脚本解析器
|
||||||
*/
|
*/
|
||||||
public class MsScenarioConverter extends AbstractJmeterElementConverter<MsScenario> {
|
public class MsScenarioConverter extends AbstractJmeterElementConverter<MsScenario> {
|
||||||
|
@ -24,26 +36,127 @@ public class MsScenarioConverter extends AbstractJmeterElementConverter<MsScenar
|
||||||
@Override
|
@Override
|
||||||
public void toHashTree(HashTree tree, MsScenario msScenario, ParameterConfig msParameter) {
|
public void toHashTree(HashTree tree, MsScenario msScenario, ParameterConfig msParameter) {
|
||||||
ApiScenarioParamConfig config = (ApiScenarioParamConfig) msParameter;
|
ApiScenarioParamConfig config = (ApiScenarioParamConfig) msParameter;
|
||||||
|
EnvironmentInfoDTO envInfo = config.getEnvConfig(msScenario.getProjectId());
|
||||||
|
|
||||||
|
// 添加环境的前置
|
||||||
|
addEnvScenarioProcessor(tree, msScenario, config, envInfo, true);
|
||||||
|
// 添加场景前置
|
||||||
|
addScenarioProcessor(tree, msScenario, config, true);
|
||||||
|
|
||||||
ApiScenarioParamConfig chileConfig = getChileConfig(msScenario, config);
|
ApiScenarioParamConfig chileConfig = getChileConfig(msScenario, config);
|
||||||
|
|
||||||
parseChild(tree, msScenario, chileConfig);
|
parseChild(tree, msScenario, chileConfig);
|
||||||
|
|
||||||
|
// 添加场景后置
|
||||||
|
addScenarioProcessor(tree, msScenario, config, false);
|
||||||
|
// 添加环境的后置
|
||||||
|
addEnvScenarioProcessor(tree, msScenario, config, envInfo, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加环境的前后置
|
||||||
|
*
|
||||||
|
* @param tree
|
||||||
|
* @param msScenario
|
||||||
|
* @param config
|
||||||
|
* @param envInfo
|
||||||
|
* @param isPre
|
||||||
|
*/
|
||||||
|
private void addEnvScenarioProcessor(HashTree tree,
|
||||||
|
MsScenario msScenario,
|
||||||
|
ApiScenarioParamConfig config,
|
||||||
|
EnvironmentInfoDTO envInfo,
|
||||||
|
boolean isPre) {
|
||||||
|
|
||||||
|
if (isRef(msScenario.getRefType())) {
|
||||||
|
ScenarioStepConfig scenarioStepConfig = msScenario.getScenarioStepConfig();
|
||||||
|
if (scenarioStepConfig == null || BooleanUtils.isFalse(scenarioStepConfig.getEnableScenarioEnv())) {
|
||||||
|
// 引用的场景,如果没有开启源场景环境,不添加环境的前后置
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (isCopy(msScenario.getRefType())) {
|
||||||
|
// 复制场景,不添加环境的前后置
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// 当前场景,添加环境的前后置
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ScenarioConfig scenarioConfig = msScenario.getScenarioConfig();
|
||||||
|
MsProcessorConfig scenarioProcessorConfig = isPre ? scenarioConfig.getPreProcessorConfig() : scenarioConfig.getPostProcessorConfig();
|
||||||
|
Boolean enableGlobal = scenarioProcessorConfig.getEnableGlobal();
|
||||||
|
if (BooleanUtils.isFalse(enableGlobal) || envInfo == null) {
|
||||||
|
// 如果场景配置没有开启全局前置,不添加环境的前后置
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取环境中的场景级前后置
|
||||||
|
EnvironmentConfig envConfig = envInfo.getConfig();
|
||||||
|
EnvProcessorConfig processorConfig = isPre ? envConfig.getPreProcessorConfig() : envConfig.getPostProcessorConfig();
|
||||||
|
List<MsProcessor> envScenarioProcessors = processorConfig.getApiProcessorConfig()
|
||||||
|
.getScenarioProcessorConfig()
|
||||||
|
.getProcessors();
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(envScenarioProcessors)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Function<Class<?>, MsProcessorConverter<MsProcessor>> getConverterFunc =
|
||||||
|
isPre ? MsProcessorConverterFactory::getPreConverter : MsProcessorConverterFactory::getPostConverter;
|
||||||
|
|
||||||
|
// 添加前后置
|
||||||
|
envScenarioProcessors.forEach(processor ->
|
||||||
|
getConverterFunc.apply(processor.getClass()).parse(tree, processor, config));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addScenarioProcessor(HashTree tree, MsScenario msScenario, ParameterConfig config, boolean isPre) {
|
||||||
|
if (isCopy(msScenario.getRefType())) {
|
||||||
|
// 复制的场景,没有前后置
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 获取场景前后置
|
||||||
|
ScenarioConfig scenarioConfig = msScenario.getScenarioConfig();
|
||||||
|
MsProcessorConfig processorConfig = isPre ? scenarioConfig.getPreProcessorConfig() : scenarioConfig.getPostProcessorConfig();
|
||||||
|
List<MsProcessor> scenarioPreProcessors = processorConfig.getProcessors();
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(scenarioPreProcessors)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Function<Class<?>, MsProcessorConverter<MsProcessor>> getConverterFunc =
|
||||||
|
isPre ? MsProcessorConverterFactory::getPreConverter : MsProcessorConverterFactory::getPostConverter;
|
||||||
|
|
||||||
|
// 添加场景前置处理器
|
||||||
|
scenarioPreProcessors.forEach(processor ->
|
||||||
|
getConverterFunc.apply(processor.getClass()).parse(tree, processor, config));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRef(String refType) {
|
||||||
|
return StringUtils.equalsAny(refType, ApiScenarioStepRefType.REF.name(), ApiScenarioStepRefType.PARTIAL_REF.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCopy(String refType) {
|
||||||
|
return StringUtils.equals(refType, ApiScenarioStepRefType.COPY.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取子步骤的配置信息
|
* 获取子步骤的配置信息
|
||||||
* 如果使用源场景环境,则使用当前场景的环境信息
|
* 如果使用源场景环境,则使用当前场景的环境信息
|
||||||
|
*
|
||||||
* @param msScenario
|
* @param msScenario
|
||||||
* @param config
|
* @param config
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private ApiScenarioParamConfig getChileConfig(MsScenario msScenario, ApiScenarioParamConfig config) {
|
private ApiScenarioParamConfig getChileConfig(MsScenario msScenario, ApiScenarioParamConfig config) {
|
||||||
|
if (!isRef(msScenario.getRefType())) {
|
||||||
|
// 非引用的场景,使用当前环境参数
|
||||||
|
return config;
|
||||||
|
}
|
||||||
ScenarioStepConfig scenarioStepConfig = msScenario.getScenarioStepConfig();
|
ScenarioStepConfig scenarioStepConfig = msScenario.getScenarioStepConfig();
|
||||||
if (scenarioStepConfig != null && BooleanUtils.isTrue(scenarioStepConfig.getEnableScenarioEnv())) {
|
if (scenarioStepConfig != null && BooleanUtils.isTrue(scenarioStepConfig.getEnableScenarioEnv())) {
|
||||||
// 使用源场景环境
|
// 使用源场景环境
|
||||||
ApiScenarioParamConfig chileConfig = BeanUtils.copyBean(new ApiScenarioParamConfig(), config);
|
ApiScenarioParamConfig chileConfig = BeanUtils.copyBean(new ApiScenarioParamConfig(), config);
|
||||||
chileConfig.setGrouped(msScenario.getGrouped());
|
chileConfig.setGrouped(msScenario.getGrouped());
|
||||||
|
// 清空环境信息
|
||||||
chileConfig.setEnvConfig(null);
|
chileConfig.setEnvConfig(null);
|
||||||
chileConfig.setProjectEnvMap(null);
|
chileConfig.setProjectEnvMap(null);
|
||||||
if (BooleanUtils.isTrue(msScenario.getGrouped())) {
|
if (BooleanUtils.isTrue(msScenario.getGrouped())) {
|
||||||
|
|
|
@ -4,6 +4,8 @@ import io.metersphere.project.api.processor.ExtractPostProcessor;
|
||||||
import io.metersphere.project.api.processor.SQLProcessor;
|
import io.metersphere.project.api.processor.SQLProcessor;
|
||||||
import io.metersphere.project.api.processor.ScriptProcessor;
|
import io.metersphere.project.api.processor.ScriptProcessor;
|
||||||
import io.metersphere.project.api.processor.TimeWaitingProcessor;
|
import io.metersphere.project.api.processor.TimeWaitingProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvRequestScriptProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvScenarioScriptProcessor;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -21,11 +23,15 @@ public class MsProcessorConverterFactory {
|
||||||
preConverterMap.put(ScriptProcessor.class, new ScriptPreProcessorConverter());
|
preConverterMap.put(ScriptProcessor.class, new ScriptPreProcessorConverter());
|
||||||
preConverterMap.put(SQLProcessor.class, new SqlPreProcessorConverter());
|
preConverterMap.put(SQLProcessor.class, new SqlPreProcessorConverter());
|
||||||
preConverterMap.put(TimeWaitingProcessor.class, new TimeWaitingProcessorConverter());
|
preConverterMap.put(TimeWaitingProcessor.class, new TimeWaitingProcessorConverter());
|
||||||
|
preConverterMap.put(EnvRequestScriptProcessor.class, new ScriptPreProcessorConverter());
|
||||||
|
preConverterMap.put(EnvScenarioScriptProcessor.class, new ScenarioScriptProcessorConverter());
|
||||||
|
|
||||||
postConverterMap.put(ScriptProcessor.class, new ScriptPostProcessorConverter());
|
postConverterMap.put(ScriptProcessor.class, new ScriptPostProcessorConverter());
|
||||||
postConverterMap.put(SQLProcessor.class, new SqlPostProcessorConverter());
|
postConverterMap.put(SQLProcessor.class, new SqlPostProcessorConverter());
|
||||||
postConverterMap.put(TimeWaitingProcessor.class, new TimeWaitingProcessorConverter());
|
postConverterMap.put(TimeWaitingProcessor.class, new TimeWaitingProcessorConverter());
|
||||||
postConverterMap.put(ExtractPostProcessor.class, new ExtractPostProcessorConverter());
|
postConverterMap.put(ExtractPostProcessor.class, new ExtractPostProcessorConverter());
|
||||||
|
postConverterMap.put(EnvRequestScriptProcessor.class, new ScriptPostProcessorConverter());
|
||||||
|
postConverterMap.put(EnvScenarioScriptProcessor.class, new ScenarioScriptProcessorConverter());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MsProcessorConverter getPreConverter(Class<?> processorClass) {
|
public static MsProcessorConverter getPreConverter(Class<?> processorClass) {
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package io.metersphere.api.parser.jmeter.processor;
|
||||||
|
|
||||||
|
import io.metersphere.plugin.api.dto.ParameterConfig;
|
||||||
|
import io.metersphere.project.api.processor.ScriptProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvScenarioScriptProcessor;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.BeanShellSampler;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.JSR223Sampler;
|
||||||
|
import org.apache.jmeter.testelement.TestElement;
|
||||||
|
import org.apache.jorphan.collections.HashTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 环境场景级前置处理器处理
|
||||||
|
*
|
||||||
|
* @Author: jianxing
|
||||||
|
* @CreateTime: 2023-12-26 14:49
|
||||||
|
*/
|
||||||
|
public class ScenarioScriptProcessorConverter extends ScriptProcessorConverter {
|
||||||
|
@Override
|
||||||
|
public void parse(HashTree hashTree, ScriptProcessor scriptProcessor, ParameterConfig config) {
|
||||||
|
if (!needParse(scriptProcessor, config) || !scriptProcessor.isValid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EnvScenarioScriptProcessor scenarioScriptProcessor = (EnvScenarioScriptProcessor) scriptProcessor;
|
||||||
|
Boolean associateScenarioResult = scenarioScriptProcessor.getAssociateScenarioResult();
|
||||||
|
|
||||||
|
TestElement processor;
|
||||||
|
if (isJSR233(scriptProcessor)) {
|
||||||
|
processor = new JSR223Sampler();
|
||||||
|
} else {
|
||||||
|
processor = new BeanShellSampler();
|
||||||
|
}
|
||||||
|
|
||||||
|
parse(processor, scriptProcessor);
|
||||||
|
// 标记当前处理器是否关联场景结果
|
||||||
|
processor.setName("ASSOCIATE_RESULT_PROCESSOR_" + associateScenarioResult);
|
||||||
|
hashTree.add(processor);
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,7 +14,7 @@ import org.apache.jorphan.collections.HashTree;
|
||||||
public class ScriptPostProcessorConverter extends ScriptProcessorConverter {
|
public class ScriptPostProcessorConverter extends ScriptProcessorConverter {
|
||||||
@Override
|
@Override
|
||||||
public void parse(HashTree hashTree, ScriptProcessor scriptProcessor, ParameterConfig config) {
|
public void parse(HashTree hashTree, ScriptProcessor scriptProcessor, ParameterConfig config) {
|
||||||
if (!needParse(scriptProcessor, config)) {
|
if (!needParse(scriptProcessor, config) || !scriptProcessor.isValid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// todo 处理公共脚本
|
// todo 处理公共脚本
|
||||||
|
|
|
@ -14,7 +14,7 @@ import org.apache.jorphan.collections.HashTree;
|
||||||
public class ScriptPreProcessorConverter extends ScriptProcessorConverter {
|
public class ScriptPreProcessorConverter extends ScriptProcessorConverter {
|
||||||
@Override
|
@Override
|
||||||
public void parse(HashTree hashTree, ScriptProcessor scriptProcessor, ParameterConfig config) {
|
public void parse(HashTree hashTree, ScriptProcessor scriptProcessor, ParameterConfig config) {
|
||||||
if (!needParse(scriptProcessor, config)) {
|
if (!needParse(scriptProcessor, config) || !scriptProcessor.isValid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// todo 处理公共脚本
|
// todo 处理公共脚本
|
||||||
|
|
|
@ -24,15 +24,11 @@ import io.metersphere.sdk.dto.api.task.ApiExecuteFileInfo;
|
||||||
import io.metersphere.sdk.dto.api.task.ApiRunModeConfigDTO;
|
import io.metersphere.sdk.dto.api.task.ApiRunModeConfigDTO;
|
||||||
import io.metersphere.sdk.dto.api.task.TaskRequestDTO;
|
import io.metersphere.sdk.dto.api.task.TaskRequestDTO;
|
||||||
import io.metersphere.sdk.exception.MSException;
|
import io.metersphere.sdk.exception.MSException;
|
||||||
import io.metersphere.sdk.util.BeanUtils;
|
import io.metersphere.sdk.util.*;
|
||||||
import io.metersphere.sdk.util.CommonBeanFactory;
|
|
||||||
import io.metersphere.sdk.util.EncryptUtils;
|
|
||||||
import io.metersphere.sdk.util.JSON;
|
|
||||||
import io.metersphere.sdk.util.LogUtils;
|
|
||||||
import io.metersphere.system.config.MinioProperties;
|
import io.metersphere.system.config.MinioProperties;
|
||||||
import io.metersphere.system.domain.TestResourcePool;
|
import io.metersphere.system.domain.TestResourcePool;
|
||||||
import io.metersphere.system.dto.pool.TestResourceDTO;
|
|
||||||
import io.metersphere.system.dto.pool.TestResourceNodeDTO;
|
import io.metersphere.system.dto.pool.TestResourceNodeDTO;
|
||||||
|
import io.metersphere.system.dto.pool.TestResourcePoolReturnDTO;
|
||||||
import io.metersphere.system.service.CommonProjectService;
|
import io.metersphere.system.service.CommonProjectService;
|
||||||
import io.metersphere.system.service.SystemParameterService;
|
import io.metersphere.system.service.SystemParameterService;
|
||||||
import io.metersphere.system.service.TestResourcePoolService;
|
import io.metersphere.system.service.TestResourcePoolService;
|
||||||
|
@ -134,9 +130,7 @@ public class ApiExecuteService {
|
||||||
// todo 接口用例 method 获取定义中的数据库字段
|
// todo 接口用例 method 获取定义中的数据库字段
|
||||||
String executeScript = parseExecuteScript(request.getTestElement(), parameterConfig);
|
String executeScript = parseExecuteScript(request.getTestElement(), parameterConfig);
|
||||||
|
|
||||||
TestResourceNodeDTO testResourceNodeDTO = getProjectExecuteNode(request.getProjectId());
|
doDebug(reportId, testId, taskRequest, executeScript, request.getProjectId());
|
||||||
|
|
||||||
doDebug(reportId, testId, taskRequest, executeScript, testResourceNodeDTO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -146,13 +140,21 @@ public class ApiExecuteService {
|
||||||
* @param testId 资源ID
|
* @param testId 资源ID
|
||||||
* @param taskRequest 执行参数
|
* @param taskRequest 执行参数
|
||||||
* @param executeScript 执行脚本
|
* @param executeScript 执行脚本
|
||||||
* @param testResourceNodeDTO 资源池
|
* @param projectId 项目ID
|
||||||
*/
|
*/
|
||||||
private void doDebug(String reportId,
|
private void doDebug(String reportId,
|
||||||
String testId,
|
String testId,
|
||||||
TaskRequestDTO taskRequest,
|
TaskRequestDTO taskRequest,
|
||||||
String executeScript,
|
String executeScript,
|
||||||
TestResourceNodeDTO testResourceNodeDTO) {
|
String projectId) {
|
||||||
|
|
||||||
|
TestResourcePoolReturnDTO testResourcePoolDTO = getGetResourcePoolNodeDTO(projectId);
|
||||||
|
TestResourceNodeDTO testResourceNodeDTO = getProjectExecuteNode(testResourcePoolDTO);
|
||||||
|
if (StringUtils.isNotBlank(testResourcePoolDTO.getServerUrl())) {
|
||||||
|
// 如果资源池配置了当前站点,则使用资源池的
|
||||||
|
taskRequest.setMsUrl(testResourcePoolDTO.getServerUrl());
|
||||||
|
}
|
||||||
|
|
||||||
// 将测试脚本缓存到 redis
|
// 将测试脚本缓存到 redis
|
||||||
String scriptRedisKey = getScriptRedisKey(reportId, testId);
|
String scriptRedisKey = getScriptRedisKey(reportId, testId);
|
||||||
stringRedisTemplate.opsForValue().set(scriptRedisKey, executeScript);
|
stringRedisTemplate.opsForValue().set(scriptRedisKey, executeScript);
|
||||||
|
@ -169,18 +171,21 @@ public class ApiExecuteService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private TestResourceNodeDTO getProjectExecuteNode(String projectId) {
|
private TestResourceNodeDTO getProjectExecuteNode(TestResourcePoolReturnDTO resourcePoolDTO) {
|
||||||
String resourcePoolId = getProjectApiResourcePoolId(projectId);
|
roundRobinService.initializeNodes(resourcePoolDTO.getId(), resourcePoolDTO.getTestResourceReturnDTO().getNodesList());
|
||||||
TestResourceDTO resourcePoolDTO = getAvailableResourcePoolDTO(projectId, resourcePoolId);
|
|
||||||
roundRobinService.initializeNodes(resourcePoolId, resourcePoolDTO.getNodesList());
|
|
||||||
try {
|
try {
|
||||||
return roundRobinService.getNextNode(resourcePoolId);
|
return roundRobinService.getNextNode(resourcePoolDTO.getId());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.error(e);
|
LogUtils.error(e);
|
||||||
throw new MSException("get execute node error", e);
|
throw new MSException("get execute node error", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private TestResourcePoolReturnDTO getGetResourcePoolNodeDTO(String projectId) {
|
||||||
|
String resourcePoolId = getProjectApiResourcePoolId(projectId);
|
||||||
|
return getAvailableResourcePoolDTO(projectId, resourcePoolId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置minio kafka ms 等信息
|
* 设置minio kafka ms 等信息
|
||||||
*
|
*
|
||||||
|
@ -216,9 +221,7 @@ public class ApiExecuteService {
|
||||||
apiRunModeConfig.setRunMode(ApiExecuteRunMode.BACKEND_DEBUG.name());
|
apiRunModeConfig.setRunMode(ApiExecuteRunMode.BACKEND_DEBUG.name());
|
||||||
taskRequest.setRunModeConfig(apiRunModeConfig);
|
taskRequest.setRunModeConfig(apiRunModeConfig);
|
||||||
|
|
||||||
TestResourceNodeDTO testResourceNodeDTO = getProjectExecuteNode(runRequest.getProjectId());
|
doDebug(reportId, testId, taskRequest, executeScript, runRequest.getProjectId());
|
||||||
|
|
||||||
doDebug(reportId, testId, taskRequest, executeScript, testResourceNodeDTO);
|
|
||||||
return reportId;
|
return reportId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +339,7 @@ public class ApiExecuteService {
|
||||||
* @param projectId 项目ID
|
* @param projectId 项目ID
|
||||||
* @param resourcePoolId 资源池ID
|
* @param resourcePoolId 资源池ID
|
||||||
*/
|
*/
|
||||||
public TestResourceDTO getAvailableResourcePoolDTO(String projectId, String resourcePoolId) {
|
public TestResourcePoolReturnDTO getAvailableResourcePoolDTO(String projectId, String resourcePoolId) {
|
||||||
TestResourcePool testResourcePool = testResourcePoolService.getTestResourcePool(resourcePoolId);
|
TestResourcePool testResourcePool = testResourcePoolService.getTestResourcePool(resourcePoolId);
|
||||||
if (testResourcePool == null ||
|
if (testResourcePool == null ||
|
||||||
// 资源池禁用
|
// 资源池禁用
|
||||||
|
@ -345,7 +348,7 @@ public class ApiExecuteService {
|
||||||
!commonProjectService.validateProjectResourcePool(testResourcePool, projectId)) {
|
!commonProjectService.validateProjectResourcePool(testResourcePool, projectId)) {
|
||||||
throw new MSException(ApiResultCode.EXECUTE_RESOURCE_POOL_NOT_CONFIG);
|
throw new MSException(ApiResultCode.EXECUTE_RESOURCE_POOL_NOT_CONFIG);
|
||||||
}
|
}
|
||||||
return testResourcePoolService.getTestResourceDTO(resourcePoolId);
|
return testResourcePoolService.getTestResourcePoolDetail(resourcePoolId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getProjectApiResourcePoolId(String projectId) {
|
private String getProjectApiResourcePoolId(String projectId) {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.service;
|
package io.metersphere.api.service;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.dto.ApiTestPluginOptionRequest;
|
import io.metersphere.api.dto.ApiTestPluginOptionRequest;
|
||||||
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
||||||
import io.metersphere.plugin.api.dto.ApiPluginOptionsRequest;
|
import io.metersphere.plugin.api.dto.ApiPluginOptionsRequest;
|
||||||
|
@ -25,7 +26,6 @@ import java.util.List;
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public class ApiTestService {
|
public class ApiTestService {
|
||||||
|
|
||||||
private static final String HTTP_PROTOCOL = "HTTP";
|
|
||||||
@Resource
|
@Resource
|
||||||
private ApiPluginService apiPluginService;
|
private ApiPluginService apiPluginService;
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class ApiTestService {
|
||||||
List<ProtocolDTO> protocols = apiPluginService.getProtocols(orgId);
|
List<ProtocolDTO> protocols = apiPluginService.getProtocols(orgId);
|
||||||
// 将 http 协议放最前面
|
// 将 http 协议放最前面
|
||||||
ProtocolDTO protocolDTO = new ProtocolDTO();
|
ProtocolDTO protocolDTO = new ProtocolDTO();
|
||||||
protocolDTO.setProtocol(HTTP_PROTOCOL);
|
protocolDTO.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
protocolDTO.setPolymorphicName(MsHTTPElement.class.getSimpleName());
|
protocolDTO.setPolymorphicName(MsHTTPElement.class.getSimpleName());
|
||||||
protocols.addFirst(protocolDTO);
|
protocols.addFirst(protocolDTO);
|
||||||
return protocols;
|
return protocols;
|
||||||
|
|
|
@ -197,10 +197,9 @@ public class ApiDebugService {
|
||||||
|
|
||||||
public String debug(ApiDebugRunRequest request) {
|
public String debug(ApiDebugRunRequest request) {
|
||||||
String id = request.getId();
|
String id = request.getId();
|
||||||
ApiDebug apiDebug = checkResourceExist(id);
|
|
||||||
|
|
||||||
ApiResourceRunRequest runRequest = BeanUtils.copyBean(new ApiResourceRunRequest(), request);
|
ApiResourceRunRequest runRequest = BeanUtils.copyBean(new ApiResourceRunRequest(), request);
|
||||||
runRequest.setProjectId(apiDebug.getProjectId());
|
runRequest.setProjectId(request.getProjectId());
|
||||||
runRequest.setTestId(id);
|
runRequest.setTestId(id);
|
||||||
runRequest.setReportId(id);
|
runRequest.setReportId(id);
|
||||||
runRequest.setResourceType(ApiResourceType.API_DEBUG.name());
|
runRequest.setResourceType(ApiResourceType.API_DEBUG.name());
|
||||||
|
|
|
@ -1041,6 +1041,7 @@ public class ApiScenarioService {
|
||||||
MsScenario msScenario = new MsScenario();
|
MsScenario msScenario = new MsScenario();
|
||||||
msScenario.setRefType(ApiScenarioStepRefType.DIRECT.name());
|
msScenario.setRefType(ApiScenarioStepRefType.DIRECT.name());
|
||||||
msScenario.setScenarioConfig(getScenarioConfig(request, hasSave));
|
msScenario.setScenarioConfig(getScenarioConfig(request, hasSave));
|
||||||
|
msScenario.setProjectId(request.getProjectId());
|
||||||
|
|
||||||
// 获取场景环境相关配置
|
// 获取场景环境相关配置
|
||||||
ApiScenarioParseEnvInfo scenarioParseEnvInfo = getScenarioParseEnvInfo(refResourceMap, request.getEnvironmentId(), request.getGrouped());
|
ApiScenarioParseEnvInfo scenarioParseEnvInfo = getScenarioParseEnvInfo(refResourceMap, request.getEnvironmentId(), request.getGrouped());
|
||||||
|
@ -1059,6 +1060,7 @@ public class ApiScenarioService {
|
||||||
|
|
||||||
ApiScenarioParamConfig parseConfig = new ApiScenarioParamConfig();
|
ApiScenarioParamConfig parseConfig = new ApiScenarioParamConfig();
|
||||||
parseConfig.setTestElementClassPluginIdMap(apiPluginService.getTestElementPluginMap());
|
parseConfig.setTestElementClassPluginIdMap(apiPluginService.getTestElementPluginMap());
|
||||||
|
parseConfig.setTestElementClassProtocalMap(apiPluginService.getTestElementProtocolMap());
|
||||||
parseConfig.setGrouped(request.getGrouped());
|
parseConfig.setGrouped(request.getGrouped());
|
||||||
parseConfig.setReportId(request.getReportId());
|
parseConfig.setReportId(request.getReportId());
|
||||||
scenarioParseEnvInfo.getPluginClassEnvConfigMap();
|
scenarioParseEnvInfo.getPluginClassEnvConfigMap();
|
||||||
|
@ -1156,6 +1158,7 @@ public class ApiScenarioService {
|
||||||
// 将步骤详情解析生成对应的MsTestElement
|
// 将步骤详情解析生成对应的MsTestElement
|
||||||
AbstractMsTestElement msTestElement = stepParser.parseTestElement(step, resourceBlobMap.get(step.getResourceId()), stepDetailMap.get(step.getId()));
|
AbstractMsTestElement msTestElement = stepParser.parseTestElement(step, resourceBlobMap.get(step.getResourceId()), stepDetailMap.get(step.getId()));
|
||||||
if (msTestElement != null) {
|
if (msTestElement != null) {
|
||||||
|
msTestElement.setProjectId(step.getProjectId());
|
||||||
setMsScenarioParam(scenarioParseEnvInfo, step, msTestElement);
|
setMsScenarioParam(scenarioParseEnvInfo, step, msTestElement);
|
||||||
parentElement.getChildren().add(msTestElement);
|
parentElement.getChildren().add(msTestElement);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.controller.result.ApiResultCode;
|
import io.metersphere.api.controller.result.ApiResultCode;
|
||||||
import io.metersphere.api.domain.ApiDebug;
|
import io.metersphere.api.domain.ApiDebug;
|
||||||
import io.metersphere.api.domain.ApiDebugBlob;
|
import io.metersphere.api.domain.ApiDebugBlob;
|
||||||
|
@ -60,7 +61,6 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
protected static final String DEFAULT_LIST = "list/{0}";
|
protected static final String DEFAULT_LIST = "list/{0}";
|
||||||
protected static final String UPLOAD_TEMP_FILE = "upload/temp/file";
|
protected static final String UPLOAD_TEMP_FILE = "upload/temp/file";
|
||||||
protected static final String DEBUG = "debug";
|
protected static final String DEBUG = "debug";
|
||||||
protected static final String HTTP_PROTOCOL = "HTTP";
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ApiDebugMapper apiDebugMapper;
|
private ApiDebugMapper apiDebugMapper;
|
||||||
|
@ -86,7 +86,7 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
@Order(0)
|
@Order(0)
|
||||||
public void listEmpty() throws Exception {
|
public void listEmpty() throws Exception {
|
||||||
// @@校验没有数据的情况
|
// @@校验没有数据的情况
|
||||||
this.requestGetWithOk(DEFAULT_LIST, HTTP_PROTOCOL);
|
this.requestGetWithOk(DEFAULT_LIST, ApiConstants.HTTP_PROTOCOL);
|
||||||
// 准备数据,上传文件管理文件
|
// 准备数据,上传文件管理文件
|
||||||
uploadFileMetadata();
|
uploadFileMetadata();
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
request.setPath("http://test.com");
|
request.setPath("http://test.com");
|
||||||
request.setMethod("GET");
|
request.setMethod("GET");
|
||||||
request.setName("test");
|
request.setName("test");
|
||||||
request.setProtocol(HTTP_PROTOCOL);
|
request.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
request.setModuleId("default");
|
request.setModuleId("default");
|
||||||
request.setProjectId(DEFAULT_PROJECT_ID);
|
request.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
MsHTTPElement msHttpElement = MsHTTPElementTest.getMsHttpElement();
|
MsHTTPElement msHttpElement = MsHTTPElementTest.getMsHttpElement();
|
||||||
|
@ -320,7 +320,7 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
@Order(4)
|
@Order(4)
|
||||||
public void list() throws Exception {
|
public void list() throws Exception {
|
||||||
// @@请求成功
|
// @@请求成功
|
||||||
MvcResult mvcResult = this.requestGetWithOk(DEFAULT_LIST, HTTP_PROTOCOL)
|
MvcResult mvcResult = this.requestGetWithOk(DEFAULT_LIST, ApiConstants.HTTP_PROTOCOL)
|
||||||
.andReturn();
|
.andReturn();
|
||||||
// 校验数据是否正确
|
// 校验数据是否正确
|
||||||
List<ApiDebugSimpleDTO> apiDebugList = getResultDataArray(mvcResult, ApiDebugSimpleDTO.class);
|
List<ApiDebugSimpleDTO> apiDebugList = getResultDataArray(mvcResult, ApiDebugSimpleDTO.class);
|
||||||
|
@ -331,7 +331,7 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
BeanUtils.copyBean(new ApiDebugSimpleDTO(), apiDebugMapper.selectByPrimaryKey(anotherAddApiDebug.getId())));
|
BeanUtils.copyBean(new ApiDebugSimpleDTO(), apiDebugMapper.selectByPrimaryKey(anotherAddApiDebug.getId())));
|
||||||
|
|
||||||
// @@校验权限
|
// @@校验权限
|
||||||
requestGetPermissionTest(PermissionConstants.PROJECT_API_DEBUG_READ, DEFAULT_LIST, HTTP_PROTOCOL);
|
requestGetPermissionTest(PermissionConstants.PROJECT_API_DEBUG_READ, DEFAULT_LIST, ApiConstants.HTTP_PROTOCOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -362,6 +362,7 @@ public class ApiDebugControllerTests extends BaseTest {
|
||||||
msHTTPElement.setMethod("GET");
|
msHTTPElement.setMethod("GET");
|
||||||
request.setRequest(JSON.parseObject(ApiDataUtils.toJSONString(msHTTPElement)));
|
request.setRequest(JSON.parseObject(ApiDataUtils.toJSONString(msHTTPElement)));
|
||||||
request.setReportId(IDGenerator.nextStr());
|
request.setReportId(IDGenerator.nextStr());
|
||||||
|
request.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
|
|
||||||
// @校验组织没有资源池权限异常
|
// @校验组织没有资源池权限异常
|
||||||
assertErrorCode(this.requestPost(DEBUG, request), ApiResultCode.EXECUTE_RESOURCE_POOL_NOT_CONFIG);
|
assertErrorCode(this.requestPost(DEBUG, request), ApiResultCode.EXECUTE_RESOURCE_POOL_NOT_CONFIG);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.domain.*;
|
import io.metersphere.api.domain.*;
|
||||||
import io.metersphere.api.dto.debug.ApiDebugRequest;
|
import io.metersphere.api.dto.debug.ApiDebugRequest;
|
||||||
import io.metersphere.api.dto.debug.ModuleCreateRequest;
|
import io.metersphere.api.dto.debug.ModuleCreateRequest;
|
||||||
|
@ -114,7 +115,7 @@ public class ApiDebugModuleControllerTests extends BaseTest {
|
||||||
apiDebug.setProjectId(project.getId());
|
apiDebug.setProjectId(project.getId());
|
||||||
apiDebug.setName(StringUtils.join("接口调试", apiDebug.getId()));
|
apiDebug.setName(StringUtils.join("接口调试", apiDebug.getId()));
|
||||||
apiDebug.setModuleId(moduleId);
|
apiDebug.setModuleId(moduleId);
|
||||||
apiDebug.setProtocol("HTTP");
|
apiDebug.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDebug.setMethod("GET");
|
apiDebug.setMethod("GET");
|
||||||
apiDebug.setPath(StringUtils.join("api/debug/", apiDebug.getId()));
|
apiDebug.setPath(StringUtils.join("api/debug/", apiDebug.getId()));
|
||||||
apiDebug.setCreateTime(System.currentTimeMillis());
|
apiDebug.setCreateTime(System.currentTimeMillis());
|
||||||
|
@ -748,7 +749,7 @@ public class ApiDebugModuleControllerTests extends BaseTest {
|
||||||
public void TestModuleCountSuccess() throws Exception {
|
public void TestModuleCountSuccess() throws Exception {
|
||||||
this.preliminaryData();
|
this.preliminaryData();
|
||||||
ApiDebugRequest request = new ApiDebugRequest() {{
|
ApiDebugRequest request = new ApiDebugRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
}};
|
}};
|
||||||
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_FILE_MODULE_COUNT, request);
|
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_FILE_MODULE_COUNT, request);
|
||||||
Map<String, Integer> moduleCountResult = JSON.parseObject(JSON.toJSONString(
|
Map<String, Integer> moduleCountResult = JSON.parseObject(JSON.toJSONString(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.constants.ApiDefinitionDocType;
|
import io.metersphere.api.constants.ApiDefinitionDocType;
|
||||||
import io.metersphere.api.constants.ApiDefinitionStatus;
|
import io.metersphere.api.constants.ApiDefinitionStatus;
|
||||||
import io.metersphere.api.controller.result.ApiResultCode;
|
import io.metersphere.api.controller.result.ApiResultCode;
|
||||||
|
@ -238,7 +239,7 @@ public class ApiDefinitionControllerTests extends BaseTest {
|
||||||
String defaultVersion = extBaseProjectVersionMapper.getDefaultVersion(DEFAULT_PROJECT_ID);
|
String defaultVersion = extBaseProjectVersionMapper.getDefaultVersion(DEFAULT_PROJECT_ID);
|
||||||
ApiDefinitionAddRequest request = new ApiDefinitionAddRequest();
|
ApiDefinitionAddRequest request = new ApiDefinitionAddRequest();
|
||||||
request.setName("接口定义test");
|
request.setName("接口定义test");
|
||||||
request.setProtocol("HTTP");
|
request.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
request.setProjectId(DEFAULT_PROJECT_ID);
|
request.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
request.setMethod("POST");
|
request.setMethod("POST");
|
||||||
request.setPath("/api/admin/posts");
|
request.setPath("/api/admin/posts");
|
||||||
|
@ -404,7 +405,7 @@ public class ApiDefinitionControllerTests extends BaseTest {
|
||||||
//校验修改path和method时,是否会影响用例
|
//校验修改path和method时,是否会影响用例
|
||||||
ApiDefinitionAddRequest addRequest = new ApiDefinitionAddRequest();
|
ApiDefinitionAddRequest addRequest = new ApiDefinitionAddRequest();
|
||||||
addRequest.setName("测试修改path和method");
|
addRequest.setName("测试修改path和method");
|
||||||
addRequest.setProtocol("HTTP");
|
addRequest.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
addRequest.setProjectId(DEFAULT_PROJECT_ID);
|
addRequest.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
addRequest.setMethod("POST");
|
addRequest.setMethod("POST");
|
||||||
addRequest.setPath("/api/admin/posts");
|
addRequest.setPath("/api/admin/posts");
|
||||||
|
@ -1400,7 +1401,7 @@ public class ApiDefinitionControllerTests extends BaseTest {
|
||||||
request.setCoverData(true);
|
request.setCoverData(true);
|
||||||
request.setCoverModule(true);
|
request.setCoverModule(true);
|
||||||
request.setModuleId(apiDefinitionModule.getId());
|
request.setModuleId(apiDefinitionModule.getId());
|
||||||
request.setProtocol("HTTP");
|
request.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
request.setUserId("admin");
|
request.setUserId("admin");
|
||||||
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
|
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
|
||||||
paramMap.add("request", JSON.toJSONString(request));
|
paramMap.add("request", JSON.toJSONString(request));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.domain.*;
|
import io.metersphere.api.domain.*;
|
||||||
import io.metersphere.api.dto.debug.ApiDebugRequest;
|
import io.metersphere.api.dto.debug.ApiDebugRequest;
|
||||||
import io.metersphere.api.dto.debug.ModuleCreateRequest;
|
import io.metersphere.api.dto.debug.ModuleCreateRequest;
|
||||||
|
@ -134,7 +135,7 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
|
||||||
apiDefinition.setProjectId(project.getId());
|
apiDefinition.setProjectId(project.getId());
|
||||||
apiDefinition.setName(StringUtils.join("接口定义", apiDefinition.getId()));
|
apiDefinition.setName(StringUtils.join("接口定义", apiDefinition.getId()));
|
||||||
apiDefinition.setModuleId(moduleId);
|
apiDefinition.setModuleId(moduleId);
|
||||||
apiDefinition.setProtocol("HTTP");
|
apiDefinition.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDefinition.setMethod("GET");
|
apiDefinition.setMethod("GET");
|
||||||
apiDefinition.setStatus("未规划");
|
apiDefinition.setStatus("未规划");
|
||||||
apiDefinition.setNum(NumGenerator.nextNum(project.getId(), ApplicationNumScope.API_DEFINITION));
|
apiDefinition.setNum(NumGenerator.nextNum(project.getId(), ApplicationNumScope.API_DEFINITION));
|
||||||
|
@ -811,7 +812,7 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
|
||||||
public void TestModuleCountSuccess() throws Exception {
|
public void TestModuleCountSuccess() throws Exception {
|
||||||
this.preliminaryData();
|
this.preliminaryData();
|
||||||
ApiModuleRequest request = new ApiModuleRequest() {{
|
ApiModuleRequest request = new ApiModuleRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
this.setProjectId(project.getId());
|
this.setProjectId(project.getId());
|
||||||
}};
|
}};
|
||||||
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_FILE_MODULE_COUNT, request);
|
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_FILE_MODULE_COUNT, request);
|
||||||
|
@ -876,7 +877,7 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
|
||||||
apiDefinition.setDeleted(true);
|
apiDefinition.setDeleted(true);
|
||||||
apiDefinitionMapper.updateByExampleSelective(apiDefinition, example);
|
apiDefinitionMapper.updateByExampleSelective(apiDefinition, example);
|
||||||
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_TREE, new ApiModuleRequest() {{
|
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_TREE, new ApiModuleRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
this.setProjectId(project.getId());
|
this.setProjectId(project.getId());
|
||||||
}});
|
}});
|
||||||
|
|
||||||
|
@ -889,7 +890,7 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
|
||||||
@Order(12)
|
@Order(12)
|
||||||
public void getModuleTrashTreeCount() throws Exception {
|
public void getModuleTrashTreeCount() throws Exception {
|
||||||
ApiModuleRequest request = new ApiModuleRequest() {{
|
ApiModuleRequest request = new ApiModuleRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
this.setProjectId(project.getId());
|
this.setProjectId(project.getId());
|
||||||
}};
|
}};
|
||||||
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_COUNT, request);
|
MvcResult moduleCountMvcResult = this.requestPostWithOkAndReturn(URL_MODULE_TRASH_COUNT, request);
|
||||||
|
@ -951,11 +952,11 @@ public class ApiDefinitionModuleControllerTests extends BaseTest {
|
||||||
|
|
||||||
private List<BaseTreeNode> getModuleTreeNode() throws Exception {
|
private List<BaseTreeNode> getModuleTreeNode() throws Exception {
|
||||||
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TREE, new ApiModuleRequest() {{
|
MvcResult result = this.requestPostWithOkAndReturn(URL_MODULE_TREE, new ApiModuleRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
this.setProjectId(project.getId());
|
this.setProjectId(project.getId());
|
||||||
}});
|
}});
|
||||||
this.requestPostWithOkAndReturn(URL_MODULE_ONLY_TREE, new ApiModuleRequest() {{
|
this.requestPostWithOkAndReturn(URL_MODULE_ONLY_TREE, new ApiModuleRequest() {{
|
||||||
this.setProtocol("HTTP");
|
this.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
this.setProjectId(project.getId());
|
this.setProjectId(project.getId());
|
||||||
}});
|
}});
|
||||||
String returnData = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
|
String returnData = result.getResponse().getContentAsString(StandardCharsets.UTF_8);
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
import io.metersphere.api.constants.ApiDefinitionStatus;
|
import io.metersphere.api.constants.*;
|
||||||
import io.metersphere.api.constants.ApiScenarioStatus;
|
|
||||||
import io.metersphere.api.constants.ApiScenarioStepRefType;
|
|
||||||
import io.metersphere.api.constants.ApiScenarioStepType;
|
|
||||||
import io.metersphere.api.domain.*;
|
import io.metersphere.api.domain.*;
|
||||||
import io.metersphere.api.dto.assertion.MsAssertionConfig;
|
|
||||||
import io.metersphere.api.dto.definition.ApiDefinitionAddRequest;
|
import io.metersphere.api.dto.definition.ApiDefinitionAddRequest;
|
||||||
import io.metersphere.api.dto.definition.ApiTestCaseAddRequest;
|
import io.metersphere.api.dto.definition.ApiTestCaseAddRequest;
|
||||||
|
import io.metersphere.api.dto.assertion.MsAssertionConfig;
|
||||||
|
import io.metersphere.project.api.assertion.MsScriptAssertion;
|
||||||
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
||||||
import io.metersphere.api.dto.response.ApiScenarioBatchOperationResponse;
|
import io.metersphere.api.dto.response.ApiScenarioBatchOperationResponse;
|
||||||
import io.metersphere.api.dto.response.OperationDataInfo;
|
import io.metersphere.api.dto.response.OperationDataInfo;
|
||||||
|
@ -24,11 +22,15 @@ import io.metersphere.api.utils.JmeterElementConverterRegister;
|
||||||
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
|
||||||
import io.metersphere.plugin.api.spi.JmeterElementConverter;
|
import io.metersphere.plugin.api.spi.JmeterElementConverter;
|
||||||
import io.metersphere.plugin.api.spi.MsTestElement;
|
import io.metersphere.plugin.api.spi.MsTestElement;
|
||||||
import io.metersphere.project.api.assertion.MsScriptAssertion;
|
import io.metersphere.project.api.processor.MsProcessor;
|
||||||
|
import io.metersphere.project.api.processor.SQLProcessor;
|
||||||
import io.metersphere.project.dto.environment.EnvironmentConfig;
|
import io.metersphere.project.dto.environment.EnvironmentConfig;
|
||||||
import io.metersphere.project.dto.environment.EnvironmentGroupProjectDTO;
|
import io.metersphere.project.dto.environment.EnvironmentGroupProjectDTO;
|
||||||
import io.metersphere.project.dto.environment.EnvironmentGroupRequest;
|
import io.metersphere.project.dto.environment.EnvironmentGroupRequest;
|
||||||
import io.metersphere.project.dto.environment.EnvironmentRequest;
|
import io.metersphere.project.dto.environment.EnvironmentRequest;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvProcessorConfig;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvRequestScriptProcessor;
|
||||||
|
import io.metersphere.project.dto.environment.processors.EnvScenarioScriptProcessor;
|
||||||
import io.metersphere.project.dto.filemanagement.request.FileUploadRequest;
|
import io.metersphere.project.dto.filemanagement.request.FileUploadRequest;
|
||||||
import io.metersphere.project.mapper.ExtBaseProjectVersionMapper;
|
import io.metersphere.project.mapper.ExtBaseProjectVersionMapper;
|
||||||
import io.metersphere.project.service.EnvironmentGroupService;
|
import io.metersphere.project.service.EnvironmentGroupService;
|
||||||
|
@ -284,8 +286,8 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
@Test
|
@Test
|
||||||
@Order(1)
|
@Order(1)
|
||||||
public void add() throws Exception {
|
public void add() throws Exception {
|
||||||
initTestData();
|
|
||||||
initEnv();
|
initEnv();
|
||||||
|
initTestData();
|
||||||
|
|
||||||
// @@请求成功
|
// @@请求成功
|
||||||
ApiScenarioAddRequest request = new ApiScenarioAddRequest();
|
ApiScenarioAddRequest request = new ApiScenarioAddRequest();
|
||||||
|
@ -322,6 +324,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
stepRequest.setResourceId(addApiScenario.getId());
|
stepRequest.setResourceId(addApiScenario.getId());
|
||||||
stepRequest.setRefType(ApiScenarioStepRefType.REF.name());
|
stepRequest.setRefType(ApiScenarioStepRefType.REF.name());
|
||||||
stepRequest.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
stepRequest.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
||||||
|
stepRequest.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
|
|
||||||
ApiScenarioStepRequest stepRequest2 = new ApiScenarioStepRequest();
|
ApiScenarioStepRequest stepRequest2 = new ApiScenarioStepRequest();
|
||||||
stepRequest2.setId(IDGenerator.nextStr());
|
stepRequest2.setId(IDGenerator.nextStr());
|
||||||
|
@ -330,6 +333,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
stepRequest2.setRefType(ApiScenarioStepRefType.PARTIAL_REF.name());
|
stepRequest2.setRefType(ApiScenarioStepRefType.PARTIAL_REF.name());
|
||||||
stepRequest2.setChildren(List.of(stepRequest));
|
stepRequest2.setChildren(List.of(stepRequest));
|
||||||
stepRequest2.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
stepRequest2.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
||||||
|
stepRequest2.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
steps = List.of(stepRequest, stepRequest2);
|
steps = List.of(stepRequest, stepRequest2);
|
||||||
request.setSteps(steps);
|
request.setSteps(steps);
|
||||||
mvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
|
mvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
|
||||||
|
@ -478,7 +482,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
private void initTestData() {
|
private void initTestData() {
|
||||||
ApiDefinitionAddRequest apiDefinitionAddRequest = new ApiDefinitionAddRequest();
|
ApiDefinitionAddRequest apiDefinitionAddRequest = new ApiDefinitionAddRequest();
|
||||||
apiDefinitionAddRequest.setName("test scenario");
|
apiDefinitionAddRequest.setName("test scenario");
|
||||||
apiDefinitionAddRequest.setProtocol("HTTP");
|
apiDefinitionAddRequest.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDefinitionAddRequest.setProjectId(DEFAULT_PROJECT_ID);
|
apiDefinitionAddRequest.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
apiDefinitionAddRequest.setMethod("POST");
|
apiDefinitionAddRequest.setMethod("POST");
|
||||||
apiDefinitionAddRequest.setPath("/api/admin/posts");
|
apiDefinitionAddRequest.setPath("/api/admin/posts");
|
||||||
|
@ -487,7 +491,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
apiDefinitionAddRequest.setVersionId(extBaseProjectVersionMapper.getDefaultVersion(DEFAULT_PROJECT_ID));
|
apiDefinitionAddRequest.setVersionId(extBaseProjectVersionMapper.getDefaultVersion(DEFAULT_PROJECT_ID));
|
||||||
apiDefinitionAddRequest.setDescription("描述内容");
|
apiDefinitionAddRequest.setDescription("描述内容");
|
||||||
apiDefinitionAddRequest.setName("test scenario");
|
apiDefinitionAddRequest.setName("test scenario");
|
||||||
MsHTTPElement msHttpElement = MsHTTPElementTest.getMsHttpElement();
|
MsHTTPElement msHttpElement = MsHTTPElementTest.getAddProcessorHttpElement();
|
||||||
apiDefinitionAddRequest.setRequest(getMsElementParam(msHttpElement));
|
apiDefinitionAddRequest.setRequest(getMsElementParam(msHttpElement));
|
||||||
apiDefinitionAddRequest.setResponse("{}");
|
apiDefinitionAddRequest.setResponse("{}");
|
||||||
apiDefinition = apiDefinitionService.create(apiDefinitionAddRequest, "admin");
|
apiDefinition = apiDefinitionService.create(apiDefinitionAddRequest, "admin");
|
||||||
|
@ -611,6 +615,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
stepRequest.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
stepRequest.setStepType(ApiScenarioStepType.API_SCENARIO.name());
|
||||||
stepRequest.setChildren(getApiScenarioStepRequests());
|
stepRequest.setChildren(getApiScenarioStepRequests());
|
||||||
stepRequest.setConfig(scenarioStepConfig);
|
stepRequest.setConfig(scenarioStepConfig);
|
||||||
|
stepRequest.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
steps.add(stepRequest);
|
steps.add(stepRequest);
|
||||||
ApiScenarioStepRequest copyScenarioStep = BeanUtils.copyBean(new ApiScenarioStepRequest(), stepRequest);
|
ApiScenarioStepRequest copyScenarioStep = BeanUtils.copyBean(new ApiScenarioStepRequest(), stepRequest);
|
||||||
copyScenarioStep.setRefType(ApiScenarioStepRefType.COPY.name());
|
copyScenarioStep.setRefType(ApiScenarioStepRefType.COPY.name());
|
||||||
|
@ -640,6 +645,7 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
pluginStep.setName("plugin step");
|
pluginStep.setName("plugin step");
|
||||||
pluginStep.setStepType(ApiScenarioStepType.API.name());
|
pluginStep.setStepType(ApiScenarioStepType.API.name());
|
||||||
pluginStep.setChildren(getApiScenarioStepRequests());
|
pluginStep.setChildren(getApiScenarioStepRequests());
|
||||||
|
pluginStep.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
request.getSteps().add(pluginStep);
|
request.getSteps().add(pluginStep);
|
||||||
HashMap<Object, Object> pluginStepDetail = new HashMap<>();
|
HashMap<Object, Object> pluginStepDetail = new HashMap<>();
|
||||||
pluginStepDetail.put("polymorphicName", "MsTCPSampler");
|
pluginStepDetail.put("polymorphicName", "MsTCPSampler");
|
||||||
|
@ -686,7 +692,44 @@ public class ApiScenarioControllerTests extends BaseTest {
|
||||||
// 添加插件的环境配置,供后续测试使用
|
// 添加插件的环境配置,供后续测试使用
|
||||||
Map<String, Map<String, Object>> pluginConfigMap = new HashMap<>();
|
Map<String, Map<String, Object>> pluginConfigMap = new HashMap<>();
|
||||||
pluginConfigMap.put("tcpp-sampler", new HashMap<>());
|
pluginConfigMap.put("tcpp-sampler", new HashMap<>());
|
||||||
|
|
||||||
|
EnvScenarioScriptProcessor envScenarioScriptProcessor = new EnvScenarioScriptProcessor();
|
||||||
|
envScenarioScriptProcessor.setScript("test");
|
||||||
|
envScenarioScriptProcessor.setEnableCommonScript(false);
|
||||||
|
envScenarioScriptProcessor.setAssociateScenarioResult(true);
|
||||||
|
EnvScenarioScriptProcessor envScenarioScriptProcessor1 = BeanUtils.copyBean(new EnvScenarioScriptProcessor(), envScenarioScriptProcessor);
|
||||||
|
envScenarioScriptProcessor1.setAssociateScenarioResult(false);
|
||||||
|
SQLProcessor sqlProcessor = new SQLProcessor();
|
||||||
|
sqlProcessor.setScript("select * from test");
|
||||||
|
sqlProcessor.setName("select * from test");
|
||||||
|
|
||||||
EnvironmentConfig environmentConfig = new EnvironmentConfig();
|
EnvironmentConfig environmentConfig = new EnvironmentConfig();
|
||||||
|
EnvProcessorConfig preProcessorConfig = environmentConfig.getPreProcessorConfig();
|
||||||
|
EnvProcessorConfig postProcessorConfig = environmentConfig.getPostProcessorConfig();
|
||||||
|
List<MsProcessor> preProcessors = preProcessorConfig.getApiProcessorConfig().getScenarioProcessorConfig().getProcessors();
|
||||||
|
preProcessors.add(envScenarioScriptProcessor);
|
||||||
|
preProcessors.add(envScenarioScriptProcessor1);
|
||||||
|
preProcessors.add(sqlProcessor);
|
||||||
|
|
||||||
|
List<MsProcessor> postProcessors = postProcessorConfig.getApiProcessorConfig().getScenarioProcessorConfig().getProcessors();
|
||||||
|
postProcessors.add(envScenarioScriptProcessor);
|
||||||
|
postProcessors.add(envScenarioScriptProcessor1);
|
||||||
|
postProcessors.add(sqlProcessor);
|
||||||
|
|
||||||
|
EnvRequestScriptProcessor envRequestScriptProcessor = new EnvRequestScriptProcessor();
|
||||||
|
envRequestScriptProcessor.setScript("test");
|
||||||
|
envRequestScriptProcessor.setBeforeStepScript(true);
|
||||||
|
envRequestScriptProcessor.setIgnoreProtocols(List.of("TCP"));
|
||||||
|
EnvRequestScriptProcessor envRequestScriptProcessor1 = new EnvRequestScriptProcessor();
|
||||||
|
envRequestScriptProcessor1.setScript("test1");
|
||||||
|
envRequestScriptProcessor1.setBeforeStepScript(false);
|
||||||
|
envRequestScriptProcessor1.setIgnoreProtocols(List.of());
|
||||||
|
List<MsProcessor> preRequestProcessors = preProcessorConfig.getApiProcessorConfig().getRequestProcessorConfig().getProcessors();
|
||||||
|
preRequestProcessors.add(envRequestScriptProcessor);
|
||||||
|
preRequestProcessors.add(sqlProcessor);
|
||||||
|
List<MsProcessor> postRequestProcessors = postProcessorConfig.getApiProcessorConfig().getRequestProcessorConfig().getProcessors();
|
||||||
|
postRequestProcessors.add(envRequestScriptProcessor);
|
||||||
|
postRequestProcessors.add(sqlProcessor);
|
||||||
environmentConfig.setPluginConfigMap(pluginConfigMap);
|
environmentConfig.setPluginConfigMap(pluginConfigMap);
|
||||||
envRequest.setConfig(environmentConfig);
|
envRequest.setConfig(environmentConfig);
|
||||||
Environment environment = environmentService.add(envRequest, "admin", null);
|
Environment environment = environmentService.add(envRequest, "admin", null);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.controller.param.ApiTestCaseAddRequestDefinition;
|
import io.metersphere.api.controller.param.ApiTestCaseAddRequestDefinition;
|
||||||
import io.metersphere.api.domain.*;
|
import io.metersphere.api.domain.*;
|
||||||
import io.metersphere.api.dto.definition.*;
|
import io.metersphere.api.dto.definition.*;
|
||||||
|
@ -147,7 +148,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
|
||||||
apiDefinition.setProjectId(DEFAULT_PROJECT_ID);
|
apiDefinition.setProjectId(DEFAULT_PROJECT_ID);
|
||||||
apiDefinition.setName(StringUtils.join("接口定义", apiDefinition.getId()));
|
apiDefinition.setName(StringUtils.join("接口定义", apiDefinition.getId()));
|
||||||
apiDefinition.setModuleId("case-moduleId");
|
apiDefinition.setModuleId("case-moduleId");
|
||||||
apiDefinition.setProtocol("HTTP");
|
apiDefinition.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDefinition.setMethod("GET");
|
apiDefinition.setMethod("GET");
|
||||||
apiDefinition.setStatus("未规划");
|
apiDefinition.setStatus("未规划");
|
||||||
apiDefinition.setNum(NumGenerator.nextNum(DEFAULT_PROJECT_ID, ApplicationNumScope.API_DEFINITION));
|
apiDefinition.setNum(NumGenerator.nextNum(DEFAULT_PROJECT_ID, ApplicationNumScope.API_DEFINITION));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
import io.metersphere.api.dto.request.http.MsHTTPElement;
|
||||||
import io.metersphere.api.service.ApiTestService;
|
import io.metersphere.api.service.ApiTestService;
|
||||||
import io.metersphere.system.base.BaseApiPluginTestService;
|
import io.metersphere.system.base.BaseApiPluginTestService;
|
||||||
|
@ -36,7 +37,7 @@ public class ApiTestServiceTest extends BaseTest {
|
||||||
List<ProtocolDTO> protocols = apiTestService.getProtocols(this.DEFAULT_ORGANIZATION_ID);
|
List<ProtocolDTO> protocols = apiTestService.getProtocols(this.DEFAULT_ORGANIZATION_ID);
|
||||||
List expected = new ArrayList<ProtocolDTO>();
|
List expected = new ArrayList<ProtocolDTO>();
|
||||||
ProtocolDTO httpProtocol = new ProtocolDTO();
|
ProtocolDTO httpProtocol = new ProtocolDTO();
|
||||||
httpProtocol.setProtocol("HTTP");
|
httpProtocol.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
httpProtocol.setPolymorphicName(MsHTTPElement.class.getSimpleName());
|
httpProtocol.setPolymorphicName(MsHTTPElement.class.getSimpleName());
|
||||||
ProtocolDTO jdbcProtocol = new ProtocolDTO();
|
ProtocolDTO jdbcProtocol = new ProtocolDTO();
|
||||||
jdbcProtocol.setProtocol("JDBC");
|
jdbcProtocol.setProtocol("JDBC");
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.metersphere.api.controller;
|
package io.metersphere.api.controller;
|
||||||
|
|
||||||
|
import io.metersphere.api.constants.ApiConstants;
|
||||||
import io.metersphere.api.domain.*;
|
import io.metersphere.api.domain.*;
|
||||||
import io.metersphere.api.dto.scenario.CsvVariable;
|
import io.metersphere.api.dto.scenario.CsvVariable;
|
||||||
import io.metersphere.api.job.ApiScenarioScheduleJob;
|
import io.metersphere.api.job.ApiScenarioScheduleJob;
|
||||||
|
@ -98,7 +99,7 @@ public class CleanupApiTests {
|
||||||
apiDefinition.setModuleId("test-module");
|
apiDefinition.setModuleId("test-module");
|
||||||
apiDefinition.setName("test");
|
apiDefinition.setName("test");
|
||||||
apiDefinition.setPath("test");
|
apiDefinition.setPath("test");
|
||||||
apiDefinition.setProtocol("http");
|
apiDefinition.setProtocol(ApiConstants.HTTP_PROTOCOL);
|
||||||
apiDefinition.setMethod("test");
|
apiDefinition.setMethod("test");
|
||||||
apiDefinition.setCreateUser("admin");
|
apiDefinition.setCreateUser("admin");
|
||||||
apiDefinition.setUpdateUser("admin");
|
apiDefinition.setUpdateUser("admin");
|
||||||
|
|
|
@ -134,6 +134,22 @@ public class MsHTTPElementTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void processorParseTest() {
|
public void processorParseTest() {
|
||||||
|
|
||||||
|
MsHTTPElement msHTTPElement = getAddProcessorHttpElement();
|
||||||
|
// 测试序列化
|
||||||
|
String json = ApiDataUtils.toJSONString(msHTTPElement);
|
||||||
|
Assertions.assertNotNull(json);
|
||||||
|
Assertions.assertEquals(ApiDataUtils.parseObject(json, AbstractMsTestElement.class), msHTTPElement);
|
||||||
|
|
||||||
|
// 测试脚本解析
|
||||||
|
ParameterConfig parameterConfig = new ApiParamConfig();
|
||||||
|
parameterConfig.setReportId("reportId");
|
||||||
|
TestElementParser defaultParser = TestElementParserFactory.getDefaultParser();
|
||||||
|
AbstractMsTestElement msTestElement = ApiDataUtils.parseObject(json, AbstractMsTestElement.class);
|
||||||
|
defaultParser.parse(msTestElement, parameterConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MsHTTPElement getAddProcessorHttpElement() {
|
||||||
MsHTTPElement msHTTPElement = getMsHttpElement();
|
MsHTTPElement msHTTPElement = getMsHttpElement();
|
||||||
|
|
||||||
List processors = new ArrayList<>();
|
List processors = new ArrayList<>();
|
||||||
|
@ -219,17 +235,7 @@ public class MsHTTPElementTest {
|
||||||
linkedList.add(msCommonElement);
|
linkedList.add(msCommonElement);
|
||||||
msHTTPElement.setChildren(linkedList);
|
msHTTPElement.setChildren(linkedList);
|
||||||
|
|
||||||
// 测试序列化
|
return msHTTPElement;
|
||||||
String json = ApiDataUtils.toJSONString(msHTTPElement);
|
|
||||||
Assertions.assertNotNull(json);
|
|
||||||
Assertions.assertEquals(ApiDataUtils.parseObject(json, AbstractMsTestElement.class), msHTTPElement);
|
|
||||||
|
|
||||||
// 测试脚本解析
|
|
||||||
ParameterConfig parameterConfig = new ApiParamConfig();
|
|
||||||
parameterConfig.setReportId("reportId");
|
|
||||||
TestElementParser defaultParser = TestElementParserFactory.getDefaultParser();
|
|
||||||
AbstractMsTestElement msTestElement = ApiDataUtils.parseObject(json, AbstractMsTestElement.class);
|
|
||||||
defaultParser.parse(msTestElement, parameterConfig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -2,8 +2,8 @@ package io.metersphere.project.api.processor;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
import io.metersphere.project.dto.environment.processors.RequestScriptProcessor;
|
import io.metersphere.project.dto.environment.processors.EnvRequestScriptProcessor;
|
||||||
import io.metersphere.project.dto.environment.processors.ScenarioScriptProcessor;
|
import io.metersphere.project.dto.environment.processors.EnvScenarioScriptProcessor;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.Size;
|
import jakarta.validation.constraints.Size;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
@ -17,8 +17,8 @@ import lombok.Data;
|
||||||
* SQL {@link SQLProcessor}
|
* SQL {@link SQLProcessor}
|
||||||
* TIME_WAITING {@link TimeWaitingProcessor}
|
* TIME_WAITING {@link TimeWaitingProcessor}
|
||||||
* EXTRACT {@link ExtractPostProcessor}
|
* EXTRACT {@link ExtractPostProcessor}
|
||||||
* SCENARIO_SCRIPT {@link ScenarioScriptProcessor}
|
* ENV_SCENARIO_SCRIPT {@link EnvScenarioScriptProcessor}
|
||||||
* REQUEST_SCRIPT {@link RequestScriptProcessor}
|
* ENV_REQUEST_SCRIPT {@link EnvRequestScriptProcessor}
|
||||||
* <pre>
|
* <pre>
|
||||||
* @Author: jianxing
|
* @Author: jianxing
|
||||||
* @CreateTime: 2023-11-07 10:17
|
* @CreateTime: 2023-11-07 10:17
|
||||||
|
@ -27,8 +27,8 @@ import lombok.Data;
|
||||||
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "processorType")
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "processorType")
|
||||||
@JsonSubTypes({
|
@JsonSubTypes({
|
||||||
@JsonSubTypes.Type(value = ScriptProcessor.class),
|
@JsonSubTypes.Type(value = ScriptProcessor.class),
|
||||||
@JsonSubTypes.Type(value = ScenarioScriptProcessor.class),
|
@JsonSubTypes.Type(value = EnvScenarioScriptProcessor.class),
|
||||||
@JsonSubTypes.Type(value = RequestScriptProcessor.class),
|
@JsonSubTypes.Type(value = EnvRequestScriptProcessor.class),
|
||||||
@JsonSubTypes.Type(value = SQLProcessor.class),
|
@JsonSubTypes.Type(value = SQLProcessor.class),
|
||||||
@JsonSubTypes.Type(value = TimeWaitingProcessor.class),
|
@JsonSubTypes.Type(value = TimeWaitingProcessor.class),
|
||||||
@JsonSubTypes.Type(value = ExtractPostProcessor.class),
|
@JsonSubTypes.Type(value = ExtractPostProcessor.class),
|
||||||
|
|
|
@ -7,6 +7,8 @@ import io.metersphere.system.valid.EnumValue;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import jakarta.validation.constraints.Size;
|
import jakarta.validation.constraints.Size;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -32,6 +34,7 @@ public class ScriptProcessor extends MsProcessor {
|
||||||
/**
|
/**
|
||||||
* 是否启用公共脚本
|
* 是否启用公共脚本
|
||||||
* 默认为 false
|
* 默认为 false
|
||||||
|
* 环境脚本无须配置
|
||||||
*/
|
*/
|
||||||
private Boolean enableCommonScript = false;
|
private Boolean enableCommonScript = false;
|
||||||
/**
|
/**
|
||||||
|
@ -44,4 +47,11 @@ public class ScriptProcessor extends MsProcessor {
|
||||||
*/
|
*/
|
||||||
@Valid
|
@Valid
|
||||||
private List<KeyValueParam> params;
|
private List<KeyValueParam> params;
|
||||||
|
|
||||||
|
public boolean isValid() {
|
||||||
|
if (BooleanUtils.isTrue(enableCommonScript) && StringUtils.isBlank(scriptId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return StringUtils.isNotBlank(script);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,47 +10,32 @@ import io.metersphere.project.dto.environment.variables.CommonVariables;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.util.ArrayList;
|
||||||
import java.io.Serializable;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class EnvironmentConfig implements Serializable {
|
public class EnvironmentConfig {
|
||||||
@Serial
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
@Schema(description = "公共参数 请求超时时间、响应超时时间")
|
@Schema(description = "公共参数 请求超时时间、响应超时时间")
|
||||||
private CommonParams commonParams;
|
private CommonParams commonParams = new CommonParams();
|
||||||
@Schema(description = "环境变量")
|
@Schema(description = "环境变量")
|
||||||
private List<CommonVariables> commonVariables;
|
private List<CommonVariables> commonVariables = new ArrayList<>(0);
|
||||||
@Schema(description = "HTTP配置")
|
@Schema(description = "HTTP配置")
|
||||||
private List<HttpConfig> httpConfig;
|
private List<HttpConfig> httpConfig = new ArrayList<>(0);
|
||||||
@Schema(description = "数据库配置")
|
@Schema(description = "数据库配置")
|
||||||
private List<DataSource> dataSources;
|
private List<DataSource> dataSources = new ArrayList<>(0);
|
||||||
|
|
||||||
@Schema(description = "Host配置")
|
@Schema(description = "Host配置")
|
||||||
private HostConfig hostConfig;
|
private HostConfig hostConfig = new HostConfig();
|
||||||
@Schema(description = "认证配置")
|
@Schema(description = "认证配置")
|
||||||
private AuthConfig authConfig;
|
private AuthConfig authConfig = new AuthConfig();
|
||||||
@Schema(description = "全局前置脚本")
|
@Schema(description = "全局前置脚本")
|
||||||
private EnvProcessorConfig preProcessorConfig;
|
private EnvProcessorConfig preProcessorConfig = new EnvProcessorConfig();
|
||||||
@Schema(description = "全局后置脚本")
|
@Schema(description = "全局后置脚本")
|
||||||
private EnvProcessorConfig postProcessorConfig;
|
private EnvProcessorConfig postProcessorConfig = new EnvProcessorConfig();
|
||||||
@Schema(description = "全局断言")
|
@Schema(description = "全局断言")
|
||||||
private MsEnvAssertionConfig assertionConfig;
|
private MsEnvAssertionConfig assertionConfig = new MsEnvAssertionConfig();
|
||||||
@Schema(description = "插件自定义的配置项,key为插件ID,value 为对应配置")
|
@Schema(description = "插件自定义的配置项,key为插件ID,value 为对应配置")
|
||||||
private Map<String, Map<String, Object>> pluginConfigMap;
|
private Map<String, Map<String, Object>> pluginConfigMap = HashMap.newHashMap(0);
|
||||||
|
|
||||||
|
|
||||||
public EnvironmentConfig() {
|
|
||||||
this.commonParams = new CommonParams();
|
|
||||||
this.commonVariables = List.of(new CommonVariables());
|
|
||||||
this.httpConfig = List.of(new HttpConfig());
|
|
||||||
this.dataSources = List.of(new DataSource());
|
|
||||||
this.hostConfig = new HostConfig();
|
|
||||||
this.authConfig = new AuthConfig();
|
|
||||||
this.preProcessorConfig = new EnvProcessorConfig();
|
|
||||||
this.postProcessorConfig = new EnvProcessorConfig();
|
|
||||||
this.assertionConfig = new MsEnvAssertionConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ public class EnvironmentInfoDTO implements Serializable {
|
||||||
private String name;
|
private String name;
|
||||||
@Schema(description = "环境配置")
|
@Schema(description = "环境配置")
|
||||||
@NotNull(message = "{environment_config_is_null}", groups = {Created.class, Updated.class})
|
@NotNull(message = "{environment_config_is_null}", groups = {Created.class, Updated.class})
|
||||||
private EnvironmentConfig config;
|
private EnvironmentConfig config = new EnvironmentConfig();
|
||||||
@Schema(description = "是否是mock环境")
|
@Schema(description = "是否是mock环境")
|
||||||
private Boolean mock;
|
private Boolean mock;
|
||||||
@Schema(description = "描述")
|
@Schema(description = "描述")
|
||||||
|
|
|
@ -3,6 +3,9 @@ package io.metersphere.project.dto.environment;
|
||||||
import io.metersphere.project.api.assertion.MsAssertion;
|
import io.metersphere.project.api.assertion.MsAssertion;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,9 +14,12 @@ import java.util.List;
|
||||||
* @CreateTime: 2023-11-23 17:26
|
* @CreateTime: 2023-11-23 17:26
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class MsEnvAssertionConfig {
|
public class MsEnvAssertionConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 断言列表
|
* 断言列表
|
||||||
*/
|
*/
|
||||||
private List<MsAssertion> assertions;
|
private List<MsAssertion> assertions = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ public class AuthConfig implements Serializable {
|
||||||
private String verification;
|
private String verification;
|
||||||
|
|
||||||
@Schema(description = "SSL配置")
|
@Schema(description = "SSL配置")
|
||||||
private KeyStoreConfig sslConfig;
|
private KeyStoreConfig sslConfig = new KeyStoreConfig();
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
|
@ -5,6 +5,7 @@ import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
@ -12,7 +13,7 @@ public class HostConfig implements Serializable {
|
||||||
@Schema(description = "启用Host")
|
@Schema(description = "启用Host")
|
||||||
private Boolean enable;
|
private Boolean enable;
|
||||||
@Schema(description = "Host列表")
|
@Schema(description = "Host列表")
|
||||||
private List<Host> hosts;
|
private List<Host> hosts = new ArrayList<>(0);
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,9 @@ import io.metersphere.project.api.processor.MsProcessor;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,10 +15,12 @@ import java.util.List;
|
||||||
* @CreateTime: 2024-02-01 14:53
|
* @CreateTime: 2024-02-01 14:53
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ApiEnvPlanProcessorConfig {
|
public class ApiEnvPlanProcessorConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
// 预留其他配置
|
// 预留其他配置
|
||||||
|
|
||||||
@Schema(description = "前后置列表")
|
@Schema(description = "前后置列表")
|
||||||
private List<MsProcessor> processors;
|
private List<MsProcessor> processors = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,16 +3,22 @@ package io.metersphere.project.dto.environment.processors;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: jianxing
|
* @Author: jianxing
|
||||||
* @CreateTime: 2024-02-01 14:49
|
* @CreateTime: 2024-02-01 14:49
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ApiEnvProcessorConfig {
|
public class ApiEnvProcessorConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Schema(description = "测试计划级前后置配置")
|
@Schema(description = "测试计划级前后置配置")
|
||||||
private ApiEnvPlanProcessorConfig planProcessorConfig;
|
private ApiEnvPlanProcessorConfig planProcessorConfig = new ApiEnvPlanProcessorConfig();
|
||||||
@Schema(description = "场景级前后置配置")
|
@Schema(description = "场景级前后置配置")
|
||||||
private ApiEnvScenarioProcessorConfig scenarioProcessorConfig;
|
private ApiEnvScenarioProcessorConfig scenarioProcessorConfig = new ApiEnvScenarioProcessorConfig();
|
||||||
@Schema(description = "请求级前后置配置")
|
@Schema(description = "请求级前后置配置")
|
||||||
private ApiEnvRequestProcessorConfig requestProcessorConfig;
|
private ApiEnvRequestProcessorConfig requestProcessorConfig = new ApiEnvRequestProcessorConfig();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@ import io.metersphere.project.api.processor.MsProcessor;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,10 +15,12 @@ import java.util.List;
|
||||||
* @CreateTime: 2024-02-01 14:53
|
* @CreateTime: 2024-02-01 14:53
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ApiEnvRequestProcessorConfig {
|
public class ApiEnvRequestProcessorConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
// 预留其他配置
|
// 预留其他配置
|
||||||
|
|
||||||
@Schema(description = "前后置列表")
|
@Schema(description = "前后置列表")
|
||||||
private List<MsProcessor> processors;
|
private List<MsProcessor> processors = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@ import io.metersphere.project.api.processor.MsProcessor;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,10 +15,12 @@ import java.util.List;
|
||||||
* @CreateTime: 2024-02-01 14:53
|
* @CreateTime: 2024-02-01 14:53
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ApiEnvScenarioProcessorConfig {
|
public class ApiEnvScenarioProcessorConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
// 预留其他配置
|
// 预留其他配置
|
||||||
|
|
||||||
@Schema(description = "前后置列表")
|
@Schema(description = "前后置列表")
|
||||||
private List<MsProcessor> processors;
|
private List<MsProcessor> processors = new ArrayList<>(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,17 @@ package io.metersphere.project.dto.environment.processors;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 环境的前后置配置
|
* 环境的前后置配置
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class EnvProcessorConfig {
|
public class EnvProcessorConfig implements Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Schema(description = "接口测试前后置配置")
|
@Schema(description = "接口测试前后置配置")
|
||||||
private ApiEnvProcessorConfig apiProcessorConfig;
|
private ApiEnvProcessorConfig apiProcessorConfig = new ApiEnvProcessorConfig();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,17 +6,18 @@ import io.metersphere.project.api.processor.ScriptProcessor;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@JsonTypeName("REQUEST_SCRIPT")
|
@JsonTypeName("ENV_REQUEST_SCRIPT")
|
||||||
public class RequestScriptProcessor extends ScriptProcessor {
|
public class EnvRequestScriptProcessor extends ScriptProcessor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 忽略的请求协议列表
|
* 忽略的请求协议列表
|
||||||
*/
|
*/
|
||||||
@Schema(description = "忽略请求")
|
@Schema(description = "忽略请求")
|
||||||
private List<String> ignoreProtocols;
|
private List<String> ignoreProtocols = new ArrayList<>(0);
|
||||||
/**
|
/**
|
||||||
* 是否是步骤内前置脚本前
|
* 是否是步骤内前置脚本前
|
||||||
*/
|
*/
|
|
@ -7,8 +7,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@JsonTypeName("SCENARIO_SCRIPT")
|
@JsonTypeName("ENV_SCENARIO_SCRIPT")
|
||||||
public class ScenarioScriptProcessor extends ScriptProcessor {
|
public class EnvScenarioScriptProcessor extends ScriptProcessor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否关联场景结果,默认否
|
* 是否关联场景结果,默认否
|
|
@ -5,6 +5,7 @@ import io.metersphere.project.domain.Project;
|
||||||
import io.metersphere.project.domain.ProjectExample;
|
import io.metersphere.project.domain.ProjectExample;
|
||||||
import io.metersphere.project.dto.environment.*;
|
import io.metersphere.project.dto.environment.*;
|
||||||
import io.metersphere.project.dto.environment.datasource.DataSource;
|
import io.metersphere.project.dto.environment.datasource.DataSource;
|
||||||
|
import io.metersphere.project.dto.environment.http.HttpConfig;
|
||||||
import io.metersphere.project.mapper.ExtEnvironmentMapper;
|
import io.metersphere.project.mapper.ExtEnvironmentMapper;
|
||||||
import io.metersphere.project.mapper.ProjectMapper;
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
import io.metersphere.sdk.constants.DefaultRepositoryDir;
|
import io.metersphere.sdk.constants.DefaultRepositoryDir;
|
||||||
|
@ -191,7 +192,12 @@ public class EnvironmentService {
|
||||||
String baseUrl = baseSystemConfigDTO.getUrl();
|
String baseUrl = baseSystemConfigDTO.getUrl();
|
||||||
if (StringUtils.isNotEmpty(baseUrl)) {
|
if (StringUtils.isNotEmpty(baseUrl)) {
|
||||||
Project project = projectMapper.selectByPrimaryKey(environment.getProjectId());
|
Project project = projectMapper.selectByPrimaryKey(environment.getProjectId());
|
||||||
environmentInfoDTO.getConfig().getHttpConfig().getFirst().setUrl(StringUtils.join(baseUrl, MOCK_EVN_SOCKET, project.getNum()));
|
List<HttpConfig> httpConfigs = environmentInfoDTO.getConfig().getHttpConfig();
|
||||||
|
if (CollectionUtils.isEmpty(httpConfigs)) {
|
||||||
|
HttpConfig httpConfig = new HttpConfig();
|
||||||
|
httpConfig.setUrl(StringUtils.join(baseUrl, MOCK_EVN_SOCKET, project.getNum()));
|
||||||
|
httpConfigs.add(new HttpConfig());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -317,18 +317,18 @@ public class EnvironmentControllerTests extends BaseTest {
|
||||||
ApiEnvPlanProcessorConfig apiEnvPlanProcessorConfig = new ApiEnvPlanProcessorConfig();
|
ApiEnvPlanProcessorConfig apiEnvPlanProcessorConfig = new ApiEnvPlanProcessorConfig();
|
||||||
apiEnvPlanProcessorConfig.setProcessors(List.of(scriptProcessor, sqlProcessor));
|
apiEnvPlanProcessorConfig.setProcessors(List.of(scriptProcessor, sqlProcessor));
|
||||||
apiScript.setPlanProcessorConfig(apiEnvPlanProcessorConfig);
|
apiScript.setPlanProcessorConfig(apiEnvPlanProcessorConfig);
|
||||||
ScenarioScriptProcessor scenarioScript = new ScenarioScriptProcessor();
|
EnvScenarioScriptProcessor scenarioScript = new EnvScenarioScriptProcessor();
|
||||||
scenarioScript.setScript("script");
|
scenarioScript.setScript("script");
|
||||||
scenarioScript.setName("场景级别脚本");
|
scenarioScript.setName("场景级别脚本");
|
||||||
ApiEnvScenarioProcessorConfig apiEnvScenarioProcessorConfig = new ApiEnvScenarioProcessorConfig();
|
ApiEnvScenarioProcessorConfig apiEnvScenarioProcessorConfig = new ApiEnvScenarioProcessorConfig();
|
||||||
apiEnvScenarioProcessorConfig.setProcessors(List.of(scenarioScript, sqlProcessor));
|
apiEnvScenarioProcessorConfig.setProcessors(List.of(scenarioScript, sqlProcessor));
|
||||||
apiScript.setScenarioProcessorConfig(apiEnvScenarioProcessorConfig);
|
apiScript.setScenarioProcessorConfig(apiEnvScenarioProcessorConfig);
|
||||||
RequestScriptProcessor stepScript = new RequestScriptProcessor();
|
EnvRequestScriptProcessor stepScript = new EnvRequestScriptProcessor();
|
||||||
stepScript.setScript("script");
|
stepScript.setScript("script");
|
||||||
stepScript.setName("步骤级别前置脚本前");
|
stepScript.setName("步骤级别前置脚本前");
|
||||||
stepScript.setBeforeStepScript(true);
|
stepScript.setBeforeStepScript(true);
|
||||||
stepScript.setIgnoreProtocols(List.of("HTTP"));
|
stepScript.setIgnoreProtocols(List.of("HTTP"));
|
||||||
RequestScriptProcessor stepScriptAfter = new RequestScriptProcessor();
|
EnvRequestScriptProcessor stepScriptAfter = new EnvRequestScriptProcessor();
|
||||||
stepScriptAfter.setScript("script");
|
stepScriptAfter.setScript("script");
|
||||||
stepScriptAfter.setName("步骤级别前置脚本后");
|
stepScriptAfter.setName("步骤级别前置脚本后");
|
||||||
stepScriptAfter.setBeforeStepScript(false);
|
stepScriptAfter.setBeforeStepScript(false);
|
||||||
|
|
|
@ -94,4 +94,24 @@ public class ApiPluginService {
|
||||||
}
|
}
|
||||||
return testElementPluginMap;
|
return testElementPluginMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回 MsTestElement 实现类与接口协议的映射
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Map<Class<? extends AbstractMsTestElement>, String> getTestElementProtocolMap() {
|
||||||
|
// 过滤协议插件
|
||||||
|
List<PluginWrapper> protocolPlugins = pluginLoadService.getMsPluginManager()
|
||||||
|
.getPlugins()
|
||||||
|
.stream()
|
||||||
|
.filter(plugin -> plugin.getPlugin() instanceof AbstractProtocolPlugin)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
Map<Class<? extends AbstractMsTestElement>, String> testElementProtocolMap = new HashMap<>();
|
||||||
|
for (PluginWrapper plugin : protocolPlugins) {
|
||||||
|
List<Class<? extends MsTestElement>> extensionClasses = plugin.getPluginManager().getExtensionClasses(MsTestElement.class);
|
||||||
|
extensionClasses.forEach(clazz -> testElementProtocolMap.put((Class<? extends AbstractMsTestElement>) clazz, ((AbstractProtocolPlugin) plugin.getPlugin()).getProtocol()));
|
||||||
|
}
|
||||||
|
return testElementProtocolMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue