Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
kt-keystone
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
kt-keystone
Commits
d34c4271
提交
d34c4271
authored
3月 17, 2022
作者:
黄夏豪
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(base): 修了一些BUG
上级
0af44d11
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
22 个修改的文件
包含
315 行增加
和
142 行删除
+315
-142
HttpClientActuator.java
...a/org/matrix/actuators/httpclient/HttpClientActuator.java
+5
-3
HttpResponseDetail.java
...a/org/matrix/actuators/httpclient/HttpResponseDetail.java
+6
-0
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
+0
-0
RunCaseResult.java
...main/java/org/matrix/actuators/usecase/RunCaseResult.java
+2
-0
TestCaseReport.java
...ain/java/org/matrix/actuators/usecase/TestCaseReport.java
+31
-2
TestCaseTypeEnum.java
...n/java/org/matrix/actuators/usecase/TestCaseTypeEnum.java
+9
-0
TestDataExecuteResult.java
...a/org/matrix/actuators/usecase/TestDataExecuteResult.java
+3
-3
ExecutionHistory.java
...ain/java/org/matrix/database/entity/ExecutionHistory.java
+2
-0
ExecutionHistoryMapper.java
...va/org/matrix/database/mapper/ExecutionHistoryMapper.java
+6
-0
ExecutionRunningException.java
.../java/org/matrix/exception/ExecutionRunningException.java
+26
-0
ExecutionSocketHandler.java
...c/main/java/org/matrix/socket/ExecutionSocketHandler.java
+77
-12
MonitorSocketPool.java
...c/main/java/org/matrix/socket/pool/MonitorSocketPool.java
+3
-1
LogQueueRuntime.java
...rc/main/java/org/matrix/socket/queue/LogQueueRuntime.java
+66
-47
TestExecuteLog.java
...se/src/main/java/org/matrix/socket/vo/TestExecuteLog.java
+9
-3
GenerateReporterJob.java
...ava/org/matrix/testNg/web/report/GenerateReporterJob.java
+2
-2
ReporterData.java
.../main/java/org/matrix/testNg/web/report/ReporterData.java
+27
-27
ReporterDataJob.java
...in/java/org/matrix/testNg/web/report/ReporterDataJob.java
+35
-35
application.yml
kt-base/src/main/resources/application.yml
+2
-0
FileSysController.java
...main/java/org/matrix/fs/controller/FileSysController.java
+0
-2
application.yml
kt-web/src/main/resources/application.yml
+2
-2
没有找到文件。
kt-base/src/main/java/org/matrix/actuators/httpclient/HttpClientActuator.java
浏览文件 @
d34c4271
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
,
...
...
kt-base/src/main/java/org/matrix/actuators/httpclient/HttpResponseDetail.java
浏览文件 @
d34c4271
...
...
@@ -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
;
...
...
kt-base/src/main/java/org/matrix/actuators/move/MoveActuator.java
浏览文件 @
d34c4271
...
...
@@ -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
)
.
getBaseTestCaseRe
quest
Detail
();
.
getBaseTestCaseRe
sponse
Detail
();
}
/**
...
...
kt-base/src/main/java/org/matrix/actuators/sql/SqlExpActuator.java
浏览文件 @
d34c4271
...
...
@@ -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
)
.
getBaseTestCaseRe
quest
Detail
();
.
getBaseTestCaseRe
sponse
Detail
();
return
responseDetail
.
getResponseBody
();
}
...
...
kt-base/src/main/java/org/matrix/actuators/usecase/CaseActuator.java
浏览文件 @
d34c4271
差异被折叠。
点击展开。
kt-base/src/main/java/org/matrix/actuators/usecase/RunCaseResult.java
浏览文件 @
d34c4271
...
...
@@ -17,6 +17,8 @@ public class RunCaseResult extends BaseTime{
private
Long
jobId
;
private
String
uniqueKey
;
/**
* Key为caseId,List为case下的每一个执行结果
*/
...
...
kt-base/src/main/java/org/matrix/actuators/usecase/TestCaseReport.java
浏览文件 @
d34c4271
...
...
@@ -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
;
}
...
...
kt-base/src/main/java/org/matrix/actuators/usecase/TestCaseTypeEnum.java
浏览文件 @
d34c4271
...
...
@@ -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
;
}
}
kt-base/src/main/java/org/matrix/actuators/usecase/TestDataExecuteResult.java
浏览文件 @
d34c4271
...
...
@@ -23,17 +23,17 @@ public class TestDataExecuteResult extends BaseTime{
private
Long
dataId
;
private
BaseTestCaseResponseDetail
baseTestCaseRe
quest
Detail
;
private
BaseTestCaseResponseDetail
baseTestCaseRe
sponse
Detail
;
private
CheckPointResult
checkPointResult
;
public
TestDataExecuteResult
(
LocalDateTime
startTime
,
LocalDateTime
endTime
,
Boolean
executionStatus
,
Long
caseId
,
Long
dataId
,
BaseTestCaseResponseDetail
baseTestCaseRe
quest
Detail
,
CheckPointResult
checkPointResult
)
{
public
TestDataExecuteResult
(
LocalDateTime
startTime
,
LocalDateTime
endTime
,
Boolean
executionStatus
,
Long
caseId
,
Long
dataId
,
BaseTestCaseResponseDetail
baseTestCaseRe
sponse
Detail
,
CheckPointResult
checkPointResult
)
{
super
(
startTime
,
endTime
);
this
.
executionStatus
=
executionStatus
;
this
.
caseId
=
caseId
;
this
.
dataId
=
dataId
;
this
.
baseTestCaseRe
questDetail
=
baseTestCaseRequest
Detail
;
this
.
baseTestCaseRe
sponseDetail
=
baseTestCaseResponse
Detail
;
this
.
checkPointResult
=
checkPointResult
;
}
}
kt-base/src/main/java/org/matrix/database/entity/ExecutionHistory.java
浏览文件 @
d34c4271
...
...
@@ -44,6 +44,8 @@ public class ExecutionHistory extends BaseEntity {
private
ExecutionHistoryStatus
status
=
ExecutionHistoryStatus
.
READY
;
private
String
caseExecuteVoString
;
/**
* 创建时间
*/
...
...
kt-base/src/main/java/org/matrix/database/mapper/ExecutionHistoryMapper.java
浏览文件 @
d34c4271
...
...
@@ -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
);
...
...
kt-base/src/main/java/org/matrix/exception/ExecutionRunningException.java
0 → 100644
浏览文件 @
d34c4271
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
();
}
}
kt-base/src/main/java/org/matrix/socket/ExecutionSocketHandler.java
浏览文件 @
d34c4271
...
...
@@ -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
)
{
...
...
kt-base/src/main/java/org/matrix/socket/pool/MonitorSocketPool.java
浏览文件 @
d34c4271
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
);
}
...
...
kt-base/src/main/java/org/matrix/socket/queue/LogQueueRuntime.java
浏览文件 @
d34c4271
...
...
@@ -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
);
}
...
...
kt-base/src/main/java/org/matrix/socket/vo/TestExecuteLog.java
浏览文件 @
d34c4271
...
...
@@ -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
...
...
kt-base/src/main/java/org/matrix/testNg/web/report/GenerateReporterJob.java
浏览文件 @
d34c4271
...
...
@@ -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
{
...
...
kt-base/src/main/java/org/matrix/testNg/web/report/ReporterData.java
浏览文件 @
d34c4271
...
...
@@ -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
;
}
...
...
kt-base/src/main/java/org/matrix/testNg/web/report/ReporterDataJob.java
浏览文件 @
d34c4271
...
...
@@ -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
;
}
...
...
kt-base/src/main/resources/application.yml
浏览文件 @
d34c4271
...
...
@@ -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
...
...
kt-web/src/main/java/org/matrix/fs/controller/FileSysController.java
浏览文件 @
d34c4271
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
;
...
...
kt-web/src/main/resources/application.yml
浏览文件 @
d34c4271
...
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论