提交 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 com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
...@@ -66,7 +67,7 @@ public class CaseActuator implements Actuator { ...@@ -66,7 +67,7 @@ public class CaseActuator implements Actuator {
* @param envId 环境ID * @param envId 环境ID
* 执行测试用例,这个方法对内使用,由其他执行器调用 * 执行测试用例,这个方法对内使用,由其他执行器调用
*/ */
public TestCaseExecuteResult executeTestCase(TestCaseBTO testCaseBto, Long envId, Long projectId) { public TestDataExecuteResult executeTestCase(TestCaseBTO testCaseBto, Long envId, Long projectId) {
try { try {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "开始执行用例!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "开始执行用例!!");
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, String.format("当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName())); LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, String.format("当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName()));
...@@ -75,6 +76,7 @@ public class CaseActuator implements Actuator { ...@@ -75,6 +76,7 @@ public class CaseActuator implements Actuator {
, envId, projectId, null, MoveStrategy.PRE_MOVE); , envId, projectId, null, MoveStrategy.PRE_MOVE);
//向线程中设置当前正在执行的DataId //向线程中设置当前正在执行的DataId
LogQueueRuntime.setTestData(testCaseBto.getTestData().getId()); LogQueueRuntime.setTestData(testCaseBto.getTestData().getId());
LocalDateTime dataStartTime = LocalDateTime.now();
//执行测试用例的本体内容 //执行测试用例的本体内容
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail( HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail(
envId, envId,
...@@ -93,15 +95,18 @@ public class CaseActuator implements Actuator { ...@@ -93,15 +95,18 @@ public class CaseActuator implements Actuator {
//执行后置动作 //执行后置动作
executeMove(testCaseBto.getTestCase().getMoveAfterTest() executeMove(testCaseBto.getTestCase().getMoveAfterTest()
, envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.AFT_MOVE); , envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.AFT_MOVE);
TestCaseExecuteResult testCaseExecuteResult = new TestCaseExecuteResult( TestDataExecuteResult testDataExecuteResult = new TestDataExecuteResult(
dataStartTime,
LocalDateTime.now(),
true,
testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getId(),
testCaseBto.getTestData().getId(), testCaseBto.getTestData().getId(),
baseTestCaseResponseDetail, baseTestCaseResponseDetail,
checkPointResult); checkPointResult);
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, JSON.toJSONString(testCaseExecuteResult)); LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, JSON.toJSONString(testDataExecuteResult));
//将线程中正在执行的DataId清除 //将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData(); LogQueueRuntime.clearTestData();
return testCaseExecuteResult; return testDataExecuteResult;
} finally { } finally {
LogQueueRuntime.remove(ThreadUtil.currentThreadId()); LogQueueRuntime.remove(ThreadUtil.currentThreadId());
} }
...@@ -111,27 +116,30 @@ public class CaseActuator implements Actuator { ...@@ -111,27 +116,30 @@ public class CaseActuator implements Actuator {
/** /**
* 执行一条测试用例的多条测试数据 * 执行一条测试用例的多条测试数据
*/ */
public List<TestCaseExecuteResult> executeTestCases(TestCaseListDataBto testCaseBto, Long envId, Long projectId) { public List<TestDataExecuteResult> executeTestCases(TestCaseListDataBto testCaseBto, Long envId, Long projectId) {
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, "开始执行用例!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行用例!!");
List<TestDataExecuteResult> resultList = new ArrayList<>();
try { try {
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, String.format("当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName())); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("[用例执行器] 当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName()));
//执行前置动作 //执行前置动作
executeMove(testCaseBto.getTestCase().getMoveAfterCase() executeMove(testCaseBto.getTestCase().getMoveAfterCase()
, envId, projectId, null, MoveStrategy.PRE_MOVE); , envId, projectId, null, MoveStrategy.PRE_MOVE);
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, "开始执行前置动作!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!");
//执行测试用例的本体内容 //执行测试用例的本体内容
List<TestCaseExecuteResult> resultList = new ArrayList<>();
for (TestData testData : testCaseBto.getTestDataList()) { for (TestData testData : testCaseBto.getTestDataList()) {
LocalDateTime dataStartTime = LocalDateTime.now();
//向线程中设置当前正在执行的DataId //向线程中设置当前正在执行的DataId
LogQueueRuntime.setTestData(testData.getId()); LogQueueRuntime.setTestData(testData.getId());
//try catch 一下避免发生错误后导致循环进行不下去
try {
changeExecutionHistoryStatus(ExecutionHistoryStatus.RUN); changeExecutionHistoryStatus(ExecutionHistoryStatus.RUN);
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, "开始执行数据组ID:" + testData.getId()); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR,"[用例执行器] 开始执行数据组ID:" + testData.getId());
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail( HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail(
envId, envId,
projectId, projectId,
testCaseBto.getTestCase(), testCaseBto.getTestCase(),
testData); testData);
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, "即将开始执行中置动作333"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR,"[用例执行器] 即将开始执行中置动作");
//执行中置动作 //执行中置动作
executeMove(testCaseBto.getTestCase().getMoveAfterTest() executeMove(testCaseBto.getTestCase().getMoveAfterTest()
, envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.MID_MOVE); , envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.MID_MOVE);
...@@ -140,24 +148,41 @@ public class CaseActuator implements Actuator { ...@@ -140,24 +148,41 @@ public class CaseActuator implements Actuator {
envId, envId,
projectId, projectId,
baseTestCaseResponseDetail); baseTestCaseResponseDetail);
TestCaseExecuteResult testCaseExecuteResult = new TestCaseExecuteResult( TestDataExecuteResult testDataExecuteResult = new TestDataExecuteResult(
dataStartTime,
LocalDateTime.now(),
true,
testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getId(),
testData.getId(), testData.getId(),
baseTestCaseResponseDetail, baseTestCaseResponseDetail,
checkPointResult checkPointResult
); );
resultList.add(testCaseExecuteResult); resultList.add(testDataExecuteResult);
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, "用例执行结果:" + JSON.toJSONString(testCaseExecuteResult)); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR,"用例执行结果:" + JSON.toJSONString(testDataExecuteResult));
//执行后置动作 //执行后置动作
executeMove(testCaseBto.getTestCase().getMoveAfterTest() executeMove(testCaseBto.getTestCase().getMoveAfterTest()
, envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.AFT_MOVE); , envId, projectId, baseTestCaseResponseDetail.getResponseBody(), MoveStrategy.AFT_MOVE);
changeExecutionHistoryStatus(ExecutionHistoryStatus.FINISH); changeExecutionHistoryStatus(ExecutionHistoryStatus.FINISH);
}catch (Exception e){
e.printStackTrace();
TestDataExecuteResult testDataExecuteResult = new TestDataExecuteResult(
dataStartTime,
LocalDateTime.now(),
true,
testCaseBto.getTestCase().getId(),
testData.getId(),
null,
null
);
resultList.add(testDataExecuteResult);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR,String.format("[用例执行器] 执行数据组ID:%s 数据组名称:%s 产生错误:%s",testData.getId(),testData.getName(),e.getMessage()));
}
} }
return resultList;
}finally { }finally {
//将线程中正在执行的DataId清除 //将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData(); LogQueueRuntime.clearTestData();
} }
return resultList;
} }
/** /**
...@@ -172,6 +197,7 @@ public class CaseActuator implements Actuator { ...@@ -172,6 +197,7 @@ public class CaseActuator implements Actuator {
private void executeMove(String moveString, Long envId, Long projectId, String caseResultData, MoveStrategy strategy) { private void executeMove(String moveString, Long envId, Long projectId, String caseResultData, MoveStrategy strategy) {
String[] moveIds = StringUtils.isEmpty(moveString) ? new String[]{} : moveString.split(","); String[] moveIds = StringUtils.isEmpty(moveString) ? new String[]{} : moveString.split(",");
for (String moveId : moveIds) { for (String moveId : moveIds) {
if (!StringUtils.isEmpty(moveId)){
getMoveActuator().runMove( getMoveActuator().runMove(
Long.valueOf(moveId), Long.valueOf(moveId),
envId, envId,
...@@ -180,6 +206,8 @@ public class CaseActuator implements Actuator { ...@@ -180,6 +206,8 @@ public class CaseActuator implements Actuator {
strategy strategy
); );
} }
}
} }
private CheckPointResult getCheckPointResult(TestCase testCase private CheckPointResult getCheckPointResult(TestCase testCase
...@@ -228,11 +256,16 @@ public class CaseActuator implements Actuator { ...@@ -228,11 +256,16 @@ public class CaseActuator implements Actuator {
* 外界如果执行测试用例的话请走这个接口,执行TestCase,并控制运行态日志池,进行日志的生成。 * 外界如果执行测试用例的话请走这个接口,执行TestCase,并控制运行态日志池,进行日志的生成。
*/ */
public RunCaseResult runTestCase(WebSocketSession session, CaseExecuteVo caseExecuteVo) { public RunCaseResult runTestCase(WebSocketSession session, CaseExecuteVo caseExecuteVo) {
String uniqueKey = UUID.randomUUID().toString();
caseExecuteVo.setUniqueKey(uniqueKey);
RunCaseResult runCaseResult = new RunCaseResult(); RunCaseResult runCaseResult = new RunCaseResult();
runCaseResult.setStartTime(LocalDateTime.now());
runCaseResult.setJobId(caseExecuteVo.getJobId()); runCaseResult.setJobId(caseExecuteVo.getJobId());
String uniqueKey = UUID.randomUUID().toString();
Long currentThreadId = ThreadUtil.currentThreadId(); Long currentThreadId = ThreadUtil.currentThreadId();
try { try {
if (session!=null&&session.isOpen()){
session.sendMessage(new TextMessage(JSONObject.toJSONString(caseExecuteVo)));
}
//将websocketSession 加入到socket池子中 //将websocketSession 加入到socket池子中
TestCaseExecuteSocketPool.add(currentThreadId, session); TestCaseExecuteSocketPool.add(currentThreadId, session);
List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList(); List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList();
...@@ -244,8 +277,9 @@ public class CaseActuator implements Actuator { ...@@ -244,8 +277,9 @@ public class CaseActuator implements Actuator {
} }
//建立执行历史(ExecutionHistory) //建立执行历史(ExecutionHistory)
insertExecutionHistory(uniqueKey, caseExecuteVo); insertExecutionHistory(uniqueKey, caseExecuteVo);
Map<Long,List<TestCaseExecuteResult>> resultMap= new HashMap<>();
for (TestCaseListDataBto testCaseListDataBto : testCaseListDataBtoList) { for (TestCaseListDataBto testCaseListDataBto : testCaseListDataBtoList) {
LocalDateTime caseStartTime = LocalDateTime.now();
try {
LogQueueRuntime LogQueueRuntime
.initTestCaseLog( .initTestCaseLog(
caseExecuteVo.getJobId(), caseExecuteVo.getJobId(),
...@@ -256,18 +290,27 @@ public class CaseActuator implements Actuator { ...@@ -256,18 +290,27 @@ public class CaseActuator implements Actuator {
); );
//执行测试用例 //执行测试用例
if (testCaseListDataBto.getTestDataList()!=null&&testCaseListDataBto.getTestDataList().size()>0){ if (testCaseListDataBto.getTestDataList()!=null&&testCaseListDataBto.getTestDataList().size()>0){
List<TestCaseExecuteResult> resultList = executeTestCases(testCaseListDataBto, caseExecuteVo.getEnvId(), caseExecuteVo.getProjectId()); List<TestDataExecuteResult> resultList =
resultMap.put(testCaseListDataBto.getTestCase().getId(),resultList); executeTestCases(testCaseListDataBto, caseExecuteVo.getEnvId(), caseExecuteVo.getProjectId());
runCaseResult.setExecutionMap(resultMap); TestCaseReport testCaseReport = new TestCaseReport(
caseStartTime,LocalDateTime.now(),testCaseListDataBto.getTestCase().getId(),true,resultList
);
runCaseResult.getCaseReports().add(testCaseReport);
}
}catch (Exception e){
TestCaseReport testCaseReport = new TestCaseReport(
caseStartTime,LocalDateTime.now(),testCaseListDataBto.getTestCase().getId(),false,null
);
runCaseResult.getCaseReports().add(testCaseReport);
} }
} }
} catch (GlobalException e) { } catch (GlobalException | IOException e) {
e.printStackTrace(); e.printStackTrace();
try { try {
if (session != null && session.isOpen()) { if (session != null && session.isOpen()) {
TestExecuteLog currentTestExecute = LogQueueRuntime.getCurrentTestExecute(ThreadUtil.currentThreadId()); TestExecuteLog currentTestExecute = LogQueueRuntime.getCurrentTestExecute(ThreadUtil.currentThreadId());
if (currentTestExecute!=null){ if (currentTestExecute!=null){
LogQueueRuntime.addNewLog(this.getClass(),CASE_ACTUATOR, e.getMessage()); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR,e.getMessage());
}else { }else {
//这里加-1.-1.-1是用来表明这里发出去的数据是不属于任何执行中的用例的 //这里加-1.-1.-1是用来表明这里发出去的数据是不属于任何执行中的用例的
session.sendMessage(new TextMessage(String.format("-1.-1.-1.%s", e.getMessage()))); session.sendMessage(new TextMessage(String.format("-1.-1.-1.%s", e.getMessage())));
...@@ -277,6 +320,7 @@ public class CaseActuator implements Actuator { ...@@ -277,6 +320,7 @@ public class CaseActuator implements Actuator {
ioException.printStackTrace(); ioException.printStackTrace();
} }
} finally { } finally {
runCaseResult.setEndTime(LocalDateTime.now());
//将数据库中的执行历史状态设置为完成 //将数据库中的执行历史状态设置为完成
endExecutionHistory(); endExecutionHistory();
//将本次产生的数据清除 //将本次产生的数据清除
...@@ -284,7 +328,7 @@ public class CaseActuator implements Actuator { ...@@ -284,7 +328,7 @@ public class CaseActuator implements Actuator {
//将本次产生的日志从执行状态设为停止状态 //将本次产生的日志从执行状态设为停止状态
LogQueueRuntime.remove(currentThreadId); LogQueueRuntime.remove(currentThreadId);
} }
return null; return runCaseResult;
} }
public void insertExecutionHistory(String uniqueKey, CaseExecuteVo caseExecuteVo) { public void insertExecutionHistory(String uniqueKey, CaseExecuteVo caseExecuteVo) {
......
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论