Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
kt-keystone
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
kt-keystone
Commits
55c57ba4
提交
55c57ba4
authored
1月 21, 2022
作者:
Matrix
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(SQL执行器): 将SQL执行器里的环境变量替换抽离到环境执行器里
上级
e7acb461
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
87 行增加
和
52 行删除
+87
-52
EnvironmentActuator.java
...in/java/org/matrix/actuators/env/EnvironmentActuator.java
+66
-0
SqlExpActuator.java
...rc/main/java/org/matrix/actuators/sql/SqlExpActuator.java
+21
-52
没有找到文件。
kt-base/src/main/java/org/matrix/actuators/env/EnvironmentActuator.java
0 → 100644
浏览文件 @
55c57ba4
package
org
.
matrix
.
actuators
.
env
;
import
cn.hutool.core.util.ReUtil
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.matrix.actuators.Actuator
;
import
org.matrix.database.entity.Environment
;
import
org.matrix.database.service.IEnvironmentService
;
import
org.matrix.exception.GlobalException
;
import
org.springframework.stereotype.Component
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
/**
* EnvironmentActuator.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/21 at 4:19 PM
* Suffering is the most powerful teacher of life.
*/
@Slf4j
@Component
@AllArgsConstructor
public
class
EnvironmentActuator
implements
Actuator
{
private
final
IEnvironmentService
envService
;
/**
* 用于正则找出形如#{id}这样的环境
*/
public
static
final
String
ENV_VAR_EXP
=
"(#\\{(\\w*)})"
;
/**
* 替换掉SQL表达式中的形如#{id}这样的环境共享变量
* <blockquote><pre>
* 替换前 : select * from user where id = #{id}
* env的变量表 : key = id , value = 5
* 替换后 : select * from user where id = 5
* </pre></blockquote>
*
* @param sqlExp sql表达式
* @param envId 环境共享变量
* @return 替换后的字符串
*/
public
String
replaceEnvVar
(
String
sqlExp
,
Long
envId
)
{
// SQL表达式首先尝试替换掉形如#{name}的共享环境变量 todo 这里的env的map应该做一个缓存
Environment
env
=
Optional
.
of
(
envService
.
getById
(
envId
))
.
orElseThrow
(()
->
new
GlobalException
(
"没有找到对应ID的example(env)对象,id = "
+
envId
));
Map
<
String
,
String
>
envMap
=
env
.
getVariable
();
List
<
String
>
envList
=
ReUtil
.
findAll
(
ENV_VAR_EXP
,
sqlExp
,
2
,
new
ArrayList
<>());
// 到对应env的变量池里找到值替换掉
for
(
String
key
:
envList
)
{
if
(
envMap
.
containsKey
(
key
))
{
log
.
info
(
"[变量替换] 将环境变量 {} 替换为 {}"
,
String
.
format
(
"#{%s}"
,
key
),
envMap
.
get
(
key
));
sqlExp
=
sqlExp
.
replaceAll
(
String
.
format
(
"#\\{%s}"
,
key
),
envMap
.
get
(
key
));
}
else
{
throw
new
GlobalException
(
String
.
format
(
"id = %d 的环境(用例)表里没有key = %s 的数值,当前环境的变量池 = %s"
,
envId
,
key
,
envMap
));
}
}
return
sqlExp
;
}
}
kt-base/src/main/java/org/matrix/actuators/sql/SqlExpActuator.java
浏览文件 @
55c57ba4
package
org
.
matrix
.
actuators
.
sql
;
package
org
.
matrix
.
actuators
.
sql
;
import
cn.hutool.core.util.ReUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.matrix.actuators.Actuator
;
import
org.matrix.actuators.Actuator
;
import
org.matrix.actuators.datasource.DataSourceDTO
;
import
org.matrix.actuators.datasource.DataSourceDTO
;
import
org.matrix.actuators.datasource.IDataSourceService
;
import
org.matrix.actuators.datasource.IDataSourceService
;
import
org.matrix.actuators.env.EnvironmentActuator
;
import
org.matrix.actuators.httpclient.HttpClientActuator
;
import
org.matrix.actuators.httpclient.HttpClientActuator
;
import
org.matrix.actuators.httpclient.HttpRequestDetail
;
import
org.matrix.actuators.httpclient.HttpRequestDetail
;
import
org.matrix.actuators.httpclient.HttpResponseDetail
;
import
org.matrix.actuators.httpclient.HttpResponseDetail
;
import
org.matrix.actuators.usecase.CaseActuator
;
import
org.matrix.actuators.usecase.CaseActuator
;
import
org.matrix.config.HttpRequestConfig
;
import
org.matrix.config.HttpRequestConfig
;
import
org.matrix.database.entity.DynamicVariable
;
import
org.matrix.database.entity.DynamicVariable
;
import
org.matrix.database.entity.Environment
;
import
org.matrix.database.entity.TestCase
;
import
org.matrix.database.entity.TestCase
;
import
org.matrix.database.service.IConnectService
;
import
org.matrix.database.service.IConnectService
;
import
org.matrix.database.service.IDynamicVariableService
;
import
org.matrix.database.service.IDynamicVariableService
;
import
org.matrix.database.service.IEnvironmentService
;
import
org.matrix.database.service.ITestCaseService
;
import
org.matrix.database.service.ITestCaseService
;
import
org.matrix.enums.DynamicVarType
;
import
org.matrix.enums.DynamicVarType
;
import
org.matrix.exception.GlobalException
;
import
org.matrix.exception.GlobalException
;
...
@@ -41,6 +40,7 @@ import static org.springframework.util.CollectionUtils.isEmpty;
...
@@ -41,6 +40,7 @@ import static org.springframework.util.CollectionUtils.isEmpty;
*/
*/
@Slf4j
@Slf4j
@Component
@Component
@AllArgsConstructor
public
class
SqlExpActuator
implements
Actuator
{
public
class
SqlExpActuator
implements
Actuator
{
/**
/**
...
@@ -54,27 +54,13 @@ public class SqlExpActuator implements Actuator {
...
@@ -54,27 +54,13 @@ public class SqlExpActuator implements Actuator {
*/
*/
public
static
final
String
REPLACE_VAR_EXP
=
"\\$\\{%s}(\\[\\w*])?"
;
public
static
final
String
REPLACE_VAR_EXP
=
"\\$\\{%s}(\\[\\w*])?"
;
/**
* 用于正则找出形如#{id}这样的环境
*/
public
static
final
String
ENV_VAR_EXP
=
"(#\\{(\\w*)})"
;
private
final
JdbcTemplate
jdbcTemplate
;
private
final
JdbcTemplate
jdbcTemplate
;
private
final
EnvironmentActuator
envActuator
;
private
final
IDynamicVariableService
varService
;
private
final
IDynamicVariableService
varService
;
private
final
IEnvironmentService
envService
;
private
final
IConnectService
connectService
;
private
final
IConnectService
connectService
;
private
final
IDataSourceService
dataSourceService
;
private
final
IDataSourceService
dataSourceService
;
private
final
ITestCaseService
caseService
;
private
final
ITestCaseService
caseService
;
public
SqlExpActuator
(
JdbcTemplate
jdbcTemplate
,
IDynamicVariableService
varService
,
IEnvironmentService
envService
,
IConnectService
connectService
,
IDataSourceService
dataSourceService
,
ITestCaseService
caseService
)
{
this
.
jdbcTemplate
=
jdbcTemplate
;
this
.
varService
=
varService
;
this
.
envService
=
envService
;
this
.
connectService
=
connectService
;
this
.
dataSourceService
=
dataSourceService
;
this
.
caseService
=
caseService
;
}
/**
/**
* 解析给定的动态变量ByName
* 解析给定的动态变量ByName
*
*
...
@@ -110,6 +96,15 @@ public class SqlExpActuator implements Actuator {
...
@@ -110,6 +96,15 @@ public class SqlExpActuator implements Actuator {
return
parseVar
(
envId
,
0
,
projectId
,
dynamicVar
);
return
parseVar
(
envId
,
0
,
projectId
,
dynamicVar
);
}
}
/**
* 依据不同的变量类型调用不同的解析Handler
* @param envId 环境ID - 环境共享变量需要
* @param takenIndex 使用的结果集下标,递归传递
* @param projectId 项目id,防止SQL表达式中带的嵌合动态变量名字重复
* @param dynamicVar {@link DynamicVariable}
* @return 变量递归解析后的值
*/
private
String
parseVar
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
private
String
parseVar
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
DynamicVarType
varType
=
dynamicVar
.
getType
();
DynamicVarType
varType
=
dynamicVar
.
getType
();
log
.
info
(
"[SQL解析器] 当前解析的动态变量是: {}"
,
JSON
.
toJSONString
(
dynamicVar
));
log
.
info
(
"[SQL解析器] 当前解析的动态变量是: {}"
,
JSON
.
toJSONString
(
dynamicVar
));
...
@@ -117,11 +112,11 @@ public class SqlExpActuator implements Actuator {
...
@@ -117,11 +112,11 @@ public class SqlExpActuator implements Actuator {
if
(
varType
==
CONSTANT_VARIABLE
)
{
if
(
varType
==
CONSTANT_VARIABLE
)
{
return
dynamicVar
.
getDetail
();
return
dynamicVar
.
getDetail
();
}
else
if
(
varType
==
SQL_VARIABLE
)
{
}
else
if
(
varType
==
SQL_VARIABLE
)
{
return
handleSqlVa
r
(
envId
,
takenIndex
,
projectId
,
dynamicVar
);
return
sqlVarHandle
r
(
envId
,
takenIndex
,
projectId
,
dynamicVar
);
}
else
if
(
varType
==
HTTP_VARIABLE
)
{
}
else
if
(
varType
==
HTTP_VARIABLE
)
{
return
h
andleHttpVa
r
(
envId
,
projectId
,
dynamicVar
);
return
h
ttpVarHandle
r
(
envId
,
projectId
,
dynamicVar
);
}
else
if
(
varType
==
CASE_VARIABLE
)
{
}
else
if
(
varType
==
CASE_VARIABLE
)
{
return
handleCaseVa
r
(
envId
,
projectId
,
dynamicVar
);
return
usecaseHandle
r
(
envId
,
projectId
,
dynamicVar
);
}
else
{
}
else
{
throw
new
GlobalException
(
"不支持的动态变量类型: "
+
varType
);
throw
new
GlobalException
(
"不支持的动态变量类型: "
+
varType
);
}
}
...
@@ -135,7 +130,7 @@ public class SqlExpActuator implements Actuator {
...
@@ -135,7 +130,7 @@ public class SqlExpActuator implements Actuator {
* @param dynamicVar {@link DynamicVariable}
* @param dynamicVar {@link DynamicVariable}
* @return 解析后的字符串
* @return 解析后的字符串
*/
*/
private
String
handleCaseVa
r
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
private
String
usecaseHandle
r
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
CaseActuator
caseActuator
=
new
CaseActuator
(
envId
,
projectId
);
CaseActuator
caseActuator
=
new
CaseActuator
(
envId
,
projectId
);
long
caseId
=
Long
.
parseLong
(
dynamicVar
.
getDetail
());
long
caseId
=
Long
.
parseLong
(
dynamicVar
.
getDetail
());
TestCase
testCase
=
Optional
.
of
(
caseService
.
getById
(
caseId
))
TestCase
testCase
=
Optional
.
of
(
caseService
.
getById
(
caseId
))
...
@@ -152,7 +147,7 @@ public class SqlExpActuator implements Actuator {
...
@@ -152,7 +147,7 @@ public class SqlExpActuator implements Actuator {
* @param dynamicVar {@link DynamicVariable}
* @param dynamicVar {@link DynamicVariable}
* @return 解析后的字符串
* @return 解析后的字符串
*/
*/
private
String
h
andleHttpVa
r
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
private
String
h
ttpVarHandle
r
(
Long
envId
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
HttpClientActuator
httpClient
=
new
HttpClientActuator
(
new
HttpRequestConfig
(),
envId
,
projectId
);
HttpClientActuator
httpClient
=
new
HttpClientActuator
(
new
HttpRequestConfig
(),
envId
,
projectId
);
HttpRequestDetail
httpRequestDetail
=
JSON
.
parseObject
(
dynamicVar
.
getDetail
(),
HttpRequestDetail
.
class
);
HttpRequestDetail
httpRequestDetail
=
JSON
.
parseObject
(
dynamicVar
.
getDetail
(),
HttpRequestDetail
.
class
);
return
httpClient
.
sendHttpRequest
(
httpRequestDetail
).
getResponseBody
();
return
httpClient
.
sendHttpRequest
(
httpRequestDetail
).
getResponseBody
();
...
@@ -166,10 +161,10 @@ public class SqlExpActuator implements Actuator {
...
@@ -166,10 +161,10 @@ public class SqlExpActuator implements Actuator {
* @param dynamicVar {@link DynamicVariable}
* @param dynamicVar {@link DynamicVariable}
* @return 解析后的字符串
* @return 解析后的字符串
*/
*/
private
String
handleSqlVa
r
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
private
String
sqlVarHandle
r
(
Long
envId
,
Integer
takenIndex
,
Long
projectId
,
DynamicVariable
dynamicVar
)
{
// 首先替换掉#{id}这类的共享变量(如果有的话)
// 首先替换掉#{id}这类的共享变量(如果有的话)
String
sqlExp
=
dynamicVar
.
getSqlExpDetail
().
getSqlExp
();
String
sqlExp
=
dynamicVar
.
getSqlExpDetail
().
getSqlExp
();
sqlExp
=
replaceEnvVar
(
sqlExp
,
envId
);
sqlExp
=
envActuator
.
replaceEnvVar
(
sqlExp
,
envId
);
List
<
SqlRegularObject
>
dynamicVarList
=
findDynamicVarList
(
dynamicVar
.
getDetail
());
List
<
SqlRegularObject
>
dynamicVarList
=
findDynamicVarList
(
dynamicVar
.
getDetail
());
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
...
@@ -209,32 +204,6 @@ public class SqlExpActuator implements Actuator {
...
@@ -209,32 +204,6 @@ public class SqlExpActuator implements Actuator {
}
}
/**
* 替换掉SQL表达式中的形如#{id}这样的环境共享变量
*
* @param sqlExp sql表达式
* @param envId 环境共享变量
* @return 替换后的字符串
*/
private
String
replaceEnvVar
(
String
sqlExp
,
Long
envId
)
{
// SQL表达式首先尝试替换掉形如#{name}的共享环境变量 todo 这里的env的map应该做一个缓存
Environment
env
=
Optional
.
of
(
envService
.
getById
(
envId
))
.
orElseThrow
(()
->
new
GlobalException
(
"没有找到对应ID的example(env)对象,id = "
+
envId
));
Map
<
String
,
String
>
envMap
=
env
.
getVariable
();
List
<
String
>
envList
=
ReUtil
.
findAll
(
ENV_VAR_EXP
,
sqlExp
,
2
,
new
ArrayList
<>());
// 到对应env的变量池里找到值替换掉
for
(
String
key
:
envList
)
{
if
(
envMap
.
containsKey
(
key
))
{
log
.
info
(
"[变量替换] 将环境变量 {} 替换为 {}"
,
String
.
format
(
"#{%s}"
,
key
),
envMap
.
get
(
key
));
sqlExp
=
sqlExp
.
replaceAll
(
String
.
format
(
"#\\{%s}"
,
key
),
envMap
.
get
(
key
));
}
else
{
throw
new
GlobalException
(
String
.
format
(
"id = %d 的环境(用例)表里没有key = %s 的数值,当前环境的变量池 = %s"
,
envId
,
key
,
envMap
));
}
}
return
sqlExp
;
}
/**
/**
* 执行一段SQL,该SQL表达式必须要是可以直接执行的语句
* 执行一段SQL,该SQL表达式必须要是可以直接执行的语句
...
@@ -252,7 +221,7 @@ public class SqlExpActuator implements Actuator {
...
@@ -252,7 +221,7 @@ public class SqlExpActuator implements Actuator {
.
toDataSourceDTO
();
.
toDataSourceDTO
();
// 替换环境共享变量
// 替换环境共享变量
sqlExp
=
replaceEnvVar
(
sqlExp
,
envId
);
sqlExp
=
envActuator
.
replaceEnvVar
(
sqlExp
,
envId
);
// 校验dynamicVar里的detail是否是可以直接执行的SQL
// 校验dynamicVar里的detail是否是可以直接执行的SQL
if
(
dynamicVar
.
getType
()
==
SQL_VARIABLE
&&
findDynamicVarList
(
sqlExp
).
size
()
==
0
)
{
if
(
dynamicVar
.
getType
()
==
SQL_VARIABLE
&&
findDynamicVarList
(
sqlExp
).
size
()
==
0
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论