提交 5320067f authored 作者: 黄夏豪's avatar 黄夏豪

fix(base): 修复了一些执行器会异常终端的BUG

fix(base): 修改了执行器的返回值 fix(base): 修改了日志的发送格式
上级 a207f824
package org.matrix.actuators.usecase;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Duration;
import java.time.LocalDateTime;
/**
* 为其他需要计算时间的类提供公共服务
*
* @author huangxiahao
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseTime {
LocalDateTime startTime;
LocalDateTime endTime;
public Long getDurationTimeMillis() {
Duration duration = Duration.between(startTime, endTime);
return duration.toMillis();
}
public String getDurationTimeStr() {
Duration duration = Duration.between(startTime, endTime);
long days = duration.toDays();
long hours = duration.toHours();
long minutes = duration.toMinutes();
long millis = duration.toMillis();
return days + "天:" + hours + " 小时:" + minutes + " 分钟:" + millis + " 毫秒:";
}
}
package org.matrix.actuators.usecase;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.HashMap;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 当用户执行了一组测试用例后,会返回这个对象
* @author huangxiahao
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class RunCaseResult {
public class RunCaseResult extends BaseTime{
private Long jobId;
/**
* Key为caseId,List为case下的每一个执行结果
*/
private Map<Long, List<TestCaseExecuteResult>> executionMap= new HashMap<>();
private List<TestCaseReport> caseReports= new ArrayList<>();
}
package org.matrix.actuators.usecase;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 当用户执行了一组测试用例后,会返回这个对象
* @author huangxiahao
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class TestCaseReport extends BaseTime{
private Long caseId;
/**
* 执行状态
*/
private Boolean status;
/**
* case下的每一个执行结果
*/
private List<TestDataExecuteResult> dataExecuteResults = new ArrayList<>();
public TestCaseReport(LocalDateTime startTime, LocalDateTime endTime, Long caseId, Boolean status, List<TestDataExecuteResult> dataExecuteResults) {
super(startTime, endTime);
this.caseId = caseId;
this.status = status;
this.dataExecuteResults = dataExecuteResults;
}
}
......@@ -2,16 +2,22 @@ package org.matrix.actuators.usecase;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.matrix.actuators.checkpoint.CheckPointResult;
import java.time.LocalDateTime;
/**
* @author huangxiahao
*/
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestCaseExecuteResult {
public class TestDataExecuteResult extends BaseTime{
private Boolean executionStatus ;
private Long caseId;
......@@ -21,4 +27,13 @@ public class TestCaseExecuteResult {
private CheckPointResult checkPointResult;
public TestDataExecuteResult(LocalDateTime startTime, LocalDateTime endTime, Boolean executionStatus, Long caseId, Long dataId, BaseTestCaseResponseDetail baseTestCaseRequestDetail, CheckPointResult checkPointResult) {
super(startTime, endTime);
this.executionStatus = executionStatus;
this.caseId = caseId;
this.dataId = dataId;
this.baseTestCaseRequestDetail = baseTestCaseRequestDetail;
this.checkPointResult = checkPointResult;
}
}
......@@ -2,7 +2,7 @@ package org.matrix.database.controller;
import com.alibaba.fastjson.JSONObject;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.actuators.usecase.TestCaseExecuteResult;
import org.matrix.actuators.usecase.TestDataExecuteResult;
import org.matrix.database.entity.ExecutionRecord;
import org.matrix.database.entity.TestCase;
import org.matrix.database.entity.TestCaseBTO;
......@@ -133,7 +133,7 @@ public class TestController {
TestCaseBTO testCaseBTO = new TestCaseBTO();
testCaseBTO.setTestCase(testCase);
testCaseBTO.setTestData(testData);
TestCaseExecuteResult testCaseExecuteResult = caseActuator.executeTestCase(testCaseBTO, 1L, 1L);
System.out.println(testCaseExecuteResult);
TestDataExecuteResult testDataExecuteResult = caseActuator.executeTestCase(testCaseBTO, 1L, 1L);
System.out.println(testDataExecuteResult);
}
}
......@@ -40,6 +40,8 @@ public class ExecutionHistory extends BaseEntity {
private Long executionKey;
private String url;
private ExecutionHistoryStatus status = ExecutionHistoryStatus.READY;
/**
......
......@@ -38,6 +38,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tkeh.data_id dataId,\n" +
"\tkeh.job_id jobId,\n" +
"\tkeh.execution_key executionKey,\n" +
"\tkeh.url url,\n" +
"\tIF(MIN( keh.`status` )= 0 or MIN( keh.`status` ) = 1,1,MAX(keh.`status`)) `status`,\n" +
"\tktc.`name` caseName,\n" +
"\tktd.`name` dataName," +
......@@ -79,6 +80,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tkeh.case_id caseId,\n" +
"\tkeh.data_id dataId,\n" +
"\tkeh.job_id jobId,\n" +
"\tkeh.url url,\n" +
"\tkeh.execution_key executionKey,\n" +
"IF\n" +
"\t(\n" +
......
......@@ -29,8 +29,9 @@ public interface IExecutionRecordService extends IService<ExecutionRecord> {
* 新增执行记录日志
* @param testExecuteLog 用例日志临时存储对象
* @param log 日志内容
* @return 刚才新增的东西
*/
void addExecutionRecord(TestExecuteLog testExecuteLog,String log);
ExecutionRecord addExecutionRecord(TestExecuteLog testExecuteLog,String log);
/**
* 根据uniqueKey将对应的执行记录修改为目标状态
......
......@@ -25,11 +25,12 @@ public class ExecutionRecordImpl extends ServiceImpl<ExecutionRecordMapper, Exec
IDataSourceService iDataSourceService;
@Override
public void addExecutionRecord(TestExecuteLog testExecuteLog,String log) {
public ExecutionRecord addExecutionRecord(TestExecuteLog testExecuteLog,String log) {
ExecutionRecord executionRecord = new ExecutionRecord();
BeanUtils.copyProperties(testExecuteLog,executionRecord);
executionRecord.setLog(log);
this.save(executionRecord);
return executionRecord;
}
@Transactional(rollbackFor = Exception.class)
......
......@@ -27,4 +27,6 @@ public class ExecutionHistoryVo extends ExecutionHistory {
private LocalDateTime endTime;
private String url;
}
......@@ -94,7 +94,6 @@ public class ExecutionSocketHandler extends TextWebSocketHandler {
if (testCaseList.size()>0){
caseExecuteVo.setProjectId(testCaseList.get(0).getProjectId());
}
session.sendMessage(new TextMessage(JSONObject.toJSONString(caseExecuteVo)));
caseActuator.runTestCase(session, caseExecuteVo);
} else if (SocketType.TEST_CASE_MONITOR.equals(socketVo.getSocketType())) {
ExecuteMonitorVo caseExecuteVo = JSON.parseObject(payload, ExecuteMonitorVo.class);
......
......@@ -5,6 +5,7 @@ import cn.hutool.log.level.Level;
import com.alibaba.fastjson.JSONObject;
import org.matrix.actuators.sql.SqlExpActuator;
import org.matrix.actuators.util.ThreadUtil;
import org.matrix.database.entity.ExecutionRecord;
import org.matrix.database.service.IExecutionRecordService;
import org.matrix.enums.ModuleType;
import org.matrix.exception.GlobalException;
......@@ -41,8 +42,8 @@ public class LogQueueRuntime {
return EXECUTION_RECORD_SERVICE;
}
public static void addExecutionRecord(TestExecuteLog testExecuteLog,String log){
getExecutionRecordService().addExecutionRecord(testExecuteLog,log);
public static ExecutionRecord addExecutionRecord(TestExecuteLog testExecuteLog,String log){
return getExecutionRecordService().addExecutionRecord(testExecuteLog, log);
}
......@@ -71,8 +72,9 @@ public class LogQueueRuntime {
TestExecuteLog testExecuteLog = LOG_MAP.get(currentThreadId);
if (testExecuteLog !=null){
testExecuteLog.addLog(logMsg);
sendMessage(currentThreadId,testExecuteLog.getUniqueKey(),logMsg);
addExecutionRecord(testExecuteLog,logString);
String messageToDb = JSONObject.toJSONString(logMsg);
ExecutionRecord executionRecord = addExecutionRecord(testExecuteLog, messageToDb);
sendMessage(currentThreadId,testExecuteLog.getUniqueKey(),executionRecord.getId(),messageToDb);
}else {
throw new GlobalException("该线程中的TestCaseLog对象未初始化,请先调用put方法初始化对象");
}
......@@ -82,18 +84,19 @@ public class LogQueueRuntime {
LOG_MAP.remove(threadId);
}
public static void sendMessage(Long threadId,String uniqueKey, Object log) {
public static void sendMessage(Long threadId,String uniqueKey,Long logId, String log) {
try {
TestExecuteLog testExecuteLog = LOG_MAP.get(threadId);
// 测试任务ID.测试用例ID.测试数据ID
String message = JSONObject.toJSONString(log);
String logMessage =
String.format(
"%s.%s.%s.%s"
"%s.%s.%s.%s.%s"
,testExecuteLog.getTestJobId()
,testExecuteLog.getTestCaseId()
,testExecuteLog.getTestDataId()
,message.substring(1,message.length()-1)
,logId
,message
);
//如果uniqueKey中存在监听的socket则向该socket发送消息
List<WebSocketSession> webSocketSessions = ExecutionSocketHandler.EXECUTE_MONITOR_SOCKET_POOL.get(uniqueKey);
......
......@@ -25,5 +25,7 @@ public class CaseExecuteVo extends SocketVo {
private Long jobId = -1L ;
private String uniqueKey;
private List<TestCaseListDataBto> testCaseListDataBtoList = new ArrayList<>();
}
......@@ -2,7 +2,7 @@ package org.matrix.testNg.xml.reportXml;
import lombok.extern.slf4j.Slf4j;
import org.matrix.actuators.checkpoint.CheckPointResult;
import org.matrix.actuators.usecase.TestCaseExecuteResult;
import org.matrix.actuators.usecase.TestDataExecuteResult;
import org.matrix.database.entity.TestCase;
import org.matrix.database.service.ITestCaseService;
import org.matrix.exception.GlobalException;
......@@ -71,18 +71,18 @@ public class ReporterData {
//工具类
ReportUnits units = new ReportUnits();
for (ITestResult result : sortByTime(map.getAllResults())) {
List<TestCaseExecuteResult> testCaseExecuteResults;
Map<Long, List<TestCaseExecuteResult>> longListMap = ReporterUtils.userResultMap.get(1L);
List<TestDataExecuteResult> testDataExecuteResults;
Map<Long, List<TestDataExecuteResult>> longListMap = ReporterUtils.userResultMap.get(1L);
Set<Long> longs = longListMap.keySet();
for (Long caseId : longs) {
TestCase testCase = java.util.Optional.of(testCaseService.getById(caseId))
.orElseThrow(() -> new GlobalException(String.format("没有找到id = %d 的TestCase", caseId)));
testCaseExecuteResults = ReporterUtils.resultMap.get(caseId);
for (TestCaseExecuteResult testCaseExecuteResult : testCaseExecuteResults) {
testDataExecuteResults = ReporterUtils.resultMap.get(caseId);
for (TestDataExecuteResult testDataExecuteResult : testDataExecuteResults) {
data.setDuration(units.formatDuration(result.getEndMillis()
- result.getStartMillis()));
data.setParams(units.getParams(result));
CheckPointResult checkPointResult = testCaseExecuteResult.getCheckPointResult();
CheckPointResult checkPointResult = testDataExecuteResult.getCheckPointResult();
data.setTestCaseName(testCase.getName());
data.setOutput(Reporter.getOutput(result));
data.setDependMethod(units.getDependMethods(result));
......
......@@ -6,8 +6,6 @@ import org.matrix.BaseBootApplication;
import org.matrix.actuators.checkpoint.CheckPointActuator;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.actuators.usecase.RunCaseResult;
import org.matrix.actuators.usecase.TestCaseExecuteResult;
import org.matrix.database.entity.TestCase;
import org.matrix.database.entity.TestCaseListDataBto;
import org.matrix.database.entity.TestData;
......@@ -15,7 +13,6 @@ import org.matrix.database.service.ITestCaseService;
import org.matrix.database.service.ITestDataService;
import org.matrix.exception.GlobalException;
import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.util.ReporterUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
......@@ -30,8 +27,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import static org.matrix.util.ReporterUtils.resultMap;
/**
* 执行xml测试
......
package org.matrix.util;
import org.matrix.actuators.usecase.TestCaseExecuteResult;
import org.matrix.actuators.usecase.TestDataExecuteResult;
import org.matrix.testNg.web.entity.DataBeansJobVo;
import org.matrix.testNg.web.entity.DataBeansVo;
......@@ -13,9 +13,9 @@ import java.util.Map;
*/
public class ReporterUtils {
public static Map<Long, Map<Long, List<TestCaseExecuteResult>>> userResultMap = new HashMap<>();
public static Map<Long, Map<Long, List<TestDataExecuteResult>>> userResultMap = new HashMap<>();
public static Map<Long, List<TestCaseExecuteResult>> resultMap = new HashMap<>();
public static Map<Long, List<TestDataExecuteResult>> resultMap = new HashMap<>();
public static Map<String, DataBeansVo> map = new HashMap<>();
......
......@@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.actuators.usecase.TestCaseExecuteResult;
import org.matrix.actuators.usecase.TestDataExecuteResult;
import org.matrix.database.entity.TestCase;
import org.matrix.database.entity.TestCaseBTO;
import org.matrix.database.entity.TestData;
......@@ -103,8 +103,8 @@ class CaseActuatorTest {
TestCaseBTO testCaseBTO = new TestCaseBTO();
testCaseBTO.setTestCase(testCase);
testCaseBTO.setTestData(testData);
TestCaseExecuteResult testCaseExecuteResult = caseActuator.executeTestCase(testCaseBTO,1L,1L);
System.out.println(testCaseExecuteResult);
TestDataExecuteResult testDataExecuteResult = caseActuator.executeTestCase(testCaseBTO,1L,1L);
System.out.println(testDataExecuteResult);
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论