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

fix(base): 修了一些BUG

上级 0af44d11
package org.matrix.actuators.httpclient;
import com.alibaba.fastjson.JSONObject;
import io.netty.handler.codec.http.HttpHeaderValues;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.conn.HttpHostConnectException;
......@@ -74,7 +75,6 @@ public class HttpClientActuator implements Actuator {
);
}
for (RequestBody requestBody : httpRequestDetail.getRequestBodies()) {
//todo 李迪凡 将requestBody中的key和value里的 动态变量补全
requestBody.setKey(
completeExpressionUtil.completeDynamicVariable(
requestBody.getKey(),
......@@ -89,7 +89,6 @@ public class HttpClientActuator implements Actuator {
);
}
if (!StringUtils.isEmpty(httpRequestDetail.getStringValue())){
//todo 李迪凡 将httpRequestDetail的stringValue 动态变量补全
httpRequestDetail.setStringValue(
completeExpressionUtil.completeDynamicVariable(
httpRequestDetail.getStringValue(),
......@@ -97,7 +96,6 @@ public class HttpClientActuator implements Actuator {
projectId)
);
}
//todo 李迪凡 将httpRequestDetail的url 动态变量补全
httpRequestDetail.setUrl(completeExpressionUtil.completeDynamicVariable(
httpRequestDetail.getUrl(),
envId,
......@@ -123,6 +121,8 @@ public class HttpClientActuator implements Actuator {
response = client.execute(requestBase);
Long endTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
return new HttpResponseDetail(
url,
StringUtils.isEmpty(httpRequestDetail.getStringValue())? JSONObject.toJSONString(httpRequestDetail.getRequestBodies()) :httpRequestDetail.getStringValue(),
response,
EntityUtils.toString(response.getEntity(), "UTF-8"),
HttpStatus.valueOf(response.getStatusLine().getStatusCode()),
......@@ -131,6 +131,8 @@ public class HttpClientActuator implements Actuator {
}catch (HttpHostConnectException e){
Long endTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
return new HttpResponseDetail(
url,
StringUtils.isEmpty(httpRequestDetail.getStringValue())? JSONObject.toJSONString(httpRequestDetail.getRequestBodies()) :httpRequestDetail.getStringValue(),
response,
String.format("目标主机拒绝连接,本次请求URL: %s ",httpRequestDetail.getUrl()),
HttpStatus.SERVICE_UNAVAILABLE,
......
......@@ -18,6 +18,12 @@ import org.springframework.http.HttpStatus;
@NoArgsConstructor
public class HttpResponseDetail extends BaseTestCaseResponseDetail {
@ApiModelProperty("请求路径")
private String url;
@ApiModelProperty("请求入参")
private String requestParam;
@ApiModelProperty("HttpClient响应体")
private CloseableHttpResponse response;
......
......@@ -17,7 +17,6 @@ import org.matrix.database.entity.TestCaseBTO;
import org.matrix.database.service.ITestDataService;
import org.matrix.database.service.impl.ActionServiceImpl;
import org.matrix.enums.ActionType;
import org.matrix.enums.ModuleType;
import org.matrix.exception.GlobalException;
import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.util.BeanFlattener;
......@@ -255,7 +254,7 @@ public class MoveActuator implements Actuator {
long caseDataId = Long.parseLong(runtimeDetail);
TestCaseBTO caseBTO = dataService.toCaseBTO(caseDataId);
return (HttpResponseDetail) caseActuator.executeTestCase(caseBTO, envId, projectId)
.getBaseTestCaseRequestDetail();
.getBaseTestCaseResponseDetail();
}
/**
......
......@@ -183,7 +183,7 @@ public class SqlExpActuator implements Actuator {
long caseDataId = Long.parseLong(dynamicVar.getDetail());
TestCaseBTO caseBTO = dataService.toCaseBTO(caseDataId);
HttpResponseDetail responseDetail = (HttpResponseDetail) caseActuator.executeTestCase(caseBTO, envId, projectId)
.getBaseTestCaseRequestDetail();
.getBaseTestCaseResponseDetail();
return responseDetail.getResponseBody();
}
......
......@@ -17,6 +17,8 @@ public class RunCaseResult extends BaseTime{
private Long jobId;
private String uniqueKey;
/**
* Key为caseId,List为case下的每一个执行结果
*/
......
......@@ -18,6 +18,28 @@ public class TestCaseReport extends BaseTime{
private Long caseId;
private String caseName;
private String type;
private String detail;
private String description;
/**
* 前置行动ID组,例如:1,2,3
*/
private String moveBefore;
/**
* 后置行动ID组,例如:1,2,3
*/
private String moveAfterCase;
/**
* 测试执行后行动ID组,例如:1,2,3
*/
private String moveAfterTest;
/**
* 执行状态
*/
......@@ -26,11 +48,18 @@ public class TestCaseReport extends BaseTime{
/**
* case下的每一个执行结果
*/
private List<TestDataExecuteResult> dataExecuteResults = new ArrayList<>();
private List<TestDataExecuteResult> dataExecuteResults ;
public TestCaseReport(LocalDateTime startTime, LocalDateTime endTime, Long caseId, Boolean status, List<TestDataExecuteResult> dataExecuteResults) {
public TestCaseReport(LocalDateTime startTime, LocalDateTime endTime, Long caseId, String caseName, String type, String detail, String description, String moveBefore, String moveAfterCase, String moveAfterTest, Boolean status, List<TestDataExecuteResult> dataExecuteResults) {
super(startTime, endTime);
this.caseId = caseId;
this.caseName = caseName;
this.type = type;
this.detail = detail;
this.description = description;
this.moveBefore = moveBefore;
this.moveAfterCase = moveAfterCase;
this.moveAfterTest = moveAfterTest;
this.status = status;
this.dataExecuteResults = dataExecuteResults;
}
......
......@@ -20,4 +20,13 @@ public enum TestCaseTypeEnum {
public Integer getValue() {
return value;
}
public static TestCaseTypeEnum getTypeByValue(Integer value){
for (TestCaseTypeEnum testCaseTypeEnum : TestCaseTypeEnum.values()) {
if (value.equals(testCaseTypeEnum.getValue())){
return testCaseTypeEnum;
}
}
return null;
}
}
......@@ -23,17 +23,17 @@ public class TestDataExecuteResult extends BaseTime{
private Long dataId;
private BaseTestCaseResponseDetail baseTestCaseRequestDetail;
private BaseTestCaseResponseDetail baseTestCaseResponseDetail;
private CheckPointResult checkPointResult;
public TestDataExecuteResult(LocalDateTime startTime, LocalDateTime endTime, Boolean executionStatus, Long caseId, Long dataId, BaseTestCaseResponseDetail baseTestCaseRequestDetail, CheckPointResult checkPointResult) {
public TestDataExecuteResult(LocalDateTime startTime, LocalDateTime endTime, Boolean executionStatus, Long caseId, Long dataId, BaseTestCaseResponseDetail baseTestCaseResponseDetail, CheckPointResult checkPointResult) {
super(startTime, endTime);
this.executionStatus = executionStatus;
this.caseId = caseId;
this.dataId = dataId;
this.baseTestCaseRequestDetail = baseTestCaseRequestDetail;
this.baseTestCaseResponseDetail = baseTestCaseResponseDetail;
this.checkPointResult = checkPointResult;
}
}
......@@ -44,6 +44,8 @@ public class ExecutionHistory extends BaseEntity {
private ExecutionHistoryStatus status = ExecutionHistoryStatus.READY;
private String caseExecuteVoString;
/**
* 创建时间
*/
......
......@@ -39,6 +39,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tkeh.job_id jobId,\n" +
"\tkeh.execution_key executionKey,\n" +
"\tkeh.url url,\n" +
"\tkeh.case_execute_vo_string caseExecuteVoString,\n" +
"\tIF(MIN( keh.`status` )= 0 or MIN( keh.`status` ) = 1,1,MAX(keh.`status`)) `status`,\n" +
"\tktc.`name` caseName,\n" +
"\tktd.`name` dataName," +
......@@ -63,6 +64,8 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"</if>" +
"</where>" +
"GROUP BY keh.unique_key " +
"ORDER BY\n" +
"\tstartTime desc"+
"</script>")
IPage<ExecutionHistoryVo> pageByCaseIdAndJobId(IPage<ExecutionHistoryVo> page, Long caseId, Long jobId,Long userId,String uniqueKey);
......@@ -82,6 +85,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tkeh.job_id jobId,\n" +
"\tkeh.url url,\n" +
"\tkeh.execution_key executionKey,\n" +
"\tkeh.case_execute_vo_string caseExecuteVoString,\n" +
"IF\n" +
"\t(\n" +
"\tMIN( keh.`status` )= 0 or MIN( keh.`status` ) = 1,\n" +
......@@ -110,6 +114,8 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"GROUP BY case_id ) ) \n" +
"GROUP BY\n" +
"\tkeh.unique_key\n" +
"ORDER BY\n" +
"\tstartTime desc"+
"</script>")
ExecutionHistoryVo selectLastExecutionHistoryVo( Long caseId, Long jobId,Long userId);
......
package org.matrix.exception;
/**
* 当用户需要执行的 用例或者任务 正在执行中时抛出这个异常.
*
* @author huangxiahao
* @since 2022/1/19 at 12:53 PM
* Suffering is the most powerful teacher of life.
*/
public class ExecutionRunningException extends RuntimeException {
public ExecutionRunningException(String message) {
super(message);
}
public ExecutionRunningException(String message, Throwable cause) {
super(message, cause);
}
public ExecutionRunningException(Throwable cause) {
super(cause);
}
public ExecutionRunningException() {
super();
}
}
......@@ -2,16 +2,16 @@ package org.matrix.socket;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.beanutils.BeanUtils;
import org.matrix.actuators.datasource.IDataSourceService;
import org.matrix.actuators.httpclient.HttpResponseDetail;
import org.matrix.actuators.sql.SqlExpActuator;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.database.entity.TestCase;
import org.matrix.database.entity.TestCaseListDataBto;
import org.matrix.database.entity.TestData;
import org.matrix.database.entity.TestJob;
import org.matrix.actuators.usecase.RunCaseResult;
import org.matrix.actuators.usecase.TestCaseReport;
import org.matrix.actuators.usecase.TestDataExecuteResult;
import org.matrix.database.entity.*;
import org.matrix.database.service.IExecutionHistoryService;
import org.matrix.database.service.ITestCaseService;
import org.matrix.database.service.ITestDataService;
import org.matrix.database.service.ITestJobService;
......@@ -21,8 +21,14 @@ import org.matrix.socket.pool.MonitorSocketPool;
import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.socket.vo.ExecuteMonitorVo;
import org.matrix.socket.vo.SocketVo;
import org.matrix.testNg.web.entity.DataBean;
import org.matrix.testNg.web.entity.DataBeans;
import org.matrix.testNg.web.entity.DataMove;
import org.matrix.testNg.web.entity.ReportMessage;
import org.matrix.testNg.web.report.TestNgImpl;
import org.matrix.testNg.web.vo.DataBeansJobVo;
import org.matrix.testNg.web.vo.DataBeansMoveVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
......@@ -30,6 +36,8 @@ import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
......@@ -42,6 +50,8 @@ import java.util.Map;
@Component
public class ExecutionSocketHandler extends TextWebSocketHandler {
public static final MonitorSocketPool EXECUTE_MONITOR_SOCKET_POOL = new MonitorSocketPool();
final CaseActuator caseActuator;
......@@ -51,8 +61,10 @@ public class ExecutionSocketHandler extends TextWebSocketHandler {
final SqlExpActuator sqlExpActuator;
final JdbcTemplate jdbcTemplate;
final IDataSourceService dataSourceService;
final IExecutionHistoryService executionHistoryService;
final TestNgImpl testNg;
public ExecutionSocketHandler(CaseActuator caseActuator, ITestDataService testDataService, ITestJobService testJobService, ITestCaseService testCaseService, SqlExpActuator sqlExpActuator, JdbcTemplate jdbcTemplate, IDataSourceService dataSourceService) {
public ExecutionSocketHandler(CaseActuator caseActuator, ITestDataService testDataService, ITestJobService testJobService, ITestCaseService testCaseService, SqlExpActuator sqlExpActuator, JdbcTemplate jdbcTemplate, IDataSourceService dataSourceService, TestNgImpl testNg, IExecutionHistoryService executionHistoryService) {
this.caseActuator = caseActuator;
this.testDataService = testDataService;
this.testJobService = testJobService;
......@@ -60,6 +72,8 @@ public class ExecutionSocketHandler extends TextWebSocketHandler {
this.sqlExpActuator = sqlExpActuator;
this.jdbcTemplate = jdbcTemplate;
this.dataSourceService = dataSourceService;
this.testNg = testNg;
this.executionHistoryService = executionHistoryService;
}
@Override
......@@ -81,20 +95,28 @@ public class ExecutionSocketHandler extends TextWebSocketHandler {
List<Map<String, Object>> list = jdbcTemplate.queryForList(sqlStatement);
List<TestCase> testCaseList = new ArrayList<>();
for (Map<String, Object> objectMap : list) {
TestCase testCase = BeanUtil.mapToBean(objectMap,TestCase.class,false);
TestCase testCase = BeanUtil.mapToBean(objectMap, TestCase.class, false);
testCaseList.add(testCase);
}
for (TestCase testCase : testCaseList) {
List<TestData> testDataList = testDataService.list(Wrappers.lambdaQuery(TestData.class).eq(TestData::getTestCaseId, testCase.getId()));
TestCaseListDataBto testCaseListDataBto = new TestCaseListDataBto();
TestCaseListDataBto testCaseListDataBto = new TestCaseListDataBto();
testCaseListDataBto.setTestCase(testCase);
testCaseListDataBto.setTestDataList(testDataList);
caseExecuteVo.getTestCaseListDataBtoList().add(testCaseListDataBto);
}
if (testCaseList.size()>0){
if (testCaseList.size() > 0) {
caseExecuteVo.setProjectId(testCaseList.get(0).getProjectId());
}
caseActuator.runTestCase(session, caseExecuteVo);
RunCaseResult runCaseResult = caseActuator.runTestCase(session, caseExecuteVo);
ReportMessage reportMessage = testNg.getReporterUrls(initTestNgData(runCaseResult, caseExecuteVo));
ExecutionHistory history = new ExecutionHistory();
history.setUrl(reportMessage.getUrl());
history.setStatus(null);
history.setUpdateTime(null);
executionHistoryService
.update(history,Wrappers.lambdaUpdate(ExecutionHistory.class)
.eq(ExecutionHistory::getUniqueKey,caseExecuteVo.getUniqueKey()));
} else if (SocketType.TEST_CASE_MONITOR.equals(socketVo.getSocketType())) {
ExecuteMonitorVo caseExecuteVo = JSON.parseObject(payload, ExecuteMonitorVo.class);
EXECUTE_MONITOR_SOCKET_POOL.add(caseExecuteVo.getUniqueKey(), session);
......@@ -108,6 +130,49 @@ public class ExecutionSocketHandler extends TextWebSocketHandler {
}
}
public DataBeansJobVo initTestNgData(RunCaseResult caseResult, CaseExecuteVo caseExecuteVo) {
//用例总数
Integer total = caseExecuteVo.getTestCaseListDataBtoList().size();
//通过用例数
Integer passNum = (int) caseResult.getCaseReports().stream().filter(TestCaseReport::getStatus).count();
//失败用例数
Integer failNum = total - passNum;
//执行总时间
String allTime = caseResult.getDurationTimeStr();
//用例通过率
Integer probability = BigDecimal.valueOf(passNum).divide(BigDecimal.valueOf(total), 2, RoundingMode.UP).multiply(BigDecimal.valueOf(100)).intValue();
DataBean dataBean = new DataBean(total, passNum, failNum, allTime, probability);
List<DataBeansMoveVo> dataBeansMoveVos = new ArrayList<>();
for (TestCaseReport caseReport : caseResult.getCaseReports()) {
DataBeansMoveVo dataBeansMoveVo = new DataBeansMoveVo();
dataBeansMoveVo.setDataMove(new DataMove(
caseReport.getMoveBefore(),
caseReport.getMoveAfterTest(),
caseReport.getMoveAfterCase()
));
List<DataBeans> dataBeansList = new ArrayList<>();
for (TestDataExecuteResult dataExecuteResult : caseReport.getDataExecuteResults()) {
DataBeans dataBeans = new DataBeans();
dataBeans.setTestCaseName(caseReport.getCaseName());
dataBeans.setType(caseReport.getType());
if (dataExecuteResult.getBaseTestCaseResponseDetail() != null){
if (dataExecuteResult.getBaseTestCaseResponseDetail() instanceof HttpResponseDetail){
HttpResponseDetail httpResponseDetail = (HttpResponseDetail)dataExecuteResult.getBaseTestCaseResponseDetail();
dataBeans.setDetail(httpResponseDetail.getResponseBody());
}
}
dataBeans.setResult(dataExecuteResult.getExecutionStatus());
dataBeans.setDescription(caseReport.getDescription());
dataBeans.setDuration(dataExecuteResult.getDurationTimeMillis());
dataBeans.setResultMessage(dataExecuteResult.getCheckPointResult());
dataBeansList.add(dataBeans);
}
dataBeansMoveVo.setDataBeansList(dataBeansList);
dataBeansMoveVos.add(dataBeansMoveVo);
}
return new DataBeansJobVo(dataBean,dataBeansMoveVos);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
......
package org.matrix.socket.pool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
......@@ -13,6 +14,7 @@ import java.util.concurrent.ConcurrentHashMap;
*
* @author huangxiahao
*/
@Slf4j
public class MonitorSocketPool {
/**
......@@ -33,7 +35,7 @@ public class MonitorSocketPool {
if (webSocketSessions != null) {
List<String> list = socketKeyMap.get(clientSocket.getId());
if (list!=null&&list.contains(key)){
clientSocket.sendMessage(new TextMessage("请勿重复订阅"));
log.info("用户重复订阅 批次:{}",key);
}else {
webSocketSessions.add(clientSocket);
}
......
......@@ -8,6 +8,7 @@ import org.matrix.actuators.util.ThreadUtil;
import org.matrix.database.entity.ExecutionRecord;
import org.matrix.database.service.IExecutionRecordService;
import org.matrix.enums.ModuleType;
import org.matrix.exception.ExecutionRunningException;
import org.matrix.exception.GlobalException;
import org.matrix.socket.ExecutionSocketHandler;
import org.matrix.socket.vo.TestExecuteLog;
......@@ -19,6 +20,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
......@@ -35,14 +37,14 @@ public class LogQueueRuntime {
private static IExecutionRecordService EXECUTION_RECORD_SERVICE;
public static IExecutionRecordService getExecutionRecordService(){
if (EXECUTION_RECORD_SERVICE==null){
public static IExecutionRecordService getExecutionRecordService() {
if (EXECUTION_RECORD_SERVICE == null) {
EXECUTION_RECORD_SERVICE = SpringUtils.getBean("executionRecordImpl");
}
return EXECUTION_RECORD_SERVICE;
return EXECUTION_RECORD_SERVICE;
}
public static ExecutionRecord addExecutionRecord(TestExecuteLog testExecuteLog,String log){
public static ExecutionRecord addExecutionRecord(TestExecuteLog testExecuteLog, String log) {
return getExecutionRecordService().addExecutionRecord(testExecuteLog, log);
}
......@@ -54,12 +56,12 @@ public class LogQueueRuntime {
LOG_MAP.put(threadId, testExecuteLog);
}
public static void setTestData(Long dataId){
public static void setTestData(Long dataId) {
Long currentThreadId = ThreadUtil.currentThreadId();
LOG_MAP.get(currentThreadId).setTestDataId(dataId);
}
public static void clearTestData(){
public static void clearTestData() {
Long currentThreadId = ThreadUtil.currentThreadId();
LOG_MAP.get(currentThreadId).setTestDataId(-1L);
}
......@@ -70,12 +72,12 @@ public class LogQueueRuntime {
classLog.info(logMsg.toLogString());
Long currentThreadId = ThreadUtil.currentThreadId();
TestExecuteLog testExecuteLog = LOG_MAP.get(currentThreadId);
if (testExecuteLog !=null){
if (testExecuteLog != null) {
testExecuteLog.addLog(logMsg);
String messageToDb = JSONObject.toJSONString(logMsg);
ExecutionRecord executionRecord = addExecutionRecord(testExecuteLog, messageToDb);
sendMessage(currentThreadId,testExecuteLog.getUniqueKey(),executionRecord.getId(),messageToDb);
}else {
sendMessage(currentThreadId, testExecuteLog.getUniqueKey(), executionRecord.getId(), messageToDb);
} else {
throw new GlobalException("该线程中的TestCaseLog对象未初始化,请先调用put方法初始化对象");
}
}
......@@ -84,40 +86,44 @@ public class LogQueueRuntime {
LOG_MAP.remove(threadId);
}
public static void sendMessage(Long threadId,String uniqueKey,Long logId, String log) {
try {
TestExecuteLog testExecuteLog = LOG_MAP.get(threadId);
// 测试任务ID.测试用例ID.测试数据ID
String message = JSONObject.toJSONString(log);
String logMessage =
String.format(
"%s.%s.%s.%s.%s"
,testExecuteLog.getTestJobId()
,testExecuteLog.getTestCaseId()
,testExecuteLog.getTestDataId()
,logId
,message
);
//如果uniqueKey中存在监听的socket则向该socket发送消息
List<WebSocketSession> webSocketSessions = ExecutionSocketHandler.EXECUTE_MONITOR_SOCKET_POOL.get(uniqueKey);
if (webSocketSessions!=null){
for (WebSocketSession webSocketSession : webSocketSessions) {
webSocketSession.sendMessage(new TextMessage(
logMessage
));
}
}
//如果线程中存在socket则向该socket发送消息
WebSocketSession webSocketSession = TestCaseExecuteSocketPool.get(threadId);
if (webSocketSession != null) {
webSocketSession.sendMessage(new TextMessage(
logMessage
));
}
} catch (Exception e) {
LogFactory.get().log(Level.INFO,"发送socket消息失败,socket已经断开连接");
remove(threadId);
public static void sendMessage(Long threadId, String uniqueKey, Long logId, String log) {
TestExecuteLog testExecuteLog = LOG_MAP.get(threadId);
// 测试任务ID.测试用例ID.测试数据ID
String message = JSONObject.toJSONString(log);
String logMessage =
String.format(
"%s.%s.%s.%s.%s"
, testExecuteLog.getTestJobId()
, testExecuteLog.getTestCaseId()
, testExecuteLog.getTestDataId()
, logId
, message
);
//如果uniqueKey中存在监听的socket则向该socket发送消息
List<WebSocketSession> webSocketSessions = ExecutionSocketHandler.EXECUTE_MONITOR_SOCKET_POOL.get(uniqueKey);
if (webSocketSessions != null) {
for (WebSocketSession webSocketSession : webSocketSessions) {
socketSendMessage(webSocketSession, logMessage);
}
}
//如果线程中存在socket则向该socket发送消息
WebSocketSession webSocketSession = TestCaseExecuteSocketPool.get(threadId);
if (webSocketSession != null) {
socketSendMessage(webSocketSession, logMessage);
}
}
private static void socketSendMessage(WebSocketSession socketSession, String message) {
try {
if (socketSession != null && socketSession.isOpen()) {
socketSession.sendMessage(new TextMessage(
message
));
}
} catch (IOException e) {
LogFactory.get().log(Level.INFO, "发送socket消息失败,socket已经断开连接");
}
}
public static void initTestCaseLog(Long jobId, Long userId, Long caseId, TestExecuteType type, String uniqueKey) {
......@@ -127,22 +133,35 @@ public class LogQueueRuntime {
testExecuteLog.setUserId(userId);
testExecuteLog.setType(type);
testExecuteLog.setUniqueKey(uniqueKey);
if (checkIsInRun(testExecuteLog)){
throw new GlobalException("当前用例正在执行中");
if (checkIsInRun(testExecuteLog)) {
throw new ExecutionRunningException("当前 任务/用例 正在执行中");
}
LogQueueRuntime.put(ThreadUtil.currentThreadId(), testExecuteLog);
}
public static Boolean checkIsInRun(TestExecuteLog testExecuteLog){
public static Boolean checkJobIsInRun(Long jobId, Long userId, TestExecuteType type) {
TestExecuteLog testExecuteLog = new TestExecuteLog();
testExecuteLog.setTestJobId(jobId);
testExecuteLog.setUserId(userId);
testExecuteLog.setType(type);
for (TestExecuteLog value : LOG_MAP.values()) {
if (value.equals(testExecuteLog)) {
return true;
}
}
return false;
}
public static Boolean checkIsInRun(TestExecuteLog testExecuteLog) {
for (TestExecuteLog value : LOG_MAP.values()) {
if (value.equals(testExecuteLog)){
if (value.equals(testExecuteLog)) {
return true;
}
}
return false;
}
public static TestExecuteLog getCurrentTestExecute(Long threadId){
public static TestExecuteLog getCurrentTestExecute(Long threadId) {
return LOG_MAP.get(threadId);
}
......
......@@ -10,6 +10,7 @@ import java.util.Objects;
/**
* 用例日志临时存储对象
*
* @author huangxiahao
*/
@Data
......@@ -24,7 +25,7 @@ public class TestExecuteLog {
private TestExecuteType type = TestExecuteType.TEST_CASE;
private Long userId = -1L ;
private Long userId = -1L;
private Long testCaseId = -1L;
......@@ -36,9 +37,10 @@ public class TestExecuteLog {
/**
* 前置条件:每个用例下的数据组是单线程执行的
* 由于arrayList是有序的,所以只需要向下新增就好了
*
* @param logMsg
*/
public void addLog(LogMessage logMsg){
public void addLog(LogMessage logMsg) {
this.log.add(logMsg);
}
......@@ -51,7 +53,11 @@ public class TestExecuteLog {
return false;
}
TestExecuteLog that = (TestExecuteLog) o;
return getType() == that.getType() && Objects.equals(getUserId(), that.getUserId()) && Objects.equals(getTestCaseId(), that.getTestCaseId());
if (this.testJobId==-1L){
return getType() == that.getType() && Objects.equals(getUserId(), that.getUserId()) && Objects.equals(getTestCaseId(), that.getTestCaseId());
}else {
return getType() == that.getType() && Objects.equals(getUserId(), that.getUserId()) && Objects.equals(getTestJobId(), that.getTestJobId());
}
}
@Override
......
......@@ -40,12 +40,12 @@ public class GenerateReporterJob {
Map context = new HashMap();
ReporterDataJob reporterDatajob = new ReporterDataJob();
DataBean dataBean = reporterDatajob.testDataBean();
List<DataMove> dataMoves = reporterDatajob.testDataBeanMove();
// List<DataMove> dataMoves = reporterDatajob.testDataBeanMove();
List<DataBeans> dataBeansList = reporterDatajob.testDataBeans();
// 这里是公共的信息.
for (DataBeans bean : dataBeansList) {
context.put("overView", dataBean);
context.put("move", dataMoves);
// context.put("move", dataMoves);
if (bean.getResult()) {
context.put("pass", dataBeansList);
} else {
......
......@@ -22,35 +22,35 @@ public class ReporterData {
*/
public DataBean testDataBean() {
DataBeansVo dataBeansVo = ReporterUtils.map.get("dataBeansVo");
int passNum = 0;
int failNum = 0;
Long oneTime = 0L;
// int passNum = 0;
// int failNum = 0;
// Long oneTime = 0L;
// 测试结果汇总数据
DataBean dataBean = dataBeansVo.getDataBean();
List<DataBeans> dataBeanLists = dataBeansVo.getDataBeanLists();
for (DataBeans dataBeanList : dataBeanLists) {
Long duration = dataBeanList.getDuration();
oneTime = oneTime + duration;
if (dataBeanList.getResult()) {
passNum += 1;
} else {
failNum += 1;
}
}
//成功
dataBean.setPassNum(passNum);
//失败
dataBean.setFailNum(failNum);
//总数
dataBean.setTotal(passNum + failNum);
//通过率
dataBean.setProbability(passNum / (passNum + failNum));
Duration duration = SecToTime.secToTime(oneTime);
Integer hour = duration.getHour();
Integer minute = duration.getMinute();
Integer second = duration.getSecond();
String allTime = hour + "." + minute + "." + second;
dataBean.setAllTime(allTime);
// List<DataBeans> dataBeanLists = dataBeansVo.getDataBeanLists();
// for (DataBeans dataBeanList : dataBeanLists) {
// Long duration = dataBeanList.getDuration();
// oneTime = oneTime + duration;
// if (dataBeanList.getResult()) {
// passNum += 1;
// } else {
// failNum += 1;
// }
// }
// //成功
// dataBean.setPassNum(passNum);
// //失败
// dataBean.setFailNum(failNum);
// //总数
// dataBean.setTotal(passNum + failNum);
// //通过率
// dataBean.setProbability(passNum / (passNum + failNum));
// Duration duration = SecToTime.secToTime(oneTime);
// Integer hour = duration.getHour();
// Integer minute = duration.getMinute();
// Integer second = duration.getSecond();
// String allTime = hour + "." + minute + "." + second;
// dataBean.setAllTime(allTime);
return dataBean;
}
......
......@@ -23,38 +23,38 @@ public class ReporterDataJob {
*/
public DataBean testDataBean() {
DataBeansJobVo dataBeansJobVo = ReporterUtils.jobMap.get("job");
int passNum = 0;
int failNum = 0;
Long oneTime = 0L;
// int passNum = 0;
// int failNum = 0;
// Long oneTime = 0L;
// 测试结果汇总数据
DataBean dataBean = dataBeansJobVo.getDataBean();
List<DataBeansMoveVo> dataBeansMoveVos = dataBeansJobVo.getDataBeansMove();
for (DataBeansMoveVo dataBeansMoveVo : dataBeansMoveVos) {
List<DataBeans> dataBeansList = dataBeansMoveVo.getDataBeansList();
for (DataBeans dataBeans : dataBeansList) {
Long duration = dataBeans.getDuration();
oneTime = oneTime + duration;
if (dataBeans.getResult()) {
passNum += 1;
} else {
failNum += 1;
}
}
}
//成功
dataBean.setPassNum(passNum);
//失败
dataBean.setFailNum(failNum);
//总数
dataBean.setTotal(passNum + failNum);
//通过率
dataBean.setProbability(passNum / (passNum + failNum));
Duration duration = SecToTime.secToTime(oneTime);
Integer hour = duration.getHour();
Integer minute = duration.getMinute();
Integer second = duration.getSecond();
String allTime = hour + "." + minute + "." + second;
dataBean.setAllTime(allTime);
// List<DataBeansMoveVo> dataBeansMoveVos = dataBeansJobVo.getDataBeansMove();
// for (DataBeansMoveVo dataBeansMoveVo : dataBeansMoveVos) {
// List<DataBeans> dataBeansList = dataBeansMoveVo.getDataBeansList();
// for (DataBeans dataBeans : dataBeansList) {
// Long duration = dataBeans.getDuration();
// oneTime = oneTime + duration;
// if (dataBeans.getResult()) {
// passNum += 1;
// } else {
// failNum += 1;
// }
// }
// }
// //成功
// dataBean.setPassNum(passNum);
// //失败
// dataBean.setFailNum(failNum);
// //总数
// dataBean.setTotal(passNum + failNum);
// //通过率
// dataBean.setProbability(passNum / (passNum + failNum));
// Duration duration = SecToTime.secToTime(oneTime);
// Integer hour = duration.getHour();
// Integer minute = duration.getMinute();
// Integer second = duration.getSecond();
// String allTime = hour + "." + minute + "." + second;
// dataBean.setAllTime(allTime);
return dataBean;
}
......@@ -63,11 +63,11 @@ public class ReporterDataJob {
*/
public List<DataMove> testDataBeanMove() {
List<DataMove> dataMoveList = new ArrayList<>();
List<DataBeansMoveVo> dataBeansMoveVos = ReporterUtils.jobMap.get("job").getDataBeansMove();
for (DataBeansMoveVo dataBeansMoveVo : dataBeansMoveVos) {
DataMove dataMove = dataBeansMoveVo.getDataMove();
dataMoveList.add(dataMove);
}
// List<DataBeansMoveVo> dataBeansMoveVos = ReporterUtils.jobMap.get("job").getDataBeansMove();
// for (DataBeansMoveVo dataBeansMoveVo : dataBeansMoveVos) {
// DataMove dataMove = dataBeansMoveVo.getDataMove();
// dataMoveList.add(dataMove);
// }
return dataMoveList;
}
......
......@@ -17,6 +17,8 @@ spring:
# username: root
# password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-enums-package: org.matrix.enums
baseJsPath: syntaxCheck.js
......
package org.matrix.fs.controller;
import javafx.scene.control.Alert;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
......
......@@ -20,8 +20,8 @@ spring:
password: 123456
mybatis-plus:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-enums-package: org.matrix.enums
baseJsPath: syntaxCheck.js
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论