Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
kt-keystone
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
kt-keystone
Commits
31be1b94
提交
31be1b94
authored
3月 15, 2022
作者:
黄夏豪
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(base): 新增了测试历史中的执行号,以及查询最近一次测试的接口
上级
66841ab6
隐藏空白字符变更
内嵌
并排
正在显示
28 个修改的文件
包含
268 行增加
和
86 行删除
+268
-86
MoveActuator.java
...src/main/java/org/matrix/actuators/move/MoveActuator.java
+1
-2
SqlExpActuator.java
...rc/main/java/org/matrix/actuators/sql/SqlExpActuator.java
+1
-1
CaseActuator.java
.../main/java/org/matrix/actuators/usecase/CaseActuator.java
+57
-9
TestCaseExecuteResult.java
...a/org/matrix/actuators/usecase/TestCaseExecuteResult.java
+6
-2
WebSocketConfig.java
kt-base/src/main/java/org/matrix/config/WebSocketConfig.java
+8
-8
ExecutionHistory.java
...ain/java/org/matrix/database/entity/ExecutionHistory.java
+4
-0
ExecutionRecord.java
...main/java/org/matrix/database/entity/ExecutionRecord.java
+1
-3
ExecutionHistoryMapper.java
...va/org/matrix/database/mapper/ExecutionHistoryMapper.java
+51
-2
IExecutionHistoryService.java
...org/matrix/database/service/IExecutionHistoryService.java
+9
-0
IExecutionRecordService.java
.../org/matrix/database/service/IExecutionRecordService.java
+1
-2
ExecutionHistoryServiceImpl.java
...ix/database/service/impl/ExecutionHistoryServiceImpl.java
+21
-1
ExecutionRecordImpl.java
...org/matrix/database/service/impl/ExecutionRecordImpl.java
+1
-1
ExecutionSocketHandler.java
...c/main/java/org/matrix/socket/ExecutionSocketHandler.java
+8
-9
ExecutionStatusMonitorSocketPool.java
...a/org/matrix/socket/ExecutionStatusMonitorSocketPool.java
+28
-0
SocketType.java
...ase/src/main/java/org/matrix/socket/enums/SocketType.java
+1
-1
TestExecuteType.java
...rc/main/java/org/matrix/socket/enums/TestExecuteType.java
+1
-1
ExecuteMonitorSocketPool.java
...java/org/matrix/socket/pool/ExecuteMonitorSocketPool.java
+30
-19
TestCaseExecuteSocketPool.java
...ava/org/matrix/socket/pool/TestCaseExecuteSocketPool.java
+1
-1
LogQueueRuntime.java
...rc/main/java/org/matrix/socket/queue/LogQueueRuntime.java
+6
-2
CaseExecuteVo.java
...ase/src/main/java/org/matrix/socket/vo/CaseExecuteVo.java
+2
-1
ExecuteMonitorVo.java
.../src/main/java/org/matrix/socket/vo/ExecuteMonitorVo.java
+2
-5
SocketVo.java
kt-base/src/main/java/org/matrix/socket/vo/SocketVo.java
+2
-1
TestExecuteLog.java
...se/src/main/java/org/matrix/socket/vo/TestExecuteLog.java
+2
-1
TestPigeon.java
kt-base/src/main/java/org/matrix/testNg/TestPigeon.java
+3
-3
CaseActuatorTest.java
...test/java/org/matrix/actuators/http/CaseActuatorTest.java
+0
-7
MoveActuatorTest.java
...test/java/org/matrix/actuators/move/MoveActuatorTest.java
+1
-2
ExecutionHistoryController.java
...atrix/autotest/controller/ExecutionHistoryController.java
+19
-1
ExecutionRecordController.java
...matrix/autotest/controller/ExecutionRecordController.java
+1
-1
没有找到文件。
kt-base/src/main/java/org/matrix/actuators/move/MoveActuator.java
浏览文件 @
31be1b94
...
...
@@ -2,7 +2,6 @@ package org.matrix.actuators.move;
import
com.alibaba.fastjson.JSON
;
import
com.google.common.collect.Lists
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.matrix.actuators.Actuator
;
...
...
@@ -19,7 +18,7 @@ import org.matrix.database.service.ITestDataService;
import
org.matrix.database.service.impl.ActionServiceImpl
;
import
org.matrix.enums.ActionType
;
import
org.matrix.exception.GlobalException
;
import
org.matrix.socket.LogQueueRuntime
;
import
org.matrix.socket.
queue.
LogQueueRuntime
;
import
org.matrix.util.BeanFlattener
;
import
org.springframework.stereotype.Component
;
...
...
kt-base/src/main/java/org/matrix/actuators/sql/SqlExpActuator.java
浏览文件 @
31be1b94
...
...
@@ -19,7 +19,7 @@ import org.matrix.database.service.IDynamicVariableService;
import
org.matrix.database.service.ITestDataService
;
import
org.matrix.enums.DynamicVarType
;
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.stereotype.Component
;
...
...
kt-base/src/main/java/org/matrix/actuators/usecase/CaseActuator.java
浏览文件 @
31be1b94
package
org
.
matrix
.
actuators
.
usecase
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
org.apache.commons.lang3.StringUtils
;
import
org.matrix.actuators.Actuator
;
...
...
@@ -17,7 +18,10 @@ import org.matrix.actuators.httpclient.HttpResponseDetail;
import
org.matrix.database.service.IExecutionHistoryService
;
import
org.matrix.enums.ExecutionHistoryStatus
;
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.springframework.stereotype.Component
;
import
org.springframework.web.socket.TextMessage
;
...
...
@@ -83,7 +87,11 @@ public class CaseActuator implements Actuator {
//执行后置动作
executeMove
(
testCaseBto
.
getTestCase
().
getMoveAfterTest
()
,
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
));
//将线程中正在执行的DataId清除
LogQueueRuntime
.
clearTestData
();
...
...
@@ -126,7 +134,12 @@ public class CaseActuator implements Actuator {
envId
,
projectId
,
baseTestCaseResponseDetail
);
TestCaseExecuteResult
testCaseExecuteResult
=
new
TestCaseExecuteResult
(
baseTestCaseResponseDetail
,
checkPointResult
);
TestCaseExecuteResult
testCaseExecuteResult
=
new
TestCaseExecuteResult
(
testCaseBto
.
getTestCase
().
getId
(),
testData
.
getId
(),
baseTestCaseResponseDetail
,
checkPointResult
);
resultList
.
add
(
testCaseExecuteResult
);
LogQueueRuntime
.
addNewLog
(
"用例执行结果:"
+
JSON
.
toJSONString
(
testCaseExecuteResult
));
//执行后置动作
...
...
@@ -135,8 +148,6 @@ public class CaseActuator implements Actuator {
changeExecutionHistoryStatus
(
ExecutionHistoryStatus
.
FINISH
);
}
return
resultList
;
}
catch
(
Exception
e
)
{
throw
e
;
}
finally
{
//将线程中正在执行的DataId清除
LogQueueRuntime
.
clearTestData
();
...
...
@@ -217,9 +228,9 @@ public class CaseActuator implements Actuator {
//将websocketSession 加入到socket池子中
TestCaseExecuteSocketPool
.
add
(
currentThreadId
,
session
);
List
<
TestCaseListDataBto
>
testCaseListDataBtoList
=
caseExecuteVo
.
getTestCaseListDataBtoList
();
for
(
int
i
=
0
;
i
<
testCaseListDataBtoList
.
size
();
i
++
)
{
Long
caseProjectId
=
testCaseListDataBtoList
.
get
(
i
)
.
getTestCase
().
getProjectId
();
if
(!
caseExecuteVo
.
getProjectId
().
equals
(
caseProjectId
)){
for
(
TestCaseListDataBto
caseListDataBto
:
testCaseListDataBtoList
)
{
Long
caseProjectId
=
caseListDataBto
.
getTestCase
().
getProjectId
();
if
(!
caseExecuteVo
.
getProjectId
().
equals
(
caseProjectId
))
{
throw
new
GlobalException
(
"本次执行中,存在非相同项目的测试用例"
);
}
}
...
...
@@ -265,21 +276,55 @@ public class CaseActuator implements Actuator {
public
void
insertExecutionHistory
(
String
unionKey
,
CaseExecuteVo
caseExecuteVo
)
{
List
<
TestCaseListDataBto
>
testCaseListDataBtoList
=
caseExecuteVo
.
getTestCaseListDataBtoList
();
Long
firstExecutionKey
=
getExecutionKey
(
caseExecuteVo
);
List
<
ExecutionHistory
>
executionHistories
=
new
ArrayList
<>();
for
(
TestCaseListDataBto
testCaseListDataBto
:
testCaseListDataBtoList
)
{
List
<
TestData
>
testDataList
=
testCaseListDataBto
.
getTestDataList
();
TestCase
testCase
=
testCaseListDataBto
.
getTestCase
();
for
(
int
i
=
0
;
i
<
testDataList
.
size
();
i
++)
{
ExecutionHistory
executionHistory
=
new
ExecutionHistory
();
executionHistory
.
setJobId
(
caseExecuteVo
.
getJobId
());
executionHistory
.
setUserId
(
caseExecuteVo
.
getUserId
());
executionHistory
.
setCaseId
(
testCase
.
getId
());
executionHistory
.
setDataId
(
testDataList
.
get
(
i
).
getId
());
executionHistory
.
setUnionKey
(
unionKey
);
executionHistory
.
setExecutionKey
(
firstExecutionKey
);
if
(
i
==
0
){
executionHistory
.
setStartTime
(
LocalDateTime
.
now
());
}
executionHistor
yService
.
save
(
executionHistory
);
executionHistor
ies
.
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
(
...
...
@@ -299,6 +344,8 @@ public class CaseActuator implements Actuator {
.
eq
(
ExecutionHistory:
:
getCaseId
,
currentTestExecute
.
getTestCaseId
())
.
eq
(
ExecutionHistory:
:
getDataId
,
currentTestExecute
.
getTestDataId
())
.
eq
(
ExecutionHistory:
:
getUnionKey
,
currentTestExecute
.
getUnionKey
())
.
eq
(
ExecutionHistory:
:
getUserId
,
currentTestExecute
.
getUserId
())
);
}
}
...
...
@@ -317,6 +364,7 @@ public class CaseActuator implements Actuator {
.
eq
(
ExecutionHistory:
:
getJobId
,
currentTestExecute
.
getTestJobId
())
.
eq
(
ExecutionHistory:
:
getCaseId
,
currentTestExecute
.
getTestCaseId
())
.
eq
(
ExecutionHistory:
:
getUnionKey
,
currentTestExecute
.
getUnionKey
())
.
eq
(
ExecutionHistory:
:
getUserId
,
currentTestExecute
.
getUserId
())
.
ne
(
ExecutionHistory:
:
getStatus
,
ExecutionHistoryStatus
.
FINISH
)
);
}
...
...
kt-base/src/main/java/org/matrix/actuators/usecase/TestCaseExecuteResult.java
浏览文件 @
31be1b94
...
...
@@ -13,8 +13,12 @@ import org.matrix.actuators.checkpoint.CheckPointResult;
@NoArgsConstructor
public
class
TestCaseExecuteResult
{
BaseTestCaseResponseDetail
baseTestCaseRequestDetail
;
private
Long
caseId
;
CheckPointResult
checkPointResult
;
private
Long
dataId
;
private
BaseTestCaseResponseDetail
baseTestCaseRequestDetail
;
private
CheckPointResult
checkPointResult
;
}
kt-base/src/main/java/org/matrix/config/WebSocketConfig.java
浏览文件 @
31be1b94
package
org
.
matrix
.
config
;
import
com.baomidou.mybatisplus.annotation.DbType
;
import
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
;
import
com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor
;
import
org.matrix.socket.HttpAuthHandler
;
import
org.matrix.socket.ExecutionSocketHandler
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.socket.config.annotation.EnableWebSocket
;
import
org.springframework.web.socket.config.annotation.WebSocketConfigurer
;
...
...
@@ -18,13 +14,16 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
@EnableWebSocket
public
class
WebSocketConfig
implements
WebSocketConfigurer
{
@Autowired
private
HttpAuthHandler
httpAuthHandler
;
private
final
ExecutionSocketHandler
executionSocketHandler
;
public
WebSocketConfig
(
ExecutionSocketHandler
executionSocketHandler
)
{
this
.
executionSocketHandler
=
executionSocketHandler
;
}
@Override
public
void
registerWebSocketHandlers
(
WebSocketHandlerRegistry
registry
)
{
registry
.
addHandler
(
httpAuth
Handler
,
"ws"
)
.
addHandler
(
executionSocket
Handler
,
"ws"
)
.
setAllowedOrigins
(
"*"
);
}
}
\ No newline at end of file
kt-base/src/main/java/org/matrix/database/entity/ExecutionHistory.java
浏览文件 @
31be1b94
...
...
@@ -36,6 +36,10 @@ public class ExecutionHistory extends BaseEntity {
private
Long
jobId
;
private
Long
userId
;
private
Long
executionKey
;
private
ExecutionHistoryStatus
status
=
ExecutionHistoryStatus
.
READY
;
/**
...
...
kt-base/src/main/java/org/matrix/database/entity/ExecutionRecord.java
浏览文件 @
31be1b94
...
...
@@ -7,9 +7,7 @@ import lombok.AllArgsConstructor;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
org.matrix.enums.ExecutionRecType
;
import
org.matrix.socket.SocketType
;
import
org.matrix.socket.TestExecuteType
;
import
org.matrix.socket.enums.TestExecuteType
;
/**
* @author mry
...
...
kt-base/src/main/java/org/matrix/database/mapper/ExecutionHistoryMapper.java
浏览文件 @
31be1b94
...
...
@@ -26,6 +26,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
* @param page 分页数据
* @param jobId 测试任务ID
* @param caseId 用例ID
* @param userId 用户ID
* @return 执行记录列表
*/
@Select
(
"<script>"
+
...
...
@@ -35,7 +36,7 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"\tkeh.case_id caseId,\n"
+
"\tkeh.data_id dataId,\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"
+
"\tktd.`name` dataName,"
+
"\tMIN(keh.create_time) startTime,\n"
+
...
...
@@ -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_data ktd ON ktd.id = keh.data_id"
+
"<where>"
+
"<if test=\"userId!=null\">\n"
+
"and keh.user_id= #{userId} \n"
+
" </if>"
+
"<if test=\"caseId!=null\">\n"
+
"and keh.case_id= #{caseId} \n"
+
" </if>"
+
...
...
@@ -54,6 +58,51 @@ public interface ExecutionHistoryMapper extends BaseMapper<ExecutionHistory> {
"</where>"
+
"GROUP BY keh.union_key "
+
"</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
);
}
kt-base/src/main/java/org/matrix/database/service/IExecutionHistoryService.java
浏览文件 @
31be1b94
...
...
@@ -26,4 +26,13 @@ public interface IExecutionHistoryService extends IService<ExecutionHistory> {
*/
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
);
}
kt-base/src/main/java/org/matrix/database/service/IExecutionRecordService.java
浏览文件 @
31be1b94
...
...
@@ -3,8 +3,7 @@ package org.matrix.database.service;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
org.matrix.database.entity.ExecutionRecord
;
import
org.matrix.enums.ExecutionRecType
;
import
org.matrix.socket.TestExecuteLog
;
import
org.matrix.socket.TestExecuteType
;
import
org.matrix.socket.vo.TestExecuteLog
;
/**
* @author mry
...
...
kt-base/src/main/java/org/matrix/database/service/impl/ExecutionHistoryServiceImpl.java
浏览文件 @
31be1b94
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.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.matrix.database.entity.BaseEntity
;
import
org.matrix.database.entity.ExecutionHistory
;
import
org.matrix.database.mapper.ExecutionHistoryMapper
;
import
org.matrix.database.service.IExecutionHistoryService
;
import
org.matrix.database.vo.ExecutionHistoryVo
;
import
org.matrix.enums.ExecutionHistoryStatus
;
import
org.matrix.exception.GlobalException
;
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>
* 服务实现类
...
...
@@ -22,7 +34,15 @@ public class ExecutionHistoryServiceImpl extends ServiceImpl<ExecutionHistoryMap
@Override
public
IPage
<
ExecutionHistoryVo
>
pageExecutionHistoryVoByCaseIdAndJobId
(
Long
caseId
,
Long
jobId
,
int
pageNum
,
int
pageSize
)
{
// todo 黄夏豪 等待接入用户ID
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
);
}
}
kt-base/src/main/java/org/matrix/database/service/impl/ExecutionRecordImpl.java
浏览文件 @
31be1b94
...
...
@@ -9,7 +9,7 @@ import org.matrix.database.mapper.ExecutionRecordMapper;
import
org.matrix.database.service.IExecutionRecordService
;
import
org.matrix.enums.ExecutionRecType
;
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.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
kt-base/src/main/java/org/matrix/socket/
HttpAuth
Handler.java
→
kt-base/src/main/java/org/matrix/socket/
ExecutionSocket
Handler.java
浏览文件 @
31be1b94
...
...
@@ -4,6 +4,11 @@ import com.alibaba.fastjson.JSON;
import
com.alibaba.fastjson.JSONException
;
import
org.matrix.actuators.usecase.CaseActuator
;
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.web.socket.CloseStatus
;
import
org.springframework.web.socket.TextMessage
;
...
...
@@ -11,28 +16,22 @@ import org.springframework.web.socket.WebSocketSession;
import
org.springframework.web.socket.handler.TextWebSocketHandler
;
/**
* webSocket处理
* webSocket处理
调用和执行的日志发送
*
* @author huangxiahao
*/
@Component
public
class
HttpAuth
Handler
extends
TextWebSocketHandler
{
public
class
ExecutionSocket
Handler
extends
TextWebSocketHandler
{
final
CaseActuator
caseActuator
;
final
ITestDataService
testDataService
;
public
HttpAuth
Handler
(
CaseActuator
caseActuator
,
ITestDataService
testDataService
)
{
public
ExecutionSocket
Handler
(
CaseActuator
caseActuator
,
ITestDataService
testDataService
)
{
this
.
caseActuator
=
caseActuator
;
this
.
testDataService
=
testDataService
;
}
@Override
public
void
afterConnectionEstablished
(
WebSocketSession
session
)
throws
Exception
{
super
.
afterConnectionEstablished
(
session
);
System
.
out
.
println
(
"连接成功了"
);
}
@Override
protected
void
handleTextMessage
(
WebSocketSession
session
,
TextMessage
message
)
throws
Exception
{
String
payload
=
message
.
getPayload
();
...
...
kt-base/src/main/java/org/matrix/socket/ExecutionStatusMonitorSocketPool.java
0 → 100644
浏览文件 @
31be1b94
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
);
}
}
kt-base/src/main/java/org/matrix/socket/SocketType.java
→
kt-base/src/main/java/org/matrix/socket/
enums/
SocketType.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
enums
;
/**
* @author huangxiahao
...
...
kt-base/src/main/java/org/matrix/socket/TestExecuteType.java
→
kt-base/src/main/java/org/matrix/socket/
enums/
TestExecuteType.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
enums
;
/**
* @author huangxiahao
...
...
kt-base/src/main/java/org/matrix/socket/ExecuteMonitorSocketPool.java
→
kt-base/src/main/java/org/matrix/socket/
pool/
ExecuteMonitorSocketPool.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
pool
;
import
org.springframework.web.socket.WebSocketSession
;
...
...
@@ -7,54 +7,64 @@ import java.util.List;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* 订阅执行日志的池子
*
* @author huangxiahao
*/
public
class
ExecuteMonitorSocketPool
{
/**
* unionKey -> socket队列
* key为unionKey value 为 socket队列
*/
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
<>();
public
static
void
add
(
String
key
,
WebSocketSession
clientSocket
)
{
if
(
clientSocket
!=
null
&
key
!=
null
)
{
public
static
void
add
(
String
key
,
WebSocketSession
clientSocket
)
{
if
(
clientSocket
!=
null
&
key
!=
null
)
{
List
<
WebSocketSession
>
webSocketSessions
=
SOCKET_MAP
.
get
(
key
);
if
(
webSocketSessions
!=
null
)
{
if
(
webSocketSessions
!=
null
)
{
webSocketSessions
.
add
(
clientSocket
);
}
else
{
}
else
{
webSocketSessions
=
new
ArrayList
<>();
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
)
{
if
(
socketId
!=
null
&
key
!=
null
)
{
public
static
void
addKeyMap
(
String
socketId
,
String
key
)
{
if
(
socketId
!=
null
&
key
!=
null
)
{
List
<
String
>
list
=
SOCKET_KEY_MAP
.
get
(
socketId
);
if
(
list
!=
null
)
{
if
(
list
!=
null
)
{
list
.
add
(
key
);
}
else
{
}
else
{
list
=
new
ArrayList
<>();
list
.
add
(
key
);
SOCKET_KEY_MAP
.
put
(
socketId
,
list
);
SOCKET_KEY_MAP
.
put
(
socketId
,
list
);
}
}
}
public
static
void
remove
(
WebSocketSession
clientSocket
){
List
<
String
>
list
=
SOCKET_KEY_MAP
.
get
(
clientSocket
.
getId
());
if
(
list
!=
null
){
public
static
void
remove
(
WebSocketSession
clientSocket
)
{
String
socketId
=
clientSocket
.
getId
();
List
<
String
>
list
=
SOCKET_KEY_MAP
.
get
(
socketId
);
if
(
list
!=
null
)
{
for
(
String
s
:
list
)
{
SOCKET_MAP
.
get
(
s
).
remove
(
clientSocket
);
}
}
SOCKET_KEY_MAP
.
remove
(
socketId
);
}
public
static
List
<
WebSocketSession
>
get
(
String
key
){
return
SOCKET_MAP
.
get
(
key
);
public
static
List
<
WebSocketSession
>
get
(
String
key
)
{
return
SOCKET_MAP
.
get
(
key
);
}
}
\ No newline at end of file
kt-base/src/main/java/org/matrix/socket/TestCaseExecuteSocketPool.java
→
kt-base/src/main/java/org/matrix/socket/
pool/
TestCaseExecuteSocketPool.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
pool
;
import
org.springframework.web.socket.WebSocketSession
;
...
...
kt-base/src/main/java/org/matrix/socket/LogQueueRuntime.java
→
kt-base/src/main/java/org/matrix/socket/
queue/
LogQueueRuntime.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
queue
;
import
cn.hutool.log.LogFactory
;
import
cn.hutool.log.level.Level
;
...
...
@@ -6,6 +6,10 @@ import com.alibaba.fastjson.JSONObject;
import
org.matrix.actuators.util.ThreadUtil
;
import
org.matrix.database.service.IExecutionRecordService
;
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.springframework.web.socket.TextMessage
;
import
org.springframework.web.socket.WebSocketSession
;
...
...
@@ -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
.
setTestJobId
(
jobId
);
testExecuteLog
.
setTestCaseId
(
caseId
);
...
...
kt-base/src/main/java/org/matrix/socket/CaseExecuteVo.java
→
kt-base/src/main/java/org/matrix/socket/
vo/
CaseExecuteVo.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
vo
;
import
lombok.Data
;
import
org.matrix.database.entity.TestCaseListDataBto
;
import
org.matrix.socket.enums.TestExecuteType
;
import
java.util.List
;
...
...
kt-base/src/main/java/org/matrix/socket/ExecuteMonitorVo.java
→
kt-base/src/main/java/org/matrix/socket/
vo/
ExecuteMonitorVo.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
vo
;
import
lombok.Data
;
import
org.matrix.database.entity.TestCaseListDataBto
;
import
java.util.List
;
/**
* 接收前端传入的用例执行信息
* @author huangxiahao
*/
@Data
public
class
ExecuteMonitorVo
extends
SocketVo
{
public
class
ExecuteMonitorVo
extends
SocketVo
{
private
String
unionKey
;
...
...
kt-base/src/main/java/org/matrix/socket/SocketVo.java
→
kt-base/src/main/java/org/matrix/socket/
vo/
SocketVo.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
vo
;
import
lombok.Data
;
import
org.matrix.socket.enums.SocketType
;
/**
* 接收socket获取的信息的基本类
...
...
kt-base/src/main/java/org/matrix/socket/TestExecuteLog.java
→
kt-base/src/main/java/org/matrix/socket/
vo/
TestExecuteLog.java
浏览文件 @
31be1b94
package
org
.
matrix
.
socket
;
package
org
.
matrix
.
socket
.
vo
;
import
lombok.Data
;
import
org.matrix.socket.enums.TestExecuteType
;
import
java.util.ArrayList
;
import
java.util.List
;
...
...
kt-base/src/main/java/org/matrix/testNg/TestPigeon.java
浏览文件 @
31be1b94
...
...
@@ -13,9 +13,9 @@ import org.matrix.database.entity.TestData;
import
org.matrix.database.service.ITestCaseService
;
import
org.matrix.database.service.ITestDataService
;
import
org.matrix.exception.GlobalException
;
import
org.matrix.socket.LogQueueRuntime
;
import
org.matrix.socket.TestCaseExecuteSocketPool
;
import
org.matrix.socket.TestExecuteType
;
import
org.matrix.socket.
queue.
LogQueueRuntime
;
import
org.matrix.socket.
pool.
TestCaseExecuteSocketPool
;
import
org.matrix.socket.
enums.
TestExecuteType
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.test.context.SpringBootTest
;
...
...
kt-base/src/test/java/org/matrix/actuators/http/CaseActuatorTest.java
浏览文件 @
31be1b94
package
org
.
matrix
.
actuators
.
http
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
org.junit.jupiter.api.Test
;
import
org.junit.runner.RunWith
;
import
org.matrix.actuators.httpclient.HttpClientActuator
;
import
org.matrix.actuators.usecase.CaseActuator
;
import
org.matrix.actuators.usecase.TestCaseExecuteResult
;
import
org.matrix.database.entity.ExecutionRecord
;
import
org.matrix.database.entity.TestCase
;
import
org.matrix.database.entity.TestCaseBTO
;
import
org.matrix.database.entity.TestData
;
import
org.matrix.database.service.IExecutionRecordService
;
import
org.matrix.database.service.ITestCaseService
;
import
org.matrix.database.service.ITestDataService
;
import
org.matrix.socket.SocketType
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
java.util.ArrayList
;
import
java.util.List
;
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
class
CaseActuatorTest
{
...
...
kt-base/src/test/java/org/matrix/actuators/move/MoveActuatorTest.java
浏览文件 @
31be1b94
package
org
.
matrix
.
actuators
.
move
;
import
org.junit.Assert
;
import
org.junit.jupiter.api.Assertions
;
import
org.junit.jupiter.api.Test
;
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.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.junit4.SpringRunner
;
...
...
kt-web/src/main/java/org/matrix/autotest/controller/ExecutionHistoryController.java
浏览文件 @
31be1b94
...
...
@@ -25,7 +25,7 @@ public class ExecutionHistoryController {
}
@ApiOperation
(
value
=
"分页查询执行历史"
,
notes
=
"假如查询测试用例的执行历史,请入参caseId,假如查询测试任务的执行历史,请入参jobId"
)
@GetMapping
(
"/
findE
xecutionHistory"
)
@GetMapping
(
"/xecutionHistory"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"pageSize"
,
value
=
"页码"
,
required
=
true
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"pageNum"
,
value
=
"当前页显示调试"
,
required
=
true
,
paramType
=
"query"
),
...
...
@@ -43,4 +43,22 @@ public class ExecutionHistoryController {
?
CommonResult
.
success
(
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
,
"查询失败或无数据"
);
}
}
kt-web/src/main/java/org/matrix/autotest/controller/ExecutionRecordController.java
浏览文件 @
31be1b94
...
...
@@ -10,7 +10,7 @@ import org.matrix.database.service.IExecutionRecordService;
import
org.matrix.database.vo.CommonResult
;
import
org.matrix.database.vo.CommonResultObj
;
import
org.matrix.enums.ExecutionRecType
;
import
org.matrix.socket.TestExecuteType
;
import
org.matrix.socket.
enums.
TestExecuteType
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.*
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论