feat: 接口定义JMeter文件导入

This commit is contained in:
shiziyuan9527 2021-08-03 17:31:57 +08:00 committed by 刘瑞斌
parent 551c3dfd2a
commit 3e14b9168f
4 changed files with 519 additions and 5 deletions

View File

@ -16,6 +16,8 @@ public class ApiDefinitionImportParserFactory {
return new HarParser(); return new HarParser();
}else if (StringUtils.equals(ApiImportPlatform.ESB.name(), platform)) { }else if (StringUtils.equals(ApiImportPlatform.ESB.name(), platform)) {
return new ESBParser(); return new ESBParser();
} else if (StringUtils.equals(ApiImportPlatform.Jmeter.name(), platform)) {
return new JmeterDefinitionParser();
} }
return null; return null;
} }

View File

@ -0,0 +1,504 @@
package io.metersphere.api.dto.definition.parse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.github.ningyu.jmeter.plugin.dubbo.sample.DubboSample;
import io.github.ningyu.jmeter.plugin.dubbo.sample.MethodArgument;
import io.github.ningyu.jmeter.plugin.util.Constants;
import io.metersphere.api.dto.ApiTestImportRequest;
import io.metersphere.api.dto.automation.ImportPoolsDTO;
import io.metersphere.api.dto.automation.parse.MsJmeterParser;
import io.metersphere.api.dto.definition.request.MsTestElement;
import io.metersphere.api.dto.definition.request.sampler.MsDubboSampler;
import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy;
import io.metersphere.api.dto.definition.request.sampler.MsJDBCSampler;
import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler;
import io.metersphere.api.dto.definition.request.sampler.dubbo.MsConfigCenter;
import io.metersphere.api.dto.definition.request.sampler.dubbo.MsConsumerAndService;
import io.metersphere.api.dto.definition.request.sampler.dubbo.MsRegistryCenter;
import io.metersphere.api.dto.scenario.Body;
import io.metersphere.api.dto.scenario.DatabaseConfig;
import io.metersphere.api.dto.scenario.KeyValue;
import io.metersphere.api.dto.scenario.environment.EnvironmentConfig;
import io.metersphere.api.dto.scenario.request.BodyFile;
import io.metersphere.api.dto.scenario.request.RequestType;
import io.metersphere.api.parse.ApiImportAbstractParser;
import io.metersphere.api.service.ApiTestEnvironmentService;
import io.metersphere.base.domain.*;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.BeanUtils;
import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.SessionUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.config.ConfigTestElement;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.protocol.http.util.HTTPFileArg;
import org.apache.jmeter.protocol.jdbc.config.DataSourceElement;
import org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler;
import org.apache.jmeter.protocol.tcp.sampler.TCPSampler;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jorphan.collections.HashTree;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
public class JmeterDefinitionParser extends ApiImportAbstractParser<ApiDefinitionImport> {
private final Map<Integer, List<Object>> headerMap = new HashMap<>();
private ImportPoolsDTO dataPools;
private final String ENV_NAME = "导入数据环境";
private ApiModule selectModule;
private ApiModule apiModule;
private String selectModulePath;
private String planName = "default";
@Override
public ApiDefinitionImport parse(InputStream inputSource, ApiTestImportRequest request) {
ApiDefinitionImport apiImport = new ApiDefinitionImport();
this.projectId = request.getProjectId();
try {
Object scriptWrapper = SaveService.loadElement(inputSource);
HashTree testPlan = this.getHashTree(scriptWrapper);
// 优先初始化数据源及部分参数
preInitPool(request.getProjectId(), testPlan);
List<MsTestElement> elements = new ArrayList<>();
List<ApiDefinitionWithBLOBs> definitions = new ArrayList<>();
List<ApiTestCaseWithBLOBs> definitionCases = new ArrayList<>();
jmeterHashTree(testPlan, elements);
this.selectModule = ApiDefinitionImportUtil.getSelectModule(request.getModuleId());
if (this.selectModule != null) {
this.selectModulePath = ApiDefinitionImportUtil.getSelectModulePath(this.selectModule.getName(), this.selectModule.getParentId());
}
this.apiModule = ApiDefinitionImportUtil.buildModule(this.selectModule, this.planName, this.projectId);
for (MsTestElement element : elements) {
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = buildApiDefinition(element);
if (apiDefinitionWithBLOBs != null) {
definitions.add(apiDefinitionWithBLOBs);
ApiTestCaseWithBLOBs apiTestCase = new ApiTestCaseWithBLOBs();
BeanUtils.copyBean(apiTestCase, apiDefinitionWithBLOBs);
apiTestCase.setApiDefinitionId(apiDefinitionWithBLOBs.getId());
apiTestCase.setStatus("Prepare");
apiTestCase.setPriority("P0");
definitionCases.add(apiTestCase);
}
}
apiImport.setData(definitions);
apiImport.setCases(definitionCases);
return apiImport;
} catch (Exception e) {
e.printStackTrace();
MSException.throwException("当前JMX版本不兼容");
}
return null;
}
private void preCreate(HashTree tree) {
for (Object key : tree.keySet()) {
// JDBC 数据池
if (key instanceof DataSourceElement) {
DataSourceElement dataSourceElement = (DataSourceElement) key;
DatabaseConfig newConfig = new DatabaseConfig();
newConfig.setUsername(dataSourceElement.getPropertyAsString("username"));
newConfig.setPassword(dataSourceElement.getPropertyAsString("password"));
newConfig.setDriver(dataSourceElement.getPropertyAsString("driver"));
newConfig.setDbUrl(dataSourceElement.getPropertyAsString("dbUrl"));
newConfig.setName(dataSourceElement.getPropertyAsString("dataSource"));
newConfig.setPoolMax(dataSourceElement.getPropertyAsInt("poolMax"));
newConfig.setTimeout(dataSourceElement.getPropertyAsInt("timeout"));
if (dataPools != null && dataPools.getDataSources() != null && dataPools.getDataSources().containsKey(dataSourceElement.getPropertyAsString("dataSource"))) {
DatabaseConfig config = dataPools.getDataSources().get(dataSourceElement.getPropertyAsString("dataSource"));
newConfig.setId(config.getId());
dataPools.getDataSources().put(dataSourceElement.getPropertyAsString("dataSource"), newConfig);
} else {
newConfig.setId(UUID.randomUUID().toString());
if (dataPools.getDataSources() == null) {
dataPools.setDataSources(new HashMap<>());
}
dataPools.getDataSources().put(dataSourceElement.getPropertyAsString("dataSource"), newConfig);
}
} else if (key instanceof HTTPSamplerProxy) {
// 把HTTP 请求下的HeaderManager 取出来
HashTree node = tree.get(key);
if (node != null) {
for (Object nodeKey : node.keySet()) {
if (nodeKey instanceof HeaderManager) {
if (headerMap.containsKey(key.hashCode())) {
headerMap.get(key.hashCode()).add(nodeKey);
} else {
List<Object> objects = new LinkedList<Object>() {{
this.add(nodeKey);
}};
headerMap.put(key.hashCode(), objects);
}
}
}
}
}
// 递归子项
HashTree node = tree.get(key);
if (node != null) {
preCreate(node);
}
}
}
private void preInitPool(String projectId, HashTree hashTree) {
// 初始化已有数据池
initDataSource(projectId, ENV_NAME);
// 添加当前jmx 中新的数据池
preCreate(hashTree);
// 更新数据源
ApiTestEnvironmentService environmentService = CommonBeanFactory.getBean(ApiTestEnvironmentService.class);
if (dataPools.getDataSources() != null) {
dataPools.getEnvConfig().setDatabaseConfigs(new ArrayList<>(dataPools.getDataSources().values()));
}
if (dataPools.getIsCreate()) {
dataPools.getTestEnvironmentWithBLOBs().setConfig(JSON.toJSONString(dataPools.getEnvConfig()));
String id = environmentService.add(dataPools.getTestEnvironmentWithBLOBs());
dataPools.setEnvId(id);
} else {
dataPools.getTestEnvironmentWithBLOBs().setConfig(JSON.toJSONString(dataPools.getEnvConfig()));
environmentService.update(dataPools.getTestEnvironmentWithBLOBs());
}
}
private void initDataSource(String projectId, String name) {
ApiTestEnvironmentService environmentService = CommonBeanFactory.getBean(ApiTestEnvironmentService.class);
ApiTestEnvironmentExample example = new ApiTestEnvironmentExample();
example.createCriteria().andProjectIdEqualTo(projectId).andNameEqualTo(name);
// 这里的数据只有一条如果多条则有问题
List<ApiTestEnvironmentWithBLOBs> environments = environmentService.selectByExampleWithBLOBs(example);
dataPools = new ImportPoolsDTO();
if (CollectionUtils.isNotEmpty(environments)) {
dataPools.setIsCreate(false);
dataPools.setTestEnvironmentWithBLOBs(environments.get(0));
Map<String, DatabaseConfig> dataSources = new HashMap<>();
environments.forEach(environment -> {
if (environment != null && environment.getConfig() != null) {
EnvironmentConfig envConfig = JSONObject.parseObject(environment.getConfig(), EnvironmentConfig.class);
dataPools.setEnvConfig(envConfig);
if (envConfig != null && CollectionUtils.isNotEmpty(envConfig.getDatabaseConfigs())) {
envConfig.getDatabaseConfigs().forEach(item -> dataSources.put(item.getName(), item));
}
}
dataPools.setEnvId(environment.getId());
dataPools.setDataSources(dataSources);
});
} else {
dataPools.setIsCreate(true);
ApiTestEnvironmentWithBLOBs apiTestEnvironmentWithBLOBs = new ApiTestEnvironmentWithBLOBs();
apiTestEnvironmentWithBLOBs.setId(UUID.randomUUID().toString());
dataPools.setEnvId(apiTestEnvironmentWithBLOBs.getId());
dataPools.setEnvConfig(new EnvironmentConfig());
apiTestEnvironmentWithBLOBs.setName(ENV_NAME);
apiTestEnvironmentWithBLOBs.setProjectId(projectId);
dataPools.setTestEnvironmentWithBLOBs(apiTestEnvironmentWithBLOBs);
}
}
private void preBuildApiDefinition(ApiDefinitionWithBLOBs apiDefinition, MsTestElement element, String protocol) {
apiDefinition.setId(UUID.randomUUID().toString());
apiDefinition.setName(element.getName());
apiDefinition.setProjectId(this.projectId);
apiDefinition.setRequest(JSON.toJSONString(element));
if (this.selectModule != null) {
apiDefinition.setModuleId(this.apiModule.getId());
if (StringUtils.isNotBlank(this.selectModulePath)) {
apiDefinition.setModulePath(this.selectModulePath + "/" + this.apiModule.getName());
} else {
apiDefinition.setModulePath("/" + this.apiModule.getName());
}
}
// todo 除HTTP协议外其它协议设置默认模块
apiDefinition.setStatus("Prepare");
apiDefinition.setProtocol(protocol);
apiDefinition.setUserId(SessionUtils.getUserId());
apiDefinition.setCreateTime(System.currentTimeMillis());
apiDefinition.setUpdateTime(System.currentTimeMillis());
apiDefinition.setCreateUser(SessionUtils.getUserId());
apiDefinition.setCaseTotal("1");
}
private ApiDefinitionWithBLOBs buildApiDefinition(MsTestElement element) {
ApiDefinitionWithBLOBs apiDefinition = null;
if (element instanceof MsHTTPSamplerProxy) {
apiDefinition = new ApiDefinitionWithBLOBs();
preBuildApiDefinition(apiDefinition, element, RequestType.HTTP);
apiDefinition.setPath(((MsHTTPSamplerProxy) element).getPath());
apiDefinition.setMethod(((MsHTTPSamplerProxy) element).getMethod());
apiDefinition.setUserId(SessionUtils.getUserId());
} else if (element instanceof MsTCPSampler) {
apiDefinition = new ApiDefinitionWithBLOBs();
preBuildApiDefinition(apiDefinition, element, RequestType.TCP);
apiDefinition.setMethod(RequestType.TCP);
} else if (element instanceof MsJDBCSampler) {
apiDefinition = new ApiDefinitionWithBLOBs();
preBuildApiDefinition(apiDefinition, element, RequestType.SQL);
apiDefinition.setMethod(RequestType.SQL);
} else if (element instanceof MsDubboSampler) {
apiDefinition = new ApiDefinitionWithBLOBs();
preBuildApiDefinition(apiDefinition, element, RequestType.DUBBO);
apiDefinition.setProtocol(RequestType.DUBBO);
apiDefinition.setMethod(((MsDubboSampler) element).getMethod());
}
return apiDefinition;
}
private HashTree getHashTree(Object scriptWrapper) throws Exception {
Field field = scriptWrapper.getClass().getDeclaredField("testPlan");
field.setAccessible(true);
return (HashTree) field.get(scriptWrapper);
}
private void jmeterHashTree(HashTree tree, List<MsTestElement> elements) {
for (Object key : tree.keySet()) {
MsTestElement elementNode = null;
// 测试计划
if (key instanceof org.apache.jmeter.testelement.TestPlan) {
this.planName = ((TestPlan) key).getName();
}
// HTTP请求
else if (key instanceof HTTPSamplerProxy) {
elementNode = new MsHTTPSamplerProxy();
((MsHTTPSamplerProxy) elementNode).setBody(new Body());
convertHttpSampler((MsHTTPSamplerProxy) elementNode, key);
}
// TCP请求
else if (key instanceof TCPSampler) {
elementNode = new MsTCPSampler();
TCPSampler tcpSampler = (TCPSampler) key;
convertTCPSampler((MsTCPSampler) elementNode, tcpSampler);
}
// DUBBO请求
else if (key instanceof DubboSample) {
DubboSample sampler = (DubboSample) key;
elementNode = new MsDubboSampler();
convertDubboSample((MsDubboSampler) elementNode, sampler);
}
// JDBC请求
else if (key instanceof JDBCSampler) {
elementNode = new MsJDBCSampler();
JDBCSampler jdbcSampler = (JDBCSampler) key;
convertJDBCSampler((MsJDBCSampler) elementNode, jdbcSampler);
}
if (elementNode != null) {
elements.add(elementNode);
}
// 递归子项
HashTree node = tree.get(key);
if (node != null) {
jmeterHashTree(node, elements);
}
}
}
private void convertTCPSampler(MsTCPSampler msTCPSampler, TCPSampler tcpSampler) {
msTCPSampler.setName(tcpSampler.getName());
msTCPSampler.setType("TCPSampler");
msTCPSampler.setServer(tcpSampler.getServer());
msTCPSampler.setPort(tcpSampler.getPort() + "");
msTCPSampler.setCtimeout(tcpSampler.getConnectTimeout() + "");
msTCPSampler.setReUseConnection(tcpSampler.getProperty(TCPSampler.RE_USE_CONNECTION).getBooleanValue());
msTCPSampler.setNodelay(tcpSampler.getProperty(TCPSampler.NODELAY).getBooleanValue());
msTCPSampler.setCloseConnection(tcpSampler.isCloseConnection());
msTCPSampler.setSoLinger(tcpSampler.getSoLinger() + "");
msTCPSampler.setEolByte(tcpSampler.getEolByte() + "");
msTCPSampler.setRequest(tcpSampler.getRequestData());
msTCPSampler.setUsername(tcpSampler.getProperty(ConfigTestElement.USERNAME).getStringValue());
msTCPSampler.setPassword(tcpSampler.getProperty(ConfigTestElement.PASSWORD).getStringValue());
}
private void convertJDBCSampler(MsJDBCSampler msJDBCSampler, JDBCSampler jdbcSampler) {
msJDBCSampler.setType("JDBCSampler");
msJDBCSampler.setName(jdbcSampler.getName());
msJDBCSampler.setProtocol("SQL");
msJDBCSampler.setQuery(jdbcSampler.getPropertyAsString("query"));
msJDBCSampler.setQueryTimeout(jdbcSampler.getPropertyAsInt("queryTimeout"));
msJDBCSampler.setResultVariable(jdbcSampler.getPropertyAsString("resultVariable"));
msJDBCSampler.setVariableNames(jdbcSampler.getPropertyAsString("variableNames"));
msJDBCSampler.setEnvironmentId(dataPools.getEnvId());
if (dataPools.getDataSources() != null && dataPools.getDataSources().get(jdbcSampler.getPropertyAsString("dataSource")) != null) {
msJDBCSampler.setDataSourceId(dataPools.getDataSources().get(jdbcSampler.getPropertyAsString("dataSource")).getId());
}
msJDBCSampler.setVariables(new LinkedList<>());
}
private void convertDubboSample(MsDubboSampler elementNode, DubboSample sampler) {
elementNode.setName(sampler.getName());
elementNode.setType("DubboSampler");
elementNode.set_interface(sampler.getPropertyAsString("FIELD_DUBBO_INTERFACE"));
elementNode.setMethod(sampler.getPropertyAsString("FIELD_DUBBO_METHOD"));
MsConfigCenter configCenter = new MsConfigCenter();
configCenter.setProtocol(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_PROTOCOL"));
configCenter.setGroup(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_GROUP"));
configCenter.setNamespace(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_NAMESPACE"));
configCenter.setUsername(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_USER_NAME"));
configCenter.setPassword(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_PASSWORD"));
configCenter.setAddress(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_ADDRESS"));
configCenter.setTimeout(sampler.getPropertyAsString("FIELD_DUBBO_CONFIG_CENTER_TIMEOUT"));
elementNode.setConfigCenter(configCenter);
MsRegistryCenter registryCenter = new MsRegistryCenter();
registryCenter.setProtocol(sampler.getPropertyAsString("FIELD_DUBBO_REGISTRY_PROTOCOL"));
registryCenter.setAddress(sampler.getPropertyAsString("FIELD_DUBBO_ADDRESS"));
registryCenter.setGroup(sampler.getPropertyAsString("FIELD_DUBBO_REGISTRY_GROUP"));
registryCenter.setUsername(sampler.getPropertyAsString("FIELD_DUBBO_REGISTRY_USER_NAME"));
registryCenter.setPassword(sampler.getPropertyAsString("FIELD_DUBBO_REGISTRY_PASSWORD"));
registryCenter.setTimeout(sampler.getPropertyAsString("FIELD_DUBBO_REGISTRY_TIMEOUT"));
elementNode.setRegistryCenter(registryCenter);
MsConsumerAndService consumerAndService = new MsConsumerAndService();
consumerAndService.setAsync(sampler.getPropertyAsString("FIELD_DUBBO_ASYNC"));
consumerAndService.setCluster(sampler.getPropertyAsString("FIELD_DUBBO_CLUSTER"));
consumerAndService.setConnections(sampler.getPropertyAsString("FIELD_DUBBO_CONNECTIONS"));
consumerAndService.setGroup(sampler.getPropertyAsString("FIELD_DUBBO_GROUP"));
consumerAndService.setLoadBalance(sampler.getPropertyAsString("FIELD_DUBBO_LOADBALANCE"));
consumerAndService.setVersion(sampler.getPropertyAsString("FIELD_DUBBO_VERSION"));
consumerAndService.setTimeout(sampler.getPropertyAsString("FIELD_DUBBO_TIMEOUT"));
elementNode.setConsumerAndService(consumerAndService);
List<MethodArgument> methodArguments = Constants.getMethodArgs(sampler);
List<KeyValue> methodArgs = new LinkedList<>();
if (CollectionUtils.isNotEmpty(methodArguments)) {
methodArguments.forEach(item -> {
KeyValue keyValue = new KeyValue(item.getParamType(), item.getParamValue());
methodArgs.add(keyValue);
});
}
elementNode.setArgs(methodArgs);
List<MethodArgument> arguments = Constants.getAttachmentArgs(sampler);
List<KeyValue> attachmentArgs = new LinkedList<>();
if (CollectionUtils.isNotEmpty(arguments)) {
arguments.forEach(item -> {
KeyValue keyValue = new KeyValue(item.getParamType(), item.getParamValue());
attachmentArgs.add(keyValue);
});
}
elementNode.setAttachmentArgs(attachmentArgs);
}
private void convertHttpSampler(MsHTTPSamplerProxy samplerProxy, Object key) {
try {
HTTPSamplerProxy source = (HTTPSamplerProxy) key;
BeanUtils.copyBean(samplerProxy, source);
samplerProxy.setRest(new ArrayList<KeyValue>() {{
this.add(new KeyValue());
}});
samplerProxy.setArguments(new ArrayList<KeyValue>() {{
this.add(new KeyValue());
}});
// 处理HTTP协议的请求头
if (headerMap.containsKey(key.hashCode())) {
List<KeyValue> keyValues = new LinkedList<>();
headerMap.get(key.hashCode()).forEach(item -> {
HeaderManager headerManager = (HeaderManager) item;
if (headerManager.getHeaders() != null) {
for (int i = 0; i < headerManager.getHeaders().size(); i++) {
keyValues.add(new KeyValue(headerManager.getHeader(i).getName(), headerManager.getHeader(i).getValue()));
}
}
});
samplerProxy.setHeaders(keyValues);
}
// 初始化body
Body body = new Body();
body.init();
body.initKvs();
body.getKvs().clear();
body.initBinary();
body.getBinary().clear();
samplerProxy.setBody(body);
if (source != null && source.getHTTPFiles().length > 0) {
samplerProxy.getBody().initBinary();
samplerProxy.getBody().setType(Body.FORM_DATA);
List<KeyValue> keyValues = new LinkedList<>();
for (HTTPFileArg arg : source.getHTTPFiles()) {
List<BodyFile> files = new LinkedList<>();
BodyFile file = new BodyFile();
file.setId(arg.getParamName());
String fileName = arg.getPath();
if (fileName.indexOf("/") != -1) {
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
}
file.setName(fileName);
files.add(file);
KeyValue keyValue = new KeyValue(arg.getParamName(), arg.getParamName());
keyValue.setContentType(arg.getMimeType());
keyValue.setType("file");
keyValue.setFiles(files);
keyValues.add(keyValue);
}
samplerProxy.getBody().setKvs(keyValues);
}
samplerProxy.setProtocol(RequestType.HTTP);
samplerProxy.setConnectTimeout(source.getConnectTimeout() + "");
samplerProxy.setResponseTimeout(source.getResponseTimeout() + "");
samplerProxy.setPort(source.getPropertyAsString("HTTPSampler.port"));
samplerProxy.setDomain(source.getDomain());
String bodyType = this.getBodyType(samplerProxy.getHeaders());
if (source.getArguments() != null) {
if (source.getPostBodyRaw()) {
samplerProxy.getBody().setType(Body.RAW);
source.getArguments().getArgumentsAsMap().forEach((k, v) -> samplerProxy.getBody().setRaw(v));
samplerProxy.getBody().initKvs();
} else if (StringUtils.isNotEmpty(bodyType) || ("POST".equalsIgnoreCase(source.getMethod()) && source.getArguments().getArgumentsAsMap().size() > 0)) {
samplerProxy.getBody().setType(Body.WWW_FROM);
source.getArguments().getArgumentsAsMap().forEach((k, v) -> {
KeyValue keyValue = new KeyValue(k, v);
samplerProxy.getBody().getKvs().add(keyValue);
});
} else if (samplerProxy.getBody() != null && samplerProxy.getBody().getType().equals(Body.FORM_DATA)) {
source.getArguments().getArgumentsAsMap().forEach((k, v) -> {
KeyValue keyValue = new KeyValue(k, v);
samplerProxy.getBody().getKvs().add(keyValue);
});
} else {
List<KeyValue> keyValues = new LinkedList<>();
source.getArguments().getArgumentsAsMap().forEach((k, v) -> {
KeyValue keyValue = new KeyValue(k, v);
keyValues.add(keyValue);
});
if (CollectionUtils.isNotEmpty(keyValues)) {
samplerProxy.setArguments(keyValues);
}
}
samplerProxy.getBody().initBinary();
}
samplerProxy.setPath(source.getPath());
samplerProxy.setMethod(source.getMethod());
MsJmeterParser jmeterParser = new MsJmeterParser();
if (jmeterParser.getUrl(source) != null) {
samplerProxy.setUrl(jmeterParser.getUrl(source));
}
samplerProxy.setId(UUID.randomUUID().toString());
samplerProxy.setType("HTTPSamplerProxy");
body.getKvs().add(new KeyValue());
body.getBinary().add(new KeyValue());
} catch (Exception e) {
e.printStackTrace();
}
}
private String getBodyType(List<KeyValue> headers) {
if (CollectionUtils.isNotEmpty(headers)) {
List<KeyValue> keyValues = headers.stream().filter(keyValue -> "Content-Type".equals(keyValue.getName()) && "application/x-www-form-urlencoded".equals(keyValue.getValue())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(keyValues)) {
return keyValues.get(0).getValue();
}
}
return null;
}
}

View File

@ -548,11 +548,11 @@ public class ApiDefinitionService {
int nextNum = 0; int nextNum = 0;
for (int i = 0; i < cases.size(); i++) { for (int i = 0; i < cases.size(); i++) {
ApiTestCaseWithBLOBs item = cases.get(i); ApiTestCaseWithBLOBs item = cases.get(i);
if (i == 0) { ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(item.getApiDefinitionId());
nextNum = apiTestCaseService.getNextNum(item.getApiDefinitionId()); if (apiDefinitionWithBLOBs == null) {
} else { continue;
nextNum ++;
} }
nextNum = apiTestCaseService.getNextNum(item.getApiDefinitionId());
checkRequest.setName(item.getName()); checkRequest.setName(item.getName());
checkRequest.setApiDefinitionId(item.getApiDefinitionId()); checkRequest.setApiDefinitionId(item.getApiDefinitionId());
if (!apiTestCaseService.hasSameCase(checkRequest)) { if (!apiTestCaseService.hasSameCase(checkRequest)) {

View File

@ -164,6 +164,13 @@
exportTip: this.$t('api_test.api_import.esb_export_tip'), exportTip: this.$t('api_test.api_import.esb_export_tip'),
suffixes: new Set(['xlsx', 'xls']) suffixes: new Set(['xlsx', 'xls'])
}, },
jmeterPlatform: {
name: 'JMeter',
value: 'Jmeter',
tip: this.$t('api_test.api_import.jmeter_tip'),
exportTip: this.$t('api_test.api_import.jmeter_export_tip'),
suffixes: new Set(['jmx'])
},
selectedPlatform: {}, selectedPlatform: {},
selectedPlatformValue: 'Metersphere', selectedPlatformValue: 'Metersphere',
result: {}, result: {},
@ -189,6 +196,7 @@
this.platforms.push(this.postmanPlanform); this.platforms.push(this.postmanPlanform);
this.platforms.push(this.swaggerPlanform); this.platforms.push(this.swaggerPlanform);
this.platforms.push(this.harPlanform); this.platforms.push(this.harPlanform);
this.platforms.push(this.jmeterPlatform);
this.selectedPlatform = this.platforms[0]; this.selectedPlatform = this.platforms[0];
}, },
watch: { watch: {
@ -381,7 +389,7 @@
} }
.header-bar { .header-bar {
padding: 10px 30px; padding: 10px 15px;
} }
.api-import >>> .el-dialog__body { .api-import >>> .el-dialog__body {