提交 31be1b94 authored 作者: 黄夏豪's avatar 黄夏豪

feat(base): 新增了测试历史中的执行号,以及查询最近一次测试的接口

上级 66841ab6
...@@ -2,7 +2,6 @@ package org.matrix.actuators.move; ...@@ -2,7 +2,6 @@ package org.matrix.actuators.move;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.matrix.actuators.Actuator; import org.matrix.actuators.Actuator;
...@@ -19,7 +18,7 @@ import org.matrix.database.service.ITestDataService; ...@@ -19,7 +18,7 @@ import org.matrix.database.service.ITestDataService;
import org.matrix.database.service.impl.ActionServiceImpl; import org.matrix.database.service.impl.ActionServiceImpl;
import org.matrix.enums.ActionType; import org.matrix.enums.ActionType;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.util.BeanFlattener; import org.matrix.util.BeanFlattener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
...@@ -19,7 +19,7 @@ import org.matrix.database.service.IDynamicVariableService; ...@@ -19,7 +19,7 @@ import org.matrix.database.service.IDynamicVariableService;
import org.matrix.database.service.ITestDataService; import org.matrix.database.service.ITestDataService;
import org.matrix.enums.DynamicVarType; import org.matrix.enums.DynamicVarType;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
package org.matrix.actuators.usecase; package org.matrix.actuators.usecase;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.matrix.actuators.Actuator; import org.matrix.actuators.Actuator;
...@@ -17,7 +18,10 @@ import org.matrix.actuators.httpclient.HttpResponseDetail; ...@@ -17,7 +18,10 @@ import org.matrix.actuators.httpclient.HttpResponseDetail;
import org.matrix.database.service.IExecutionHistoryService; import org.matrix.database.service.IExecutionHistoryService;
import org.matrix.enums.ExecutionHistoryStatus; import org.matrix.enums.ExecutionHistoryStatus;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.*; import org.matrix.socket.pool.TestCaseExecuteSocketPool;
import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.socket.vo.TestExecuteLog;
import org.matrix.util.SpringUtils; import org.matrix.util.SpringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
...@@ -83,7 +87,11 @@ public class CaseActuator implements Actuator { ...@@ -83,7 +87,11 @@ 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(baseTestCaseResponseDetail, checkPointResult); TestCaseExecuteResult testCaseExecuteResult = new TestCaseExecuteResult(
testCaseBto.getTestCase().getId(),
testCaseBto.getTestData().getId(),
baseTestCaseResponseDetail,
checkPointResult);
LogQueueRuntime.addNewLog(JSON.toJSONString(testCaseExecuteResult)); LogQueueRuntime.addNewLog(JSON.toJSONString(testCaseExecuteResult));
//将线程中正在执行的DataId清除 //将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData(); LogQueueRuntime.clearTestData();
...@@ -126,7 +134,12 @@ public class CaseActuator implements Actuator { ...@@ -126,7 +134,12 @@ public class CaseActuator implements Actuator {
envId, envId,
projectId, projectId,
baseTestCaseResponseDetail); baseTestCaseResponseDetail);
TestCaseExecuteResult testCaseExecuteResult = new TestCaseExecuteResult(baseTestCaseResponseDetail, checkPointResult); TestCaseExecuteResult testCaseExecuteResult = new TestCaseExecuteResult(
testCaseBto.getTestCase().getId(),
testData.getId(),
baseTestCaseResponseDetail,
checkPointResult
);
resultList.add(testCaseExecuteResult); resultList.add(testCaseExecuteResult);
LogQueueRuntime.addNewLog("用例执行结果:" + JSON.toJSONString(testCaseExecuteResult)); LogQueueRuntime.addNewLog("用例执行结果:" + JSON.toJSONString(testCaseExecuteResult));
//执行后置动作 //执行后置动作
...@@ -135,8 +148,6 @@ public class CaseActuator implements Actuator { ...@@ -135,8 +148,6 @@ public class CaseActuator implements Actuator {
changeExecutionHistoryStatus(ExecutionHistoryStatus.FINISH); changeExecutionHistoryStatus(ExecutionHistoryStatus.FINISH);
} }
return resultList; return resultList;
} catch (Exception e) {
throw e;
}finally { }finally {
//将线程中正在执行的DataId清除 //将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData(); LogQueueRuntime.clearTestData();
...@@ -217,9 +228,9 @@ public class CaseActuator implements Actuator { ...@@ -217,9 +228,9 @@ public class CaseActuator implements Actuator {
//将websocketSession 加入到socket池子中 //将websocketSession 加入到socket池子中
TestCaseExecuteSocketPool.add(currentThreadId, session); TestCaseExecuteSocketPool.add(currentThreadId, session);
List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList(); List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList();
for (int i = 0; i < testCaseListDataBtoList.size(); i++) { for (TestCaseListDataBto caseListDataBto : testCaseListDataBtoList) {
Long caseProjectId = testCaseListDataBtoList.get(i).getTestCase().getProjectId(); Long caseProjectId = caseListDataBto.getTestCase().getProjectId();
if (!caseExecuteVo.getProjectId().equals(caseProjectId)){ if (!caseExecuteVo.getProjectId().equals(caseProjectId)) {
throw new GlobalException("本次执行中,存在非相同项目的测试用例"); throw new GlobalException("本次执行中,存在非相同项目的测试用例");
} }
} }
...@@ -265,21 +276,55 @@ public class CaseActuator implements Actuator { ...@@ -265,21 +276,55 @@ public class CaseActuator implements Actuator {
public void insertExecutionHistory(String unionKey, CaseExecuteVo caseExecuteVo) { public void insertExecutionHistory(String unionKey, CaseExecuteVo caseExecuteVo) {
List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList(); List<TestCaseListDataBto> testCaseListDataBtoList = caseExecuteVo.getTestCaseListDataBtoList();
Long firstExecutionKey = getExecutionKey(caseExecuteVo);
List<ExecutionHistory> executionHistories = new ArrayList<>();
for (TestCaseListDataBto testCaseListDataBto : testCaseListDataBtoList) { for (TestCaseListDataBto testCaseListDataBto : testCaseListDataBtoList) {
List<TestData> testDataList = testCaseListDataBto.getTestDataList(); List<TestData> testDataList = testCaseListDataBto.getTestDataList();
TestCase testCase = testCaseListDataBto.getTestCase(); TestCase testCase = testCaseListDataBto.getTestCase();
for (int i = 0; i < testDataList.size(); i++) { for (int i = 0; i < testDataList.size(); i++) {
ExecutionHistory executionHistory = new ExecutionHistory(); ExecutionHistory executionHistory = new ExecutionHistory();
executionHistory.setJobId(caseExecuteVo.getJobId()); executionHistory.setJobId(caseExecuteVo.getJobId());
executionHistory.setUserId(caseExecuteVo.getUserId());
executionHistory.setCaseId(testCase.getId()); executionHistory.setCaseId(testCase.getId());
executionHistory.setDataId(testDataList.get(i).getId()); executionHistory.setDataId(testDataList.get(i).getId());
executionHistory.setUnionKey(unionKey); executionHistory.setUnionKey(unionKey);
executionHistory.setExecutionKey(firstExecutionKey);
if (i==0){ if (i==0){
executionHistory.setStartTime(LocalDateTime.now()); executionHistory.setStartTime(LocalDateTime.now());
} }
executionHistoryService.save(executionHistory); executionHistories.add(executionHistory);
} }
} }
Long lastExecutionKey = getExecutionKey(caseExecuteVo);
if (!lastExecutionKey.equals(firstExecutionKey)){
insertExecutionHistory(unionKey, caseExecuteVo);
}
executionHistoryService.saveBatch(executionHistories);
}
/**
* 根据userId,jobId,caseId 往前查一个执行号 并且+1 ,如果jobId等于-1 则根据 userId,jobId,caseId 查否则根据 userId,jobId
* @return 新的执行号
*/
private Long getExecutionKey(CaseExecuteVo caseExecuteVo){
LambdaQueryWrapper<ExecutionHistory> executionHistoryLambdaQueryWrapper = Wrappers.lambdaQuery(ExecutionHistory.class);
executionHistoryLambdaQueryWrapper.eq(ExecutionHistory::getUserId,caseExecuteVo.getUserId());
executionHistoryLambdaQueryWrapper.eq(ExecutionHistory::getJobId,caseExecuteVo.getJobId());
executionHistoryLambdaQueryWrapper.orderByDesc(ExecutionHistory::getId);
executionHistoryLambdaQueryWrapper.last("limit 1");
if (caseExecuteVo.getJobId()==-1L){
TestCaseListDataBto testCaseListDataBto = caseExecuteVo.getTestCaseListDataBtoList().get(0);
if (testCaseListDataBto!=null){
executionHistoryLambdaQueryWrapper.eq(ExecutionHistory::getCaseId,testCaseListDataBto.getTestCase().getId());
}
}
ExecutionHistory one = executionHistoryService.getOne(executionHistoryLambdaQueryWrapper);
if(one!=null && one.getExecutionKey()!=null){
return one.getExecutionKey()+1L;
}else {
return 1L;
}
} }
public void changeExecutionHistoryStatus( public void changeExecutionHistoryStatus(
...@@ -299,6 +344,8 @@ public class CaseActuator implements Actuator { ...@@ -299,6 +344,8 @@ public class CaseActuator implements Actuator {
.eq(ExecutionHistory::getCaseId,currentTestExecute.getTestCaseId()) .eq(ExecutionHistory::getCaseId,currentTestExecute.getTestCaseId())
.eq(ExecutionHistory::getDataId,currentTestExecute.getTestDataId()) .eq(ExecutionHistory::getDataId,currentTestExecute.getTestDataId())
.eq(ExecutionHistory::getUnionKey,currentTestExecute.getUnionKey()) .eq(ExecutionHistory::getUnionKey,currentTestExecute.getUnionKey())
.eq(ExecutionHistory::getUserId,currentTestExecute.getUserId())
); );
} }
} }
...@@ -317,6 +364,7 @@ public class CaseActuator implements Actuator { ...@@ -317,6 +364,7 @@ public class CaseActuator implements Actuator {
.eq(ExecutionHistory::getJobId,currentTestExecute.getTestJobId()) .eq(ExecutionHistory::getJobId,currentTestExecute.getTestJobId())
.eq(ExecutionHistory::getCaseId,currentTestExecute.getTestCaseId()) .eq(ExecutionHistory::getCaseId,currentTestExecute.getTestCaseId())
.eq(ExecutionHistory::getUnionKey,currentTestExecute.getUnionKey()) .eq(ExecutionHistory::getUnionKey,currentTestExecute.getUnionKey())
.eq(ExecutionHistory::getUserId,currentTestExecute.getUserId())
.ne(ExecutionHistory::getStatus,ExecutionHistoryStatus.FINISH) .ne(ExecutionHistory::getStatus,ExecutionHistoryStatus.FINISH)
); );
} }
......
...@@ -13,8 +13,12 @@ import org.matrix.actuators.checkpoint.CheckPointResult; ...@@ -13,8 +13,12 @@ import org.matrix.actuators.checkpoint.CheckPointResult;
@NoArgsConstructor @NoArgsConstructor
public class TestCaseExecuteResult { public class TestCaseExecuteResult {
BaseTestCaseResponseDetail baseTestCaseRequestDetail; private Long caseId;
CheckPointResult checkPointResult; private Long dataId;
private BaseTestCaseResponseDetail baseTestCaseRequestDetail;
private CheckPointResult checkPointResult;
} }
package org.matrix.config; package org.matrix.config;
import com.baomidou.mybatisplus.annotation.DbType; import org.matrix.socket.ExecutionSocketHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.matrix.socket.HttpAuthHandler;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
...@@ -18,13 +14,16 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry ...@@ -18,13 +14,16 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
@EnableWebSocket @EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer { public class WebSocketConfig implements WebSocketConfigurer {
@Autowired private final ExecutionSocketHandler executionSocketHandler;
private HttpAuthHandler httpAuthHandler;
public WebSocketConfig(ExecutionSocketHandler executionSocketHandler) {
this.executionSocketHandler = executionSocketHandler;
}
@Override @Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry registry
.addHandler(httpAuthHandler, "ws") .addHandler(executionSocketHandler, "ws")
.setAllowedOrigins("*"); .setAllowedOrigins("*");
} }
} }
\ No newline at end of file
...@@ -36,6 +36,10 @@ public class ExecutionHistory extends BaseEntity { ...@@ -36,6 +36,10 @@ public class ExecutionHistory extends BaseEntity {
private Long jobId; private Long jobId;
private Long userId;
private Long executionKey;
private ExecutionHistoryStatus status = ExecutionHistoryStatus.READY; private ExecutionHistoryStatus status = ExecutionHistoryStatus.READY;
/** /**
......
...@@ -7,9 +7,7 @@ import lombok.AllArgsConstructor; ...@@ -7,9 +7,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.matrix.enums.ExecutionRecType; import org.matrix.socket.enums.TestExecuteType;
import org.matrix.socket.SocketType;
import org.matrix.socket.TestExecuteType;
/** /**
* @author mry * @author mry
......
...@@ -26,6 +26,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> { ...@@ -26,6 +26,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
* @param page 分页数据 * @param page 分页数据
* @param jobId 测试任务ID * @param jobId 测试任务ID
* @param caseId 用例ID * @param caseId 用例ID
* @param userId 用户ID
* @return 执行记录列表 * @return 执行记录列表
*/ */
@Select("<script>" + @Select("<script>" +
...@@ -35,7 +36,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> { ...@@ -35,7 +36,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" +
"\tIF(MIN(keh.`status`)=0,0,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," +
"\tMIN(keh.create_time) startTime,\n" + "\tMIN(keh.create_time) startTime,\n" +
...@@ -45,6 +46,9 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> { ...@@ -45,6 +46,9 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tLEFT JOIN kt_test_case ktc ON ktc.id = keh.case_id\n" + "\tLEFT JOIN kt_test_case ktc ON ktc.id = keh.case_id\n" +
"\tLEFT JOIN kt_test_data ktd ON ktd.id = keh.data_id" + "\tLEFT JOIN kt_test_data ktd ON ktd.id = keh.data_id" +
"<where>" + "<where>" +
"<if test=\"userId!=null\">\n" +
"and keh.user_id= #{userId} \n" +
" </if>" +
"<if test=\"caseId!=null\">\n" + "<if test=\"caseId!=null\">\n" +
"and keh.case_id= #{caseId} \n" + "and keh.case_id= #{caseId} \n" +
" </if>" + " </if>" +
...@@ -54,6 +58,51 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> { ...@@ -54,6 +58,51 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"</where>" + "</where>" +
"GROUP BY keh.union_key " + "GROUP BY keh.union_key " +
"</script>") "</script>")
IPage<ExecutionHistoryVo> pageByCaseIdAndJobId(IPage<ExecutionHistoryVo> page, Long caseId, Long jobId); IPage<ExecutionHistoryVo> pageByCaseIdAndJobId(IPage<ExecutionHistoryVo> page, Long caseId, Long jobId,Long userId);
/**
* 查出最近一条的执行历史
* @param jobId 测试任务ID
* @param caseId 用例ID
* @param userId 用户ID
* @return 执行记录列表
*/
@Select("<script>" +
"SELECT\n" +
"\tkeh.id,\n" +
"\tkeh.union_key unionKey,\n" +
"\tkeh.case_id caseId,\n" +
"\tkeh.data_id dataId,\n" +
"\tkeh.job_id jobId,\n" +
"IF\n" +
"\t(\n" +
"\tMIN( keh.`status` )= 0 or MIN( keh.`status` ) = 1,\n" +
"\t1,\n" +
"\tMAX( keh.`status` )) `status`,\n" +
"\tktc.`name` caseName,\n" +
"\tktd.`name` dataName,\n" +
"\tMIN( keh.create_time ) startTime,\n" +
"\tMAX( keh.update_time ) endTime \n" +
"FROM\n" +
"\tkt_execution_history keh\n" +
"\tLEFT JOIN kt_test_case ktc ON ktc.id = keh.case_id\n" +
"\tLEFT JOIN kt_test_data ktd ON ktd.id = keh.data_id \n" +
"\t WHERE keh.union_key = ( SELECT union_key FROM kt_execution_history WHERE id IN ( SELECT max( id ) FROM kt_execution_history " +
"<where>" +
"<if test=\"userId!=null\">\n" +
"and user_id= #{userId} \n" +
" </if>" +
"<if test=\"caseId!=null\">\n" +
"and case_id= #{caseId} \n" +
" </if>" +
"<if test=\"jobId!=null\">\n" +
"and job_id= #{jobId} \n" +
" </if>" +
"</where>" +
"GROUP BY case_id ) ) \n" +
"GROUP BY\n" +
"\tkeh.union_key\n" +
"</script>")
ExecutionHistoryVo selectLastExecutionHistoryVo( Long caseId, Long jobId,Long userId);
} }
...@@ -26,4 +26,13 @@ public interface IExecutionHistoryService extends IService<ExecutionHistory> { ...@@ -26,4 +26,13 @@ public interface IExecutionHistoryService extends IService<ExecutionHistory> {
*/ */
IPage<ExecutionHistoryVo> pageExecutionHistoryVoByCaseIdAndJobId(Long caseId, Long jobId, int pageSize, int pageNum); IPage<ExecutionHistoryVo> pageExecutionHistoryVoByCaseIdAndJobId(Long caseId, Long jobId, int pageSize, int pageNum);
/**
* 根据CaseId和JobId 查询对应的最后一次执行记录
* @param jobId 测试任务ID
* @param caseId 用例ID
* @return 执行记录
*/
ExecutionHistoryVo getLastExecutionHistory(Long caseId, Long jobId);
} }
...@@ -3,8 +3,7 @@ package org.matrix.database.service; ...@@ -3,8 +3,7 @@ package org.matrix.database.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.matrix.database.entity.ExecutionRecord; import org.matrix.database.entity.ExecutionRecord;
import org.matrix.enums.ExecutionRecType; import org.matrix.enums.ExecutionRecType;
import org.matrix.socket.TestExecuteLog; import org.matrix.socket.vo.TestExecuteLog;
import org.matrix.socket.TestExecuteType;
/** /**
* @author mry * @author mry
......
package org.matrix.database.service.impl; package org.matrix.database.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.matrix.database.entity.BaseEntity;
import org.matrix.database.entity.ExecutionHistory; import org.matrix.database.entity.ExecutionHistory;
import org.matrix.database.mapper.ExecutionHistoryMapper; import org.matrix.database.mapper.ExecutionHistoryMapper;
import org.matrix.database.service.IExecutionHistoryService; import org.matrix.database.service.IExecutionHistoryService;
import org.matrix.database.vo.ExecutionHistoryVo; import org.matrix.database.vo.ExecutionHistoryVo;
import org.matrix.enums.ExecutionHistoryStatus;
import org.matrix.exception.GlobalException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import static java.util.Comparator.comparingLong;
/** /**
* <p> * <p>
* 服务实现类 * 服务实现类
...@@ -22,7 +34,15 @@ public class ExecutionHistoryServiceImpl extends ServiceImpl<ExecutionHistoryMap ...@@ -22,7 +34,15 @@ public class ExecutionHistoryServiceImpl extends ServiceImpl<ExecutionHistoryMap
@Override @Override
public IPage<ExecutionHistoryVo> pageExecutionHistoryVoByCaseIdAndJobId(Long caseId, Long jobId, int pageNum, int pageSize ) { public IPage<ExecutionHistoryVo> pageExecutionHistoryVoByCaseIdAndJobId(Long caseId, Long jobId, int pageNum, int pageSize ) {
// todo 黄夏豪 等待接入用户ID
Page<ExecutionHistoryVo> page = new Page<>(pageNum, pageSize); Page<ExecutionHistoryVo> page = new Page<>(pageNum, pageSize);
return baseMapper.pageByCaseIdAndJobId(page,caseId,jobId); return baseMapper.pageByCaseIdAndJobId(page,caseId,jobId,1L);
} }
@Override
public ExecutionHistoryVo getLastExecutionHistory(Long caseId, Long jobId) {
return baseMapper.selectLastExecutionHistoryVo(caseId,jobId,1L);
}
} }
...@@ -9,7 +9,7 @@ import org.matrix.database.mapper.ExecutionRecordMapper; ...@@ -9,7 +9,7 @@ import org.matrix.database.mapper.ExecutionRecordMapper;
import org.matrix.database.service.IExecutionRecordService; import org.matrix.database.service.IExecutionRecordService;
import org.matrix.enums.ExecutionRecType; import org.matrix.enums.ExecutionRecType;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.TestExecuteLog; import org.matrix.socket.vo.TestExecuteLog;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
......
...@@ -4,6 +4,11 @@ import com.alibaba.fastjson.JSON; ...@@ -4,6 +4,11 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONException;
import org.matrix.actuators.usecase.CaseActuator; import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.database.service.ITestDataService; import org.matrix.database.service.ITestDataService;
import org.matrix.socket.enums.SocketType;
import org.matrix.socket.pool.ExecuteMonitorSocketPool;
import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.socket.vo.ExecuteMonitorVo;
import org.matrix.socket.vo.SocketVo;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
...@@ -11,28 +16,22 @@ import org.springframework.web.socket.WebSocketSession; ...@@ -11,28 +16,22 @@ import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.handler.TextWebSocketHandler;
/** /**
* webSocket处理 * webSocket处理 调用和执行的日志发送
* *
* @author huangxiahao * @author huangxiahao
*/ */
@Component @Component
public class HttpAuthHandler extends TextWebSocketHandler { public class ExecutionSocketHandler extends TextWebSocketHandler {
final CaseActuator caseActuator; final CaseActuator caseActuator;
final ITestDataService testDataService; final ITestDataService testDataService;
public HttpAuthHandler(CaseActuator caseActuator, ITestDataService testDataService) { public ExecutionSocketHandler(CaseActuator caseActuator, ITestDataService testDataService) {
this.caseActuator = caseActuator; this.caseActuator = caseActuator;
this.testDataService = testDataService; this.testDataService = testDataService;
} }
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
System.out.println("连接成功了");
}
@Override @Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload(); String payload = message.getPayload();
......
package org.matrix.socket;
import org.matrix.socket.pool.ExecuteMonitorSocketPool;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
* webSocket处理
* 订阅用例调试和测试任务执行的
*
* @author huangxiahao
*/
@Component
public class ExecutionStatusMonitorSocketPool extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
ExecuteMonitorSocketPool.remove(session);
}
}
package org.matrix.socket; package org.matrix.socket.enums;
/** /**
* @author huangxiahao * @author huangxiahao
......
package org.matrix.socket; package org.matrix.socket.enums;
/** /**
* @author huangxiahao * @author huangxiahao
......
package org.matrix.socket; package org.matrix.socket.pool;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
...@@ -7,54 +7,64 @@ import java.util.List; ...@@ -7,54 +7,64 @@ import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 订阅执行日志的池子
*
* @author huangxiahao * @author huangxiahao
*/ */
public class ExecuteMonitorSocketPool { public class ExecuteMonitorSocketPool {
/**
* unionKey -> socket队列
* key为unionKey value 为 socket队列
*/
private static final ConcurrentHashMap<String, List<WebSocketSession>> SOCKET_MAP = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, List<WebSocketSession>> SOCKET_MAP = new ConcurrentHashMap<>();
/**
* socketId -> unionKey队列
* key为socketId value 为 unionKey队列
*/
private static final ConcurrentHashMap<String, List<String>> SOCKET_KEY_MAP = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, List<String>> SOCKET_KEY_MAP = new ConcurrentHashMap<>();
public static void add(String key,WebSocketSession clientSocket){ public static void add(String key, WebSocketSession clientSocket) {
if (clientSocket != null &key !=null) { if (clientSocket != null & key != null) {
List<WebSocketSession> webSocketSessions = SOCKET_MAP.get(key); List<WebSocketSession> webSocketSessions = SOCKET_MAP.get(key);
if (webSocketSessions!=null){ if (webSocketSessions != null) {
webSocketSessions.add(clientSocket); webSocketSessions.add(clientSocket);
}else { } else {
webSocketSessions = new ArrayList<>(); webSocketSessions = new ArrayList<>();
webSocketSessions.add(clientSocket); webSocketSessions.add(clientSocket);
SOCKET_MAP.put(key,webSocketSessions); SOCKET_MAP.put(key, webSocketSessions);
} }
addKeyMap(clientSocket.getId(),key); addKeyMap(clientSocket.getId(), key);
} }
} }
public static void addKeyMap(String socketId,String key){ public static void addKeyMap(String socketId, String key) {
if (socketId != null &key !=null) { if (socketId != null & key != null) {
List<String> list = SOCKET_KEY_MAP.get(socketId); List<String> list = SOCKET_KEY_MAP.get(socketId);
if (list!=null){ if (list != null) {
list.add(key); list.add(key);
}else { } else {
list = new ArrayList<>(); list = new ArrayList<>();
list.add(key); list.add(key);
SOCKET_KEY_MAP.put(socketId,list); SOCKET_KEY_MAP.put(socketId, list);
} }
} }
} }
public static void remove(WebSocketSession clientSocket){ public static void remove(WebSocketSession clientSocket) {
List<String> list = SOCKET_KEY_MAP.get(clientSocket.getId()); String socketId = clientSocket.getId();
if (list!=null){ List<String> list = SOCKET_KEY_MAP.get(socketId);
if (list != null) {
for (String s : list) { for (String s : list) {
SOCKET_MAP.get(s).remove(clientSocket); SOCKET_MAP.get(s).remove(clientSocket);
} }
} }
SOCKET_KEY_MAP.remove(socketId);
} }
public static List<WebSocketSession> get(String key) {
public static List<WebSocketSession> get(String key){
return SOCKET_MAP.get(key); return SOCKET_MAP.get(key);
} }
} }
\ No newline at end of file
package org.matrix.socket; package org.matrix.socket.pool;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
......
package org.matrix.socket; package org.matrix.socket.queue;
import cn.hutool.log.LogFactory; import cn.hutool.log.LogFactory;
import cn.hutool.log.level.Level; import cn.hutool.log.level.Level;
...@@ -6,6 +6,10 @@ import com.alibaba.fastjson.JSONObject; ...@@ -6,6 +6,10 @@ import com.alibaba.fastjson.JSONObject;
import org.matrix.actuators.util.ThreadUtil; import org.matrix.actuators.util.ThreadUtil;
import org.matrix.database.service.IExecutionRecordService; import org.matrix.database.service.IExecutionRecordService;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.vo.TestExecuteLog;
import org.matrix.socket.enums.TestExecuteType;
import org.matrix.socket.pool.ExecuteMonitorSocketPool;
import org.matrix.socket.pool.TestCaseExecuteSocketPool;
import org.matrix.util.SpringUtils; import org.matrix.util.SpringUtils;
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
...@@ -105,7 +109,7 @@ public class LogQueueRuntime { ...@@ -105,7 +109,7 @@ public class LogQueueRuntime {
} }
} }
public static void initTestCaseLog(Long jobId,Long userId, Long caseId,TestExecuteType type,String unionKey) { public static void initTestCaseLog(Long jobId, Long userId, Long caseId, TestExecuteType type, String unionKey) {
TestExecuteLog testExecuteLog = new TestExecuteLog(); TestExecuteLog testExecuteLog = new TestExecuteLog();
testExecuteLog.setTestJobId(jobId); testExecuteLog.setTestJobId(jobId);
testExecuteLog.setTestCaseId(caseId); testExecuteLog.setTestCaseId(caseId);
......
package org.matrix.socket; package org.matrix.socket.vo;
import lombok.Data; import lombok.Data;
import org.matrix.database.entity.TestCaseListDataBto; import org.matrix.database.entity.TestCaseListDataBto;
import org.matrix.socket.enums.TestExecuteType;
import java.util.List; import java.util.List;
......
package org.matrix.socket; package org.matrix.socket.vo;
import lombok.Data; import lombok.Data;
import org.matrix.database.entity.TestCaseListDataBto;
import java.util.List;
/** /**
* 接收前端传入的用例执行信息 * 接收前端传入的用例执行信息
* @author huangxiahao * @author huangxiahao
*/ */
@Data @Data
public class ExecuteMonitorVo extends SocketVo{ public class ExecuteMonitorVo extends SocketVo {
private String unionKey; private String unionKey;
......
package org.matrix.socket; package org.matrix.socket.vo;
import lombok.Data; import lombok.Data;
import org.matrix.socket.enums.SocketType;
/** /**
* 接收socket获取的信息的基本类 * 接收socket获取的信息的基本类
......
package org.matrix.socket; package org.matrix.socket.vo;
import lombok.Data; import lombok.Data;
import org.matrix.socket.enums.TestExecuteType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
......
...@@ -13,9 +13,9 @@ import org.matrix.database.entity.TestData; ...@@ -13,9 +13,9 @@ import org.matrix.database.entity.TestData;
import org.matrix.database.service.ITestCaseService; 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.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.socket.TestCaseExecuteSocketPool; import org.matrix.socket.pool.TestCaseExecuteSocketPool;
import org.matrix.socket.TestExecuteType; import org.matrix.socket.enums.TestExecuteType;
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;
......
package org.matrix.actuators.http; package org.matrix.actuators.http;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.usecase.CaseActuator; import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.actuators.usecase.TestCaseExecuteResult; import org.matrix.actuators.usecase.TestCaseExecuteResult;
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;
import org.matrix.database.entity.TestData; import org.matrix.database.entity.TestData;
import org.matrix.database.service.IExecutionRecordService; import org.matrix.database.service.IExecutionRecordService;
import org.matrix.database.service.ITestCaseService; import org.matrix.database.service.ITestCaseService;
import org.matrix.database.service.ITestDataService; import org.matrix.database.service.ITestDataService;
import org.matrix.socket.SocketType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@SpringBootTest @SpringBootTest
class CaseActuatorTest { class CaseActuatorTest {
......
package org.matrix.actuators.move; package org.matrix.actuators.move;
import org.junit.Assert;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.matrix.socket.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
......
...@@ -25,7 +25,7 @@ public class ExecutionHistoryController { ...@@ -25,7 +25,7 @@ public class ExecutionHistoryController {
} }
@ApiOperation(value = "分页查询执行历史",notes = "假如查询测试用例的执行历史,请入参caseId,假如查询测试任务的执行历史,请入参jobId") @ApiOperation(value = "分页查询执行历史",notes = "假如查询测试用例的执行历史,请入参caseId,假如查询测试任务的执行历史,请入参jobId")
@GetMapping("/findExecutionHistory") @GetMapping("/xecutionHistory")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name="pageSize",value="页码",required=true,paramType="query"), @ApiImplicitParam(name="pageSize",value="页码",required=true,paramType="query"),
@ApiImplicitParam(name="pageNum",value="当前页显示调试",required=true,paramType="query"), @ApiImplicitParam(name="pageNum",value="当前页显示调试",required=true,paramType="query"),
...@@ -43,4 +43,22 @@ public class ExecutionHistoryController { ...@@ -43,4 +43,22 @@ public class ExecutionHistoryController {
? CommonResult.success(page, "查询成功") ? CommonResult.success(page, "查询成功")
: CommonResult.failed(page, "查询失败或无数据"); : CommonResult.failed(page, "查询失败或无数据");
} }
@ApiOperation(value = "根据JobId或者caseId 取最近一次执行历史",notes = "假如查询测试用例的执行历史,请入参caseId,假如查询测试任务的执行历史,请入参jobId")
@GetMapping("/lastExecution")
@ApiImplicitParams({
@ApiImplicitParam(name="jobId",value="测试任务ID",paramType="query"),
@ApiImplicitParam(name="caseId",value="测试用例ID",paramType="query")
})
public ResponseEntity<CommonResultObj<ExecutionHistoryVo>> lastExecution(
@RequestParam(defaultValue = "-1") Long jobId,
Long caseId
){
ExecutionHistoryVo result = executionHistoryService.getLastExecutionHistory(caseId, jobId);
return result!=null
? CommonResult.success(result, "查询成功")
: CommonResult.failed(null, "查询失败或无数据");
}
} }
...@@ -10,7 +10,7 @@ import org.matrix.database.service.IExecutionRecordService; ...@@ -10,7 +10,7 @@ import org.matrix.database.service.IExecutionRecordService;
import org.matrix.database.vo.CommonResult; import org.matrix.database.vo.CommonResult;
import org.matrix.database.vo.CommonResultObj; import org.matrix.database.vo.CommonResultObj;
import org.matrix.enums.ExecutionRecType; import org.matrix.enums.ExecutionRecType;
import org.matrix.socket.TestExecuteType; import org.matrix.socket.enums.TestExecuteType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论