refactor(接口测试): 执行过程堆内存占用过高优化
--bug=1018675 --user=赵勇 【接口测试】接口自动化中调试大量请求的场景环境会挂掉 https://www.tapd.cn/55049933/s/1274820
This commit is contained in:
parent
2450285837
commit
4d2919bb87
|
@ -28,6 +28,7 @@ import java.util.Map;
|
||||||
|
|
||||||
public class MsApiBackendListener extends AbstractBackendListenerClient implements Serializable {
|
public class MsApiBackendListener extends AbstractBackendListenerClient implements Serializable {
|
||||||
private ApiExecutionQueueService apiExecutionQueueService;
|
private ApiExecutionQueueService apiExecutionQueueService;
|
||||||
|
private TestResultService testResultService;
|
||||||
private List<SampleResult> queues;
|
private List<SampleResult> queues;
|
||||||
private ResultDTO dto;
|
private ResultDTO dto;
|
||||||
|
|
||||||
|
@ -39,47 +40,59 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
|
||||||
LoggerUtil.info("初始化监听");
|
LoggerUtil.info("初始化监听");
|
||||||
queues = new LinkedList<>();
|
queues = new LinkedList<>();
|
||||||
this.setParam(context);
|
this.setParam(context);
|
||||||
|
if (apiExecutionQueueService == null) {
|
||||||
|
apiExecutionQueueService = CommonBeanFactory.getBean(ApiExecutionQueueService.class);
|
||||||
|
}
|
||||||
|
if (testResultService == null) {
|
||||||
|
testResultService = CommonBeanFactory.getBean(TestResultService.class);
|
||||||
|
}
|
||||||
super.setupTest(context);
|
super.setupTest(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleSampleResults(List<SampleResult> sampleResults, BackendListenerContext context) {
|
public void handleSampleResults(List<SampleResult> sampleResults, BackendListenerContext context) {
|
||||||
LoggerUtil.info("接收到JMETER执行数据【" + sampleResults.size() + " 】", dto.getReportId());
|
LoggerUtil.info("接收到JMETER执行数据【" + sampleResults.size() + " 】", dto.getReportId());
|
||||||
queues.addAll(sampleResults);
|
if (dto.isRetryEnable()) {
|
||||||
|
queues.addAll(sampleResults);
|
||||||
|
} else {
|
||||||
|
if (!StringUtils.equals(dto.getReportType(), RunModeConstants.SET_REPORT.toString())) {
|
||||||
|
dto.setConsole(FixedCapacityUtil.getJmeterLogger(getReportId(), false));
|
||||||
|
}
|
||||||
|
sampleResults = RetryResultUtil.clearLoops(sampleResults);
|
||||||
|
JMeterBase.resultFormatting(sampleResults, dto);
|
||||||
|
testResultService.saveResults(dto);
|
||||||
|
sampleResults.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void teardownTest(BackendListenerContext context) {
|
public void teardownTest(BackendListenerContext context) {
|
||||||
try {
|
try {
|
||||||
|
LoggerUtil.info("进入TEST-END处理报告" + dto.getRunMode(), dto.getReportId());
|
||||||
super.teardownTest(context);
|
super.teardownTest(context);
|
||||||
// 清理过程步骤
|
// 获取执行日志
|
||||||
queues = RetryResultUtil.clearLoops(queues);
|
|
||||||
JMeterBase.resultFormatting(queues, dto);
|
|
||||||
if (dto.isRetryEnable()) {
|
|
||||||
LoggerUtil.info("重试结果处理【" + dto.getReportId() + " 】开始");
|
|
||||||
RetryResultUtil.mergeRetryResults(dto.getRequestResults());
|
|
||||||
LoggerUtil.info("重试结果处理【" + dto.getReportId() + " 】结束");
|
|
||||||
}
|
|
||||||
String reportId = dto.getReportId();
|
|
||||||
if (StringUtils.isNotEmpty(dto.getTestPlanReportId())
|
|
||||||
&& !FixedCapacityUtil.containsKey(dto.getTestPlanReportId())
|
|
||||||
&& StringUtils.equals(dto.getReportType(), RunModeConstants.SET_REPORT.toString())) {
|
|
||||||
reportId = dto.getTestPlanReportId();
|
|
||||||
}
|
|
||||||
if (!StringUtils.equals(dto.getReportType(), RunModeConstants.SET_REPORT.toString())) {
|
if (!StringUtils.equals(dto.getReportType(), RunModeConstants.SET_REPORT.toString())) {
|
||||||
dto.setConsole(FixedCapacityUtil.getJmeterLogger(reportId, true));
|
dto.setConsole(FixedCapacityUtil.getJmeterLogger(getReportId(), true));
|
||||||
|
}
|
||||||
|
if (dto.isRetryEnable()) {
|
||||||
|
LoggerUtil.info("重试结果处理开始", dto.getReportId());
|
||||||
|
// 清理过程步骤
|
||||||
|
queues = RetryResultUtil.clearLoops(queues);
|
||||||
|
JMeterBase.resultFormatting(queues, dto);
|
||||||
|
|
||||||
|
LoggerUtil.info("合并重试结果集", dto.getReportId());
|
||||||
|
RetryResultUtil.mergeRetryResults(dto.getRequestResults());
|
||||||
|
|
||||||
|
LoggerUtil.info("执行结果入库存储", dto.getReportId());
|
||||||
|
testResultService.saveResults(dto);
|
||||||
|
LoggerUtil.info("重试结果处理结束", dto.getReportId());
|
||||||
}
|
}
|
||||||
// 入库存储
|
|
||||||
CommonBeanFactory.getBean(TestResultService.class).saveResults(dto);
|
|
||||||
LoggerUtil.info("进入TEST-END处理报告【" + dto.getReportId() + " 】" + dto.getRunMode() + " 整体执行完成");
|
|
||||||
// 全局并发队列
|
// 全局并发队列
|
||||||
PoolExecBlockingQueueUtil.offer(dto.getReportId());
|
PoolExecBlockingQueueUtil.offer(dto.getReportId());
|
||||||
// 整体执行结束更新资源状态
|
// 整体执行结束更新资源状态
|
||||||
CommonBeanFactory.getBean(TestResultService.class).testEnded(dto);
|
testResultService.testEnded(dto);
|
||||||
if (apiExecutionQueueService == null) {
|
|
||||||
apiExecutionQueueService = CommonBeanFactory.getBean(ApiExecutionQueueService.class);
|
|
||||||
}
|
|
||||||
if (StringUtils.isNotEmpty(dto.getQueueId())) {
|
if (StringUtils.isNotEmpty(dto.getQueueId())) {
|
||||||
|
LoggerUtil.info("串行进入下一个执行点", dto.getReportId());
|
||||||
apiExecutionQueueService.queueNext(dto);
|
apiExecutionQueueService.queueNext(dto);
|
||||||
}
|
}
|
||||||
// 更新测试计划报告
|
// 更新测试计划报告
|
||||||
|
@ -91,6 +104,7 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LoggerUtil.error("结果集处理异常", dto.getReportId(), e);
|
LoggerUtil.error("结果集处理异常", dto.getReportId(), e);
|
||||||
} finally {
|
} finally {
|
||||||
|
queues.clear();
|
||||||
FileUtils.deleteBodyFiles(dto.getReportId());
|
FileUtils.deleteBodyFiles(dto.getReportId());
|
||||||
if (FileServer.getFileServer() != null) {
|
if (FileServer.getFileServer() != null) {
|
||||||
LoggerUtil.info("进入监听,开始关闭CSV", dto.getReportId());
|
LoggerUtil.info("进入监听,开始关闭CSV", dto.getReportId());
|
||||||
|
@ -99,7 +113,6 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
|
||||||
if (JMeterEngineCache.runningEngine.containsKey(dto.getReportId())) {
|
if (JMeterEngineCache.runningEngine.containsKey(dto.getReportId())) {
|
||||||
JMeterEngineCache.runningEngine.remove(dto.getReportId());
|
JMeterEngineCache.runningEngine.remove(dto.getReportId());
|
||||||
}
|
}
|
||||||
queues.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,4 +139,14 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
|
||||||
dto.setExtendedParameters(JSON.parseObject(context.getParameter(BackendListenerConstants.EPT.name()), Map.class));
|
dto.setExtendedParameters(JSON.parseObject(context.getParameter(BackendListenerConstants.EPT.name()), Map.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getReportId() {
|
||||||
|
String reportId = dto.getReportId();
|
||||||
|
if (StringUtils.isNotEmpty(dto.getTestPlanReportId())
|
||||||
|
&& !FixedCapacityUtil.containsKey(dto.getTestPlanReportId())
|
||||||
|
&& StringUtils.equals(dto.getReportType(), RunModeConstants.SET_REPORT.toString())) {
|
||||||
|
reportId = dto.getTestPlanReportId();
|
||||||
|
}
|
||||||
|
return reportId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue