fix(接口测试): 脚本设置环境变量报错

This commit is contained in:
AgAngle 2024-03-22 16:04:10 +08:00 committed by 刘瑞斌
parent d540191a12
commit 0c365ad88f
9 changed files with 26 additions and 17 deletions

View File

@ -41,7 +41,7 @@ public class ApiExecuteResourceController {
@GetMapping("script")
public String getScript(@RequestParam("reportId") String reportId, @RequestParam("testId") String testId) {
String key = apiExecuteService.getScriptRedisKey(reportId, testId);
LogUtils.info("获取执行脚本: ", key);
LogUtils.info("获取执行脚本: {}", key);
String script = stringRedisTemplate.opsForValue().get(key);
stringRedisTemplate.delete(key);
apiReportService.updateReportStatus(reportId, ApiReportStatus.RERUNNING.name());

View File

@ -45,12 +45,13 @@ public class JmeterTestElementParser implements TestElementParser {
name = msTestElement.getName();
final HashTree testPlanTree = hashTree.add(testPlan);
final HashTree groupTree = testPlanTree.add(getThreadGroup());
// 添加 debugSampler
groupTree.add(getDebugSampler());
// 解析 msTestElement
JmeterElementConverterRegister.getConverter(msTestElement.getClass()).toHashTree(groupTree, msTestElement, config);
// 添加 debugSampler放最后才能采集到变量信息
groupTree.add(getDebugSampler());
return getJmx(hashTree);
}

View File

@ -53,7 +53,7 @@ public class MsCommentScriptElementConverter extends AbstractJmeterElementConver
} else {
scriptElement = new BeanShellSampler();
}
ScriptProcessorConverter.parse(scriptElement, scriptProcessor);
ScriptProcessorConverter.parse(scriptElement, scriptProcessor, config);
// 添加公共脚本的参数
Optional.ofNullable(ScriptProcessorConverter.getScriptArguments(scriptProcessor))
.ifPresent(hashTree::add);

View File

@ -22,6 +22,7 @@ public class ScenarioScriptProcessorConverter extends ScriptProcessorConverter {
if (!needParse(scriptProcessor, config) || !scriptProcessor.isValid()) {
return;
}
EnvScenarioScriptProcessor scenarioScriptProcessor = (EnvScenarioScriptProcessor) scriptProcessor;
Boolean associateScenarioResult = scenarioScriptProcessor.getAssociateScenarioResult();
@ -32,7 +33,7 @@ public class ScenarioScriptProcessorConverter extends ScriptProcessorConverter {
processor = new BeanShellSampler();
}
parse(processor, scriptProcessor);
parse(processor, scriptProcessor, config);
// 添加公共脚本的参数
Optional.ofNullable(getScriptArguments(scriptProcessor))

View File

@ -25,7 +25,7 @@ public class ScriptPostProcessorConverter extends ScriptProcessorConverter {
} else {
processor = new BeanShellPostProcessor();
}
parse(processor, scriptProcessor);
parse(processor, scriptProcessor, config);
// 添加公共脚本的参数
Optional.ofNullable(getScriptArguments(scriptProcessor))

View File

@ -25,7 +25,7 @@ public class ScriptPreProcessorConverter extends ScriptProcessorConverter {
} else {
processor = new BeanShellPreProcessor();
}
parse(processor, scriptProcessor);
parse(processor, scriptProcessor, config);
// 添加公共脚本的参数
Optional.ofNullable(getScriptArguments(scriptProcessor))

View File

@ -1,13 +1,16 @@
package io.metersphere.api.parser.jmeter.processor;
import io.metersphere.api.dto.ApiParamConfig;
import io.metersphere.api.parser.jmeter.JmeterTestElementParserHelper;
import io.metersphere.api.parser.jmeter.constants.JmeterAlias;
import io.metersphere.api.parser.jmeter.constants.JmeterProperty;
import io.metersphere.plugin.api.constants.ElementProperty;
import io.metersphere.plugin.api.dto.ParameterConfig;
import io.metersphere.project.api.KeyValueParam;
import io.metersphere.project.api.processor.ScriptProcessor;
import io.metersphere.project.constants.ScriptLanguageType;
import io.metersphere.project.dto.CommonScriptInfo;
import io.metersphere.project.dto.environment.EnvironmentInfoDTO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
@ -27,7 +30,7 @@ public abstract class ScriptProcessorConverter extends MsProcessorConverter<Scri
public static final String ENV_VARIABLE_EXPRESSION = "${__metersphere_env_id}";
public static final String MS_RUNNING_ENV_PREFIX = "MS.ENV.";
public static void parse(TestElement testElement, ScriptProcessor scriptProcessor) {
public static void parse(TestElement testElement, ScriptProcessor scriptProcessor, ParameterConfig config) {
// 脚本安全校验
ScriptFilter.verify(scriptProcessor.getScriptLanguage(), scriptProcessor.getName(), scriptProcessor.getScript());
@ -35,11 +38,15 @@ public abstract class ScriptProcessorConverter extends MsProcessorConverter<Scri
String name = StringUtils.isEmpty(scriptProcessor.getName()) ? scriptProcessor.getClass().getSimpleName() : scriptProcessor.getName();
testElement.setName(name);
// todo 替换环境变量
// String evnId = scriptProcessor.getEnvironmentId();
// if (StringUtils.isNotEmpty(scriptProcessor.getScript())) {
// scriptProcessor.setScript(StringUtils.replace(scriptProcessor.getScript(), ENV_VARIABLE_EXPRESSION, "\"" + MS_RUNNING_ENV_PREFIX + evnId + ".\""));
// }
// 设置环境变量
ApiParamConfig apiParamConfig = (ApiParamConfig) config;
EnvironmentInfoDTO envConfig = apiParamConfig.getEnvConfig(scriptProcessor.getProjectId());
if (envConfig != null) {
String envId = envConfig.getId();
if (StringUtils.isNotEmpty(scriptProcessor.getScript())) {
scriptProcessor.setScript(StringUtils.replace(scriptProcessor.getScript(), ENV_VARIABLE_EXPRESSION, "\"" + MS_RUNNING_ENV_PREFIX + envId + ".\""));
}
}
// python js cache 打开
boolean cacheKey = StringUtils.equalsAny(scriptProcessor.getScriptLanguage(), ScriptLanguageType.PYTHON.name(), ScriptLanguageType.JAVASCRIPT.name());

View File

@ -30,7 +30,7 @@ public class ScriptAssertionConverter extends AssertionConverter<MsScriptAsserti
assertion = new BeanShellAssertion();
}
ScriptProcessor scriptProcessor = BeanUtils.copyBean(new ScriptProcessor(), msAssertion);
ScriptProcessorConverter.parse(assertion, scriptProcessor);
ScriptProcessorConverter.parse(assertion, scriptProcessor, config);
// 添加公共脚本的参数
Optional.ofNullable(ScriptProcessorConverter.getScriptArguments(scriptProcessor))

View File

@ -29,7 +29,7 @@ public class VariableAssertionConverter extends AssertionConverter<MsVariableAss
.filter(this::isValid)
.forEach(variableAssertionItem -> {
if (needParse(variableAssertionItem, config)) {
JSR223Assertion jsr223Assertion = parse2JSR233Assertion(variableAssertionItem);
JSR223Assertion jsr223Assertion = parse2JSR233Assertion(variableAssertionItem, config);
jsr223Assertion.setEnabled(variableAssertionItem.getEnable());
if (BooleanUtils.isFalse(globalEnable)) {
// 如果整体禁用则禁用
@ -45,7 +45,7 @@ public class VariableAssertionConverter extends AssertionConverter<MsVariableAss
return BooleanUtils.isTrue(variableAssertionItem.getEnable()) || config.getParseDisabledElement();
}
private static JSR223Assertion parse2JSR233Assertion(MsVariableAssertion.VariableAssertionItem variableAssertionItem) {
private static JSR223Assertion parse2JSR233Assertion(MsVariableAssertion.VariableAssertionItem variableAssertionItem, ParameterConfig config) {
ScriptProcessor scriptProcessor = new ScriptProcessor();
scriptProcessor.setScript(parse2BeanshellJSR233Script(variableAssertionItem));
@ -57,7 +57,7 @@ public class VariableAssertionConverter extends AssertionConverter<MsVariableAss
scriptProcessor.setScriptLanguage(ScriptLanguageType.GROOVY.name());
JSR223Assertion jsr223Assertion = new JSR223Assertion();
ScriptProcessorConverter.parse(jsr223Assertion, scriptProcessor);
ScriptProcessorConverter.parse(jsr223Assertion, scriptProcessor, config);
return jsr223Assertion;
}