refactor(接口测试): 执行过程堆内存占用过高优化

--bug=1018675 --user=赵勇 【接口测试】接口自动化中调试大量请求的场景环境会挂掉 https://www.tapd.cn/55049933/s/1274820
This commit is contained in:
fit2-zhao 2022-10-24 17:33:54 +08:00 committed by f2c-ci-robot[bot]
parent 541770cb41
commit 2108e9ef93
1 changed files with 47 additions and 24 deletions

View File

@ -28,6 +28,7 @@ import java.util.Map;
public class MsApiBackendListener extends AbstractBackendListenerClient implements Serializable {
private ApiExecutionQueueService apiExecutionQueueService;
private TestResultService testResultService;
private List<SampleResult> queues;
private ResultDTO dto;
@ -39,47 +40,59 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
LoggerUtil.info("初始化监听");
queues = new LinkedList<>();
this.setParam(context);
if (apiExecutionQueueService == null) {
apiExecutionQueueService = CommonBeanFactory.getBean(ApiExecutionQueueService.class);
}
if (testResultService == null) {
testResultService = CommonBeanFactory.getBean(TestResultService.class);
}
super.setupTest(context);
}
@Override
public void handleSampleResults(List<SampleResult> sampleResults, BackendListenerContext context) {
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
public void teardownTest(BackendListenerContext context) {
try {
LoggerUtil.info("进入TEST-END处理报告" + dto.getRunMode(), dto.getReportId());
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())) {
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());
// 整体执行结束更新资源状态
CommonBeanFactory.getBean(TestResultService.class).testEnded(dto);
if (apiExecutionQueueService == null) {
apiExecutionQueueService = CommonBeanFactory.getBean(ApiExecutionQueueService.class);
}
testResultService.testEnded(dto);
if (StringUtils.isNotEmpty(dto.getQueueId())) {
LoggerUtil.info("串行进入下一个执行点", dto.getReportId());
apiExecutionQueueService.queueNext(dto);
}
// 更新测试计划报告
@ -91,6 +104,7 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
} catch (Exception e) {
LoggerUtil.error("结果集处理异常", dto.getReportId(), e);
} finally {
queues.clear();
FileUtils.deleteBodyFiles(dto.getReportId());
if (FileServer.getFileServer() != null) {
LoggerUtil.info("进入监听开始关闭CSV", dto.getReportId());
@ -99,7 +113,6 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen
if (JMeterEngineCache.runningEngine.containsKey(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));
}
}
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;
}
}