Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
kt-keystone
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
kt-keystone
Commits
fb244ef8
提交
fb244ef8
authored
1月 20, 2022
作者:
Matrix
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(SQL执行器): 代码优化
上级
066c0cf7
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
51 行增加
和
65 行删除
+51
-65
SqlExpActuator.java
...rc/main/java/org/matrix/actuators/sql/SqlExpActuator.java
+51
-44
DataProvider.java
kt-base/src/main/java/org/matrix/testNg/DataProvider.java
+0
-11
pom.xml
pom.xml
+0
-10
没有找到文件。
kt-base/src/main/java/org/matrix/actuators/sql/SqlExpActuator.java
浏览文件 @
fb244ef8
...
...
@@ -4,11 +4,13 @@ import cn.hutool.core.util.ReUtil;
import
com.alibaba.fastjson.JSON
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.matrix.actuators.usecase.CaseActuator
;
import
org.matrix.actuators.httpclient.HttpClientActuator
;
import
org.matrix.actuators.Actuator
;
import
org.matrix.actuators.datasource.DataSourceDTO
;
import
org.matrix.actuators.datasource.IDataSourceService
;
import
org.matrix.actuators.httpclient.HttpClientActuator
;
import
org.matrix.actuators.httpclient.HttpRequestDetail
;
import
org.matrix.actuators.httpclient.HttpResponseDetail
;
import
org.matrix.actuators.usecase.CaseActuator
;
import
org.matrix.config.HttpRequestConfig
;
import
org.matrix.database.entity.DynamicVariable
;
import
org.matrix.database.entity.Example
;
...
...
@@ -17,8 +19,6 @@ import org.matrix.database.service.IConnectService;
import
org.matrix.database.service.IDynamicVariableService
;
import
org.matrix.database.service.IExampleService
;
import
org.matrix.database.service.ITestCaseService
;
import
org.matrix.actuators.httpclient.HttpRequestDetail
;
import
org.matrix.actuators.httpclient.HttpResponseDetail
;
import
org.matrix.enums.DynamicVarType
;
import
org.matrix.exception.GlobalException
;
import
org.springframework.context.annotation.Lazy
;
...
...
@@ -102,51 +102,58 @@ public class SqlExpActuator implements Actuator {
private
String
parseVar
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
DynamicVarType
varType
=
dynamicVar
.
getType
();
log
.
info
(
"[SQL解析器] 当前解析的动态变量是: {}"
,
JSON
.
toJSONString
(
dynamicVar
));
//
1.如果是常量则直接返回
//
依据变量类型的不同调用不同的Handler
if
(
varType
==
CONSTANT_VARIABLE
)
{
return
dynamicVar
.
getDetail
();
}
else
if
(
varType
==
SQL_VARIABLE
)
{
return
handleSqlVar
(
envId
,
takenIndex
,
projectId
,
dynamicVar
);
}
else
if
(
varType
==
HTTP_VARIABLE
)
{
return
handleHttpVar
(
envId
,
projectId
,
dynamicVar
);
}
else
if
(
varType
==
CASE_VARIABLE
)
{
return
handleCaseVar
(
envId
,
projectId
,
dynamicVar
);
}
else
{
throw
new
GlobalException
(
"不支持的动态变量类型: "
+
varType
);
}
// 2.如果是SQL变量,则需要解析SQL
if
(
varType
==
SQL_VARIABLE
)
{
// 首先替换掉#{id}这类的共享变量(如果有的话)
String
sqlExp
=
dynamicVar
.
getSqlExpDetail
().
getSqlExp
();
sqlExp
=
replaceEnvVar
(
sqlExp
,
envId
);
List
<
SqlRegObject
>
dynamicVarList
=
findDynamicVarList
(
dynamicVar
.
getDetail
());
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
if
(
isEmpty
(
dynamicVarList
))
{
// 如果查到的动态变量列表为空,则直接执行SQL
List
<
Map
<
String
,
Object
>>
resultList
=
runSql
(
dynamicVar
,
envId
);
return
takenResultString
(
resultList
,
dynamicVar
.
getTakenField
(),
Math
.
toIntExact
(
takenIndex
));
}
else
{
// 如果还存在动态变量,则继续递归解析
for
(
SqlRegObject
sqlReg
:
dynamicVarList
)
{
DynamicVariable
recVar
=
varService
.
getByName
(
sqlReg
.
getVarName
(),
projectId
)
.
orElseThrow
(()
->
new
GlobalException
(
String
.
format
(
"没有找到项目id = %d 下,name = %s的变量"
,
projectId
,
sqlReg
.
getVarName
())));
String
calculatedValue
=
parseVar
(
envId
,
sqlReg
.
getIndex
(),
projectId
,
recVar
);
sqlExp
=
sqlExp
.
replaceAll
(
sqlReg
.
getVarName
(),
calculatedValue
);
}
// 将里面的动态变量全部计算完替换之后返回出去
return
sqlExp
;
}
private
String
handleCaseVar
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
CaseActuator
caseActuator
=
new
CaseActuator
(
envId
,
projectId
);
long
caseId
=
Long
.
parseLong
(
dynamicVar
.
getDetail
());
TestCase
testCase
=
Optional
.
of
(
caseService
.
getById
(
caseId
))
.
orElseThrow
(()
->
new
GlobalException
(
String
.
format
(
"没有找到id = %d 的TestCase"
,
caseId
)));
HttpResponseDetail
responseDetail
=
(
HttpResponseDetail
)
caseActuator
.
executeTestCase
(
testCase
).
getBaseTestCaseRequestDetail
();
return
responseDetail
.
getResponseBody
();
}
private
String
handleHttpVar
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
HttpClientActuator
httpClient
=
new
HttpClientActuator
(
new
HttpRequestConfig
(),
envId
,
projectId
);
HttpRequestDetail
httpRequestDetail
=
JSON
.
parseObject
(
dynamicVar
.
getDetail
(),
HttpRequestDetail
.
class
);
return
httpClient
.
sendHttpRequest
(
httpRequestDetail
).
getResponseBody
();
}
private
String
handleSqlVar
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
// 首先替换掉#{id}这类的共享变量(如果有的话)
String
sqlExp
=
dynamicVar
.
getSqlExpDetail
().
getSqlExp
();
sqlExp
=
replaceEnvVar
(
sqlExp
,
envId
);
List
<
SqlRegObject
>
dynamicVarList
=
findDynamicVarList
(
dynamicVar
.
getDetail
());
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
if
(
isEmpty
(
dynamicVarList
))
{
// 如果查到的动态变量列表为空,则直接执行SQL
List
<
Map
<
String
,
Object
>>
resultList
=
runSql
(
dynamicVar
,
envId
);
return
takenResultString
(
resultList
,
dynamicVar
.
getTakenField
(),
Math
.
toIntExact
(
takenIndex
));
}
else
{
// 如果还存在动态变量,则继续递归解析
for
(
SqlRegObject
sqlReg
:
dynamicVarList
)
{
DynamicVariable
recVar
=
varService
.
getByName
(
sqlReg
.
getVarName
(),
projectId
)
.
orElseThrow
(()
->
new
GlobalException
(
String
.
format
(
"没有找到项目id = %d 下,name = %s的变量"
,
projectId
,
sqlReg
.
getVarName
())));
String
calculatedValue
=
parseVar
(
envId
,
sqlReg
.
getIndex
(),
projectId
,
recVar
);
sqlExp
=
sqlExp
.
replaceAll
(
sqlReg
.
getVarName
(),
calculatedValue
);
}
// 将里面的动态变量全部计算完替换之后返回出去
return
sqlExp
;
}
// 3.如果是HTTP接口,则调用http接口
if
(
varType
==
HTTP_VARIABLE
)
{
HttpClientActuator
httpClient
=
new
HttpClientActuator
(
new
HttpRequestConfig
(),
envId
,
projectId
);
HttpRequestDetail
httpRequestDetail
=
JSON
.
parseObject
(
dynamicVar
.
getDetail
(),
HttpRequestDetail
.
class
);
return
httpClient
.
sendHttpRequest
(
httpRequestDetail
).
getResponseBody
();
}
// 4.如果是测试用例,则调用测试用例执行器
if
(
varType
==
CASE_VARIABLE
)
{
CaseActuator
caseActuator
=
new
CaseActuator
(
envId
,
projectId
);
long
caseId
=
Long
.
parseLong
(
dynamicVar
.
getDetail
());
TestCase
testCase
=
Optional
.
of
(
caseService
.
getById
(
caseId
))
.
orElseThrow
(()
->
new
GlobalException
(
String
.
format
(
"没有找到id = %d 的TestCase"
,
caseId
)));
HttpResponseDetail
responseDetail
=
(
HttpResponseDetail
)
caseActuator
.
executeTestCase
(
testCase
).
getBaseTestCaseRequestDetail
();
return
responseDetail
.
getResponseBody
();
}
return
""
;
}
/**
...
...
kt-base/src/main/java/org/matrix/testNg/DataProvider.java
deleted
100644 → 0
浏览文件 @
066c0cf7
package
org
.
matrix
.
testNg
;
/**
* DataProvider.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/12/27 at 6:01 PM
* Suffering is the most powerful teacher of life.
*/
public
class
DataProvider
{
}
pom.xml
浏览文件 @
fb244ef8
...
...
@@ -84,15 +84,6 @@
<artifactId>
fastjson
</artifactId>
<version>
1.2.79
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.79
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论