This commit is contained in:
chenjianxing 2020-12-25 14:33:53 +08:00
commit e89dcafd7e
5 changed files with 64 additions and 26 deletions

View File

@ -82,14 +82,14 @@ public class MsScenario extends MsTestElement {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
// 场景变量 // 场景变量和环境变量
tree.add(arguments(config)); tree.add(arguments(config));
if (CollectionUtils.isNotEmpty(hashTree)) { if (CollectionUtils.isNotEmpty(hashTree)) {
for (MsTestElement el : hashTree) { for (MsTestElement el : hashTree) {
el.toHashTree(tree, el.getHashTree(), config); el.toHashTree(tree, el.getHashTree(), config);
} }
} }
} }
private Arguments arguments(ParameterConfig config) { private Arguments arguments(ParameterConfig config) {

View File

@ -20,13 +20,17 @@ 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.MsJDBCSampler;
import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler; import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler;
import io.metersphere.api.dto.definition.request.timer.MsConstantTimer; import io.metersphere.api.dto.definition.request.timer.MsConstantTimer;
import io.metersphere.api.dto.scenario.KeyValue;
import io.metersphere.api.service.ApiDefinitionService; import io.metersphere.api.service.ApiDefinitionService;
import io.metersphere.base.domain.ApiDefinitionWithBLOBs; import io.metersphere.base.domain.ApiDefinitionWithBLOBs;
import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.LogUtil; import io.metersphere.commons.utils.LogUtil;
import lombok.Data; import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.http.control.AuthManager; import org.apache.jmeter.protocol.http.control.AuthManager;
import org.apache.jmeter.save.SaveService; import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.ListedHashTree; import org.apache.jorphan.collections.ListedHashTree;
@ -77,7 +81,7 @@ public abstract class MsTestElement {
@JSONField(ordinal = 8) @JSONField(ordinal = 8)
private boolean enable = true; private boolean enable = true;
@JSONField(ordinal = 9) @JSONField(ordinal = 9)
private String refType ; private String refType;
@JSONField(ordinal = 10) @JSONField(ordinal = 10)
private LinkedList<MsTestElement> hashTree; private LinkedList<MsTestElement> hashTree;
@ -133,6 +137,22 @@ public abstract class MsTestElement {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
public Arguments addArguments(ParameterConfig config) {
if (config != null && config.getConfig() != null && config.getConfig().getCommonConfig() != null
&& CollectionUtils.isNotEmpty(config.getConfig().getCommonConfig().getVariables())) {
Arguments arguments = new Arguments();
arguments.setEnabled(true);
arguments.setName(name + "Variables");
arguments.setProperty(TestElement.TEST_CLASS, Arguments.class.getName());
arguments.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("ArgumentsPanel"));
config.getConfig().getCommonConfig().getVariables().stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue ->
arguments.addArgument(keyValue.getName(), keyValue.getValue(), "=")
);
return arguments;
}
return null;
}
} }

View File

@ -114,6 +114,11 @@ public class MsHTTPSamplerProxy extends MsTestElement {
config.setConfig(JSONObject.parseObject(environment.getConfig(), EnvironmentConfig.class)); config.setConfig(JSONObject.parseObject(environment.getConfig(), EnvironmentConfig.class));
} }
} }
// 添加环境中的公共变量
Arguments arguments = this.addArguments(config);
if (arguments != null) {
tree.add(this.addArguments(config));
}
try { try {
if (config != null && config.getConfig() != null) { if (config != null && config.getConfig() != null) {
String url = config.getConfig().getHttpConfig().getProtocol() + "://" + config.getConfig().getHttpConfig().getSocket(); String url = config.getConfig().getHttpConfig().getProtocol() + "://" + config.getConfig().getHttpConfig().getSocket();
@ -138,7 +143,7 @@ public class MsHTTPSamplerProxy extends MsTestElement {
envPath += this.getPath(); envPath += this.getPath();
} }
if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) { if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) {
envPath = getRestParameters(URLDecoder.decode(envPath, "UTF-8"), config); envPath = getRestParameters(URLDecoder.decode(envPath, "UTF-8"));
sampler.setPath(envPath); sampler.setPath(envPath);
} }
if (CollectionUtils.isNotEmpty(this.getArguments())) { if (CollectionUtils.isNotEmpty(this.getArguments())) {
@ -155,7 +160,7 @@ public class MsHTTPSamplerProxy extends MsTestElement {
sampler.setProtocol(urlObject.getProtocol()); sampler.setProtocol(urlObject.getProtocol());
if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) { if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) {
sampler.setPath(getRestParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8"), config)); sampler.setPath(getRestParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8")));
} }
if (CollectionUtils.isNotEmpty(this.getArguments())) { if (CollectionUtils.isNotEmpty(this.getArguments())) {
sampler.setPath(getPostQueryParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8"))); sampler.setPath(getPostQueryParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8")));
@ -198,7 +203,19 @@ public class MsHTTPSamplerProxy extends MsTestElement {
} }
} }
private String getRestParameters(String path, ParameterConfig config) { private boolean isVariable(String path, String value) {
Pattern p = Pattern.compile("(\\$\\{)([\\w]+)(\\})");
Matcher m = p.matcher(path);
while (m.find()) {
String group = m.group(2);
if (group.equals(value)) {
return true;
}
}
return false;
}
private String getRestParameters(String path) {
StringBuffer stringBuffer = new StringBuffer(); StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(path); stringBuffer.append(path);
stringBuffer.append("/"); stringBuffer.append("/");
@ -211,7 +228,9 @@ public class MsHTTPSamplerProxy extends MsTestElement {
Matcher m = p.matcher(path); Matcher m = p.matcher(path);
while (m.find()) { while (m.find()) {
String group = m.group(2); String group = m.group(2);
path = path.replace("{" + group + "}", keyValueMap.get(group)); if (!isVariable(path, group)) {
path = path.replace("{" + group + "}", keyValueMap.get(group));
}
} }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();

View File

@ -296,7 +296,6 @@ public class ApiDefinitionService {
if (StringUtils.isNotBlank(request.getType()) && StringUtils.equals(request.getType(), ApiRunMode.API_PLAN.name())) { if (StringUtils.isNotBlank(request.getType()) && StringUtils.equals(request.getType(), ApiRunMode.API_PLAN.name())) {
runMode = ApiRunMode.API_PLAN.name(); runMode = ApiRunMode.API_PLAN.name();
} }
request.getTestElement().getJmx(hashTree);
// 调用执行方法 // 调用执行方法
jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode); jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode);
return request.getId(); return request.getId();

View File

@ -878,6 +878,24 @@ public class JmeterDocumentParser implements DocumentParser {
} }
private void processVariableThroughputTimer(Element variableThroughputTimer) { private void processVariableThroughputTimer(Element variableThroughputTimer) {
Object durations = context.getProperty("duration");
Integer duration;
if (durations instanceof List) {
Object o = ((List<?>) durations).get(0);
duration = (Integer) o;
((List<?>) durations).remove(0);
} else {
duration = (Integer) durations;
}
Object rpsLimits = context.getProperty("rpsLimit");
String rpsLimit;
if (rpsLimits instanceof List) {
Object o = ((List<?>) rpsLimits).get(0);
((List<?>) rpsLimits).remove(0);
rpsLimit = o.toString();
} else {
rpsLimit = rpsLimits.toString();
}
if (variableThroughputTimer.getChildNodes().getLength() > 0) { if (variableThroughputTimer.getChildNodes().getLength() > 0) {
final NodeList childNodes = variableThroughputTimer.getChildNodes(); final NodeList childNodes = variableThroughputTimer.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) { for (int i = 0; i < childNodes.getLength(); i++) {
@ -903,27 +921,9 @@ public class JmeterDocumentParser implements DocumentParser {
stringPropCount++; stringPropCount++;
} else { } else {
stringPropCount = 0; stringPropCount = 0;
Object durations = context.getProperty("duration");// 传入的是分钟数, 需要转化成秒数
Integer duration;
if (durations instanceof List) {
Object o = ((List<?>) durations).get(0);
duration = (Integer) o;
((List<?>) durations).remove(0);
} else {
duration = (Integer) durations;
}
prop.getFirstChild().setNodeValue(String.valueOf(duration)); prop.getFirstChild().setNodeValue(String.valueOf(duration));
continue; continue;
} }
Object rpsLimits = context.getProperty("rpsLimit");
String rpsLimit;
if (rpsLimits instanceof List) {
Object o = ((List<?>) rpsLimits).get(0);
((List<?>) rpsLimits).remove(0);
rpsLimit = o.toString();
} else {
rpsLimit = rpsLimits.toString();
}
prop.getFirstChild().setNodeValue(rpsLimit); prop.getFirstChild().setNodeValue(rpsLimit);
} }
} }