提交 e736019e 编写于 作者: Q q4speed

改为后台增加BackendListener,保证前端生成的jmx独立性

上级 af47f8d9
...@@ -13,19 +13,18 @@ import org.apache.jmeter.visualizers.backend.BackendListenerContext; ...@@ -13,19 +13,18 @@ import org.apache.jmeter.visualizers.backend.BackendListenerContext;
import java.io.Serializable; import java.io.Serializable;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* JMeter BackendListener扩展, jmx脚本中使用 * JMeter BackendListener扩展, jmx脚本中使用
*/ */
public class APIBackendListenerClient extends AbstractBackendListenerClient implements Serializable { public class APIBackendListenerClient extends AbstractBackendListenerClient implements Serializable {
public final static String TEST_ID = "ms.test.id";
private final static String THREAD_SPLIT = " "; private final static String THREAD_SPLIT = " ";
private final static String ID_SPLIT = "-"; private final static String ID_SPLIT = "-";
private final static String TEST_ID = "id";
private final List<SampleResult> queue = new ArrayList<>(); private final List<SampleResult> queue = new ArrayList<>();
private APITestService apiTestService; private APITestService apiTestService;
...@@ -33,11 +32,11 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl ...@@ -33,11 +32,11 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
private APIReportService apiReportService; private APIReportService apiReportService;
// 测试ID // 测试ID
private String id; private String testId;
@Override @Override
public void setupTest(BackendListenerContext context) throws Exception { public void setupTest(BackendListenerContext context) throws Exception {
this.id = context.getParameter(TEST_ID); this.testId = context.getParameter(TEST_ID);
apiTestService = CommonBeanFactory.getBean(APITestService.class); apiTestService = CommonBeanFactory.getBean(APITestService.class);
if (apiTestService == null) { if (apiTestService == null) {
LogUtil.error("apiTestService is required"); LogUtil.error("apiTestService is required");
...@@ -47,6 +46,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl ...@@ -47,6 +46,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
if (apiReportService == null) { if (apiReportService == null) {
LogUtil.error("apiReportService is required"); LogUtil.error("apiReportService is required");
} }
super.setupTest(context);
} }
@Override @Override
...@@ -57,7 +57,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl ...@@ -57,7 +57,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
@Override @Override
public void teardownTest(BackendListenerContext context) throws Exception { public void teardownTest(BackendListenerContext context) throws Exception {
TestResult testResult = new TestResult(); TestResult testResult = new TestResult();
testResult.setTestId(id); testResult.setTestId(testId);
testResult.setTotal(queue.size()); testResult.setTotal(queue.size());
// 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id // 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id
...@@ -99,7 +99,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl ...@@ -99,7 +99,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
testResult.getScenarios().addAll(scenarios.values()); testResult.getScenarios().addAll(scenarios.values());
testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId));
apiTestService.changeStatus(id, APITestStatus.Completed); apiTestService.changeStatus(testId, APITestStatus.Completed);
apiReportService.complete(testResult); apiReportService.complete(testResult);
queue.clear(); queue.clear();
......
...@@ -3,8 +3,10 @@ package io.metersphere.api.jmeter; ...@@ -3,8 +3,10 @@ package io.metersphere.api.jmeter;
import io.metersphere.commons.exception.MSException; import io.metersphere.commons.exception.MSException;
import io.metersphere.config.JmeterProperties; import io.metersphere.config.JmeterProperties;
import io.metersphere.i18n.Translator; import io.metersphere.i18n.Translator;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.save.SaveService; import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.util.JMeterUtils; import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.visualizers.backend.BackendListener;
import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.HashTree;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -19,7 +21,7 @@ public class JMeterService { ...@@ -19,7 +21,7 @@ public class JMeterService {
@Resource @Resource
private JmeterProperties jmeterProperties; private JmeterProperties jmeterProperties;
public void run(InputStream is) { public void run(String testId, InputStream is) {
String JMETER_HOME = jmeterProperties.getHome(); String JMETER_HOME = jmeterProperties.getHome();
String JMETER_PROPERTIES = JMETER_HOME + "/bin/jmeter.properties"; String JMETER_PROPERTIES = JMETER_HOME + "/bin/jmeter.properties";
JMeterUtils.loadJMeterProperties(JMETER_PROPERTIES); JMeterUtils.loadJMeterProperties(JMETER_PROPERTIES);
...@@ -27,6 +29,7 @@ public class JMeterService { ...@@ -27,6 +29,7 @@ public class JMeterService {
try { try {
Object scriptWrapper = SaveService.loadElement(is); Object scriptWrapper = SaveService.loadElement(is);
HashTree testPlan = getHashTree(scriptWrapper); HashTree testPlan = getHashTree(scriptWrapper);
addBackendListener(testId, testPlan);
LocalRunner runner = new LocalRunner(testPlan); LocalRunner runner = new LocalRunner(testPlan);
runner.run(); runner.run();
...@@ -40,4 +43,14 @@ public class JMeterService { ...@@ -40,4 +43,14 @@ public class JMeterService {
field.setAccessible(true); field.setAccessible(true);
return (HashTree) field.get(scriptWrapper); return (HashTree) field.get(scriptWrapper);
} }
private void addBackendListener(String testId, HashTree testPlan) {
BackendListener backendListener = new BackendListener();
backendListener.setName(testId);
Arguments arguments = new Arguments();
arguments.addArgument(APIBackendListenerClient.TEST_ID, testId);
backendListener.setArguments(arguments);
backendListener.setClassname(APIBackendListenerClient.class.getCanonicalName());
testPlan.add(testPlan.getArray()[0], backendListener);
}
} }
...@@ -90,7 +90,7 @@ public class APITestService { ...@@ -90,7 +90,7 @@ public class APITestService {
String reportId = apiReportService.create(get(request.getId())); String reportId = apiReportService.create(get(request.getId()));
changeStatus(request.getId(), APITestStatus.Running); changeStatus(request.getId(), APITestStatus.Running);
jMeterService.run(is); jMeterService.run(request.getId(), is);
return reportId; return reportId;
} }
......
...@@ -386,7 +386,6 @@ class JMXGenerator { ...@@ -386,7 +386,6 @@ class JMXGenerator {
let testPlan = new TestPlan(test.name); let testPlan = new TestPlan(test.name);
this.addScenarios(testPlan, test.scenarioDefinition); this.addScenarios(testPlan, test.scenarioDefinition);
this.addBackendListener(testPlan, test.id);
this.jmeterTestPlan = new JMeterTestPlan(); this.jmeterTestPlan = new JMeterTestPlan();
this.jmeterTestPlan.put(testPlan); this.jmeterTestPlan.put(testPlan);
...@@ -424,12 +423,6 @@ class JMXGenerator { ...@@ -424,12 +423,6 @@ class JMXGenerator {
}) })
} }
addBackendListener(testPlan, testId) {
let className = 'io.metersphere.api.jmeter.APIBackendListenerClient';
let args = [new KeyValue("id", testId)];
testPlan.put(new BackendListener(testId, className, args));
}
addScenarioVariables(threadGroup, scenario) { addScenarioVariables(threadGroup, scenario) {
let args = this.replaceKV(scenario.variables); let args = this.replaceKV(scenario.variables);
if (args.length > 0) { if (args.length > 0) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册