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