提交 fb244ef8 authored 作者: Matrix's avatar Matrix

refactor(SQL执行器): 代码优化

上级 066c0cf7
...@@ -4,11 +4,13 @@ import cn.hutool.core.util.ReUtil; ...@@ -4,11 +4,13 @@ import cn.hutool.core.util.ReUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.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.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.config.HttpRequestConfig;
import org.matrix.database.entity.DynamicVariable; import org.matrix.database.entity.DynamicVariable;
import org.matrix.database.entity.Example; import org.matrix.database.entity.Example;
...@@ -17,8 +19,6 @@ import org.matrix.database.service.IConnectService; ...@@ -17,8 +19,6 @@ import org.matrix.database.service.IConnectService;
import org.matrix.database.service.IDynamicVariableService; import org.matrix.database.service.IDynamicVariableService;
import org.matrix.database.service.IExampleService; import org.matrix.database.service.IExampleService;
import org.matrix.database.service.ITestCaseService; 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.enums.DynamicVarType;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
...@@ -102,51 +102,58 @@ public class SqlExpActuator implements Actuator { ...@@ -102,51 +102,58 @@ public class SqlExpActuator implements Actuator {
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));
// 1.如果是常量则直接返回 // 依据变量类型的不同调用不同的Handler
if (varType == CONSTANT_VARIABLE) { if (varType == CONSTANT_VARIABLE) {
return dynamicVar.getDetail(); 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}这类的共享变量(如果有的话) private String handleCaseVar(Long envId, Long projectId, DynamicVariable dynamicVar) {
String sqlExp = dynamicVar.getSqlExpDetail().getSqlExp(); CaseActuator caseActuator = new CaseActuator(envId, projectId);
sqlExp = replaceEnvVar(sqlExp, envId); long caseId = Long.parseLong(dynamicVar.getDetail());
TestCase testCase = Optional.of(caseService.getById(caseId))
List<SqlRegObject> dynamicVarList = findDynamicVarList(dynamicVar.getDetail()); .orElseThrow(() -> new GlobalException(String.format("没有找到id = %d 的TestCase", caseId)));
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量 HttpResponseDetail responseDetail = (HttpResponseDetail) caseActuator.executeTestCase(testCase).getBaseTestCaseRequestDetail();
if (isEmpty(dynamicVarList)) { return responseDetail.getResponseBody();
// 如果查到的动态变量列表为空,则直接执行SQL }
List<Map<String, Object>> resultList = runSql(dynamicVar, envId);
return takenResultString(resultList, dynamicVar.getTakenField(), Math.toIntExact(takenIndex)); private String handleHttpVar(Long envId, Long projectId, DynamicVariable dynamicVar) {
} else { HttpClientActuator httpClient = new HttpClientActuator(new HttpRequestConfig(), envId, projectId);
// 如果还存在动态变量,则继续递归解析 HttpRequestDetail httpRequestDetail = JSON.parseObject(dynamicVar.getDetail(), HttpRequestDetail.class);
for (SqlRegObject sqlReg : dynamicVarList) { return httpClient.sendHttpRequest(httpRequestDetail).getResponseBody();
DynamicVariable recVar = varService.getByName(sqlReg.getVarName(), projectId) }
.orElseThrow(() -> new GlobalException(
String.format("没有找到项目id = %d 下,name = %s的变量", projectId, sqlReg.getVarName()))); private String handleSqlVar(Long envId, Integer takenIndex, Long projectId, DynamicVariable dynamicVar) {
String calculatedValue = parseVar(envId, sqlReg.getIndex(), projectId, recVar); // 首先替换掉#{id}这类的共享变量(如果有的话)
sqlExp = sqlExp.replaceAll(sqlReg.getVarName(), calculatedValue); String sqlExp = dynamicVar.getSqlExpDetail().getSqlExp();
} sqlExp = replaceEnvVar(sqlExp, envId);
// 将里面的动态变量全部计算完替换之后返回出去
return sqlExp; 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 "";
} }
/** /**
......
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 {
}
...@@ -84,15 +84,6 @@ ...@@ -84,15 +84,6 @@
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.79</version> <version>1.2.79</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论