Commit 4a24277c authored by 黎博's avatar 黎博

使用全局变量Map来代替redis存储场景过程中的值

parent e929afb7
...@@ -6,13 +6,15 @@ import java.util.UUID; ...@@ -6,13 +6,15 @@ import java.util.UUID;
public interface AutoUtilsService { public interface AutoUtilsService {
Map<String, String> replaceHeaders(String headers, String variables, UUID uuid); boolean extractResponse(String response, String extract, UUID uuid);
Map<String, String> replaceParameters(String parameters, String variables, UUID uuid); Map<String, Object> extractResponseNew(String response, String extract);
Map<String, String> replaceVariables(String parameters, UUID uuid); Map<String, String> replaceVariables(String parameters, UUID uuid);
boolean extractResponse(String response, String extract, UUID uuid); Map<String, String> replaceVariablesNew(String parameters, Map<String, Object> globalMap);
boolean assertResponse(String response, List<Map> validateList); boolean assertResponse(String response, List<Map> validateList);
Map<String, Object> handlePreCondition(String namespace, String preString, UUID uuid);
} }
package cn.qg.holmes.service.auto.impl; package cn.qg.holmes.service.auto.impl;
import cn.qg.holmes.service.auto.AutoUtilsService; import cn.qg.holmes.service.auto.AutoUtilsService;
import cn.qg.holmes.utils.HttpClientUtils;
import cn.qg.holmes.utils.RedisUtils; import cn.qg.holmes.utils.RedisUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
...@@ -8,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; ...@@ -8,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
...@@ -26,58 +28,38 @@ public class AutoUtilsServiceImpl implements AutoUtilsService { ...@@ -26,58 +28,38 @@ public class AutoUtilsServiceImpl implements AutoUtilsService {
RedisUtils redisUtils; RedisUtils redisUtils;
/** /**
* 将请求headers中的变量替换成对应的值 * 参数替换-新
* @param headers 请求头json * @param parameters headers或者parameters
* @param variables 参数json * @param uuid 唯一标识
* @return
*/
public Map<String, String> replaceHeaders(String headers, String variables, UUID uuid) {
log.info("开始执行请求头替换!");
Map<String, String> headersMap = JSON.parseObject(headers, Map.class);
Map<String, String> varMap = JSON.parseObject(variables, Map.class);
log.info("替换之前的headers:{}", headersMap);
log.info("参数列表:{}", varMap);
for (String key: varMap.keySet()) {
String value = varMap.get(key);
headersMap.put(key, redisUtils.get(uuid + "_" + value.substring(1)).toString());
}
log.info("替换之后的headers:{}", headersMap);
return headersMap;
}
/**
* 将请求体中的变量替换成对应的值
* @param parameters 请求参数json
* @param variables 变量json
* @return 替换后的参数Map
*/ */
public Map<String, String> replaceParameters(String parameters, String variables, UUID uuid) { @Override
log.info("开始执行请求参数替换!"); public Map<String, String> replaceVariables(String parameters, UUID uuid) {
Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class); Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class);
Map<String, String> varMap = JSON.parseObject(variables, Map.class);
log.info("替换之前的参数:{}", parameterMap); log.info("替换之前的参数:{}", parameterMap);
log.info("参数列表:{}", varMap); for (String key: parameterMap.keySet()) {
for (String key: varMap.keySet()) { String value = parameterMap.get(key);
String value = varMap.get(key); if (value.startsWith("$")) {
parameterMap.put(key, redisUtils.get(uuid + "_" + value.substring(1)).toString()); parameterMap.put(key, redisUtils.get(uuid + "_" + value.substring(1)).toString());
} }
}
log.info("替换之后的参数:{}", parameterMap); log.info("替换之后的参数:{}", parameterMap);
return parameterMap; return parameterMap;
} }
/** /**
* 参数替换-新 * 新的参数替换,不再从redis里取值,而是从全局Map中取值
* @param parameters headers或者parameters * @param parameters
* @param uuid 唯一标识 * @param globalMap
* @return
*/ */
@Override @Override
public Map<String, String> replaceVariables(String parameters, UUID uuid) { public Map<String, String> replaceVariablesNew(String parameters, Map<String, Object> globalMap) {
Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class); Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class);
log.info("替换之前的参数:{}", parameterMap); log.info("替换之前的参数:{}", parameterMap);
for (String key: parameterMap.keySet()) { for (String key: parameterMap.keySet()) {
String value = parameterMap.get(key); String value = parameterMap.get(key);
if (value.startsWith("$")) { if (value.startsWith("$")) {
parameterMap.put(key, redisUtils.get(uuid + "_" + value.substring(1)).toString()); parameterMap.put(key, globalMap.get(value.substring(1)).toString());
} }
} }
log.info("替换之后的参数:{}", parameterMap); log.info("替换之后的参数:{}", parameterMap);
...@@ -119,6 +101,35 @@ public class AutoUtilsServiceImpl implements AutoUtilsService { ...@@ -119,6 +101,35 @@ public class AutoUtilsServiceImpl implements AutoUtilsService {
return true; return true;
} }
@Override
public Map<String, Object> extractResponseNew(String response, String extract) {
Map<String, Object> resultMap = new HashMap<>();
try {
Map<String, String> extractMap = JSON.parseObject(extract, Map.class);
for (String key: extractMap.keySet()) {
String value = extractMap.get(key);
String extractValue = "";
// 如果以$开头,则使用JsonPath解析
if (value.startsWith("$")) {
extractValue = JsonPath.read(response, value);
} else {
Pattern pattern = Pattern.compile(value);
Matcher matcher = pattern.matcher(response);
if (matcher.find()) {
extractValue = matcher.group(1);
} else {
return null;
}
}
resultMap.put(key, extractValue);
}
return resultMap;
} catch (Exception e) {
e.printStackTrace();
return resultMap;
}
}
/** /**
* 响应断言 * 响应断言
* @return * @return
...@@ -136,6 +147,42 @@ public class AutoUtilsServiceImpl implements AutoUtilsService { ...@@ -136,6 +147,42 @@ public class AutoUtilsServiceImpl implements AutoUtilsService {
return true; return true;
} }
/**
*
* @param namespace
* @param preString
* @param uuid
* @return
*/
@Override
public Map<String, Object> handlePreCondition(String namespace, String preString, UUID uuid) {
Map<String, Object> resultMap = new HashMap<>();
try {
List<Map> preList = JSON.parseArray(preString, Map.class);
for (Map<String, Object> map: preList) {
String db = map.get("db").toString();
String sql = map.get("sql").toString();
String key = map.get("key").toString();
String type = map.get("type").toString();
Map<String, String> params = new HashMap<>();
params.put("namespace", namespace);
params.put("database", db);
params.put("sql", sql);
params.put("type", type);
String url = "http://localhost:8082/sql/execute";
String result = HttpClientUtils.doGet(url, params);
// String redisKey = uuid + "_" + key;
// redisUtils.set(redisKey, JsonPath.read("$.data", result));
// redisUtils.expire(redisKey, 120);
resultMap.put(key, JsonPath.read("$.data", result));
}
return resultMap;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/** /**
* *
* @param comparator * @param comparator
......
...@@ -49,14 +49,21 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S ...@@ -49,14 +49,21 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S
@Override @Override
public String executeSceneTestcase(String namespace, Integer sceneId, String batch) { public String executeSceneTestcase(String namespace, Integer sceneId, String batch) {
UUID uuid = UUID.randomUUID();
QueryWrapper queryWrapper = new QueryWrapper(); QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("scene_id", sceneId); queryWrapper.eq("scene_id", sceneId);
queryWrapper.orderByAsc("sequence"); queryWrapper.orderByAsc("sequence");
List<SceneTestcase> sceneTestcaseList = sceneTestcaseMapper.selectList(queryWrapper); List<SceneTestcase> sceneTestcaseList = sceneTestcaseMapper.selectList(queryWrapper);
List<Map<String, Object>> resultList = new ArrayList<>(); List<Map<String, Object>> resultList = new ArrayList<>();
// 全局变量Map
Map<String, Object> globalMap = new HashMap<>();
for (SceneTestcase sceneTestcase: sceneTestcaseList) { for (SceneTestcase sceneTestcase: sceneTestcaseList) {
resultList.add(JSON.parseObject(sceneTestcaseExecution(namespace, sceneId, sceneTestcase.getInterfaceId(), sceneTestcase.getSequence(), uuid, batch), Map.class)); // resultList.add(JSON.parseObject(sceneTestcaseExecution(namespace, sceneId, sceneTestcase.getInterfaceId(), sceneTestcase.getSequence(), uuid, batch), Map.class));
Map<String, Object> tempMap = sceneTestcaseExecution(namespace, sceneId, sceneTestcase.getInterfaceId(), sceneTestcase.getSequence(), batch, globalMap);
Map<String, Object> reportMap = (Map<String, Object>) tempMap.get("report");
Map<String, Object> extractMap = (Map<String, Object>) tempMap.get("extract");
resultList.add(reportMap);
// 将解析出来的值放入全局变量Map
globalMap.putAll(extractMap);
} }
return JSON.toJSONString(resultList); return JSON.toJSONString(resultList);
} }
...@@ -71,7 +78,7 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S ...@@ -71,7 +78,7 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S
return sceneTestcaseMapper.getSceneTestcaseListBySceneId(sceneId); return sceneTestcaseMapper.getSceneTestcaseListBySceneId(sceneId);
} }
public String sceneTestcaseExecution(String namespace, Integer sceneId, Integer interfaceId, Integer sequence, UUID uuid, String batch) { public Map<String, Object> sceneTestcaseExecution(String namespace, Integer sceneId, Integer interfaceId, Integer sequence, String batch, Map<String, Object> globalMap) {
QueryWrapper<SceneTestcase> queryWrapper = new QueryWrapper(); QueryWrapper<SceneTestcase> queryWrapper = new QueryWrapper();
queryWrapper.eq("scene_id", sceneId); queryWrapper.eq("scene_id", sceneId);
queryWrapper.eq("interface_id", interfaceId); queryWrapper.eq("interface_id", interfaceId);
...@@ -91,19 +98,13 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S ...@@ -91,19 +98,13 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S
String validate = sceneTestcase.getValidate(); String validate = sceneTestcase.getValidate();
Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class); Map<String, String> parameterMap = JSON.parseObject(parameters, Map.class);
Map<String, String> headersMap = JSON.parseObject(headers, Map.class); Map<String, String> headersMap = JSON.parseObject(headers, Map.class);
// 使用变量替换headers
// if (variables != null && !variables.isEmpty() && headers != null && !headers.isEmpty()) {
// headersMap = autoUtilsService.replaceHeaders(headers, variables, uuid);
// }
if (headers != null && !headers.isEmpty()) { if (headers != null && !headers.isEmpty()) {
headersMap = autoUtilsService.replaceVariables(headers, uuid); // headersMap = autoUtilsService.replaceVariables(headers, uuid);
headersMap = autoUtilsService.replaceVariablesNew(headers, globalMap);
} }
// 使用变量替换参数
// if (variables != null && !variables.isEmpty() && parameters != null && !parameters.isEmpty()) {
// parameterMap = autoUtilsService.replaceParameters(parameters, variables, uuid);
// }
if (parameters != null && !parameters.isEmpty()) { if (parameters != null && !parameters.isEmpty()) {
parameterMap = autoUtilsService.replaceVariables(parameters, uuid); // parameterMap = autoUtilsService.replaceVariables(parameters, uuid);
parameterMap = autoUtilsService.replaceVariablesNew(parameters, globalMap);
} }
// 创建断言列表 // 创建断言列表
List<Map> validateList = new ArrayList<>(); List<Map> validateList = new ArrayList<>();
...@@ -137,17 +138,19 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S ...@@ -137,17 +138,19 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S
assertResult = autoUtilsService.assertResponse(response, validateList); assertResult = autoUtilsService.assertResponse(response, validateList);
} }
// 解析响应 // 解析响应
Map<String, Object> extractMap = new HashMap<>();
if (extract != null && !extract.isEmpty()) { if (extract != null && !extract.isEmpty()) {
autoUtilsService.extractResponse(response, extract, uuid); // autoUtilsService.extractResponse(response, extract, uuid);
extractMap = autoUtilsService.extractResponseNew(response, extract);
} }
Map<String, Object> map = new HashMap<>(); Map<String, Object> reportMap = new HashMap<>();
map.put("url", url); reportMap.put("url", url);
map.put("name", interfaceName); reportMap.put("name", interfaceName);
map.put("headers", headersMap); reportMap.put("headers", headersMap);
map.put("parameters", parameterMap); reportMap.put("parameters", parameterMap);
map.put("assertResult", assertResult); reportMap.put("assertResult", assertResult);
map.put("response", JSON.parseObject(response, Map.class)); reportMap.put("response", JSON.parseObject(response, Map.class));
map.put("elapsedTime", elapsedTime); reportMap.put("elapsedTime", elapsedTime);
// 插入测试报告 // 插入测试报告
SceneTestcaseReport sceneTestcaseReport = new SceneTestcaseReport(); SceneTestcaseReport sceneTestcaseReport = new SceneTestcaseReport();
...@@ -173,7 +176,10 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S ...@@ -173,7 +176,10 @@ public class SceneTestcaseServiceImpl extends ServiceImpl<SceneTestcaseMapper, S
sceneTestcaseReport.setNamespace(namespace); sceneTestcaseReport.setNamespace(namespace);
log.info("保存测试报告:{}", sceneTestcaseReport); log.info("保存测试报告:{}", sceneTestcaseReport);
sceneTestcaseReportService.save(sceneTestcaseReport); sceneTestcaseReportService.save(sceneTestcaseReport);
return JSON.toJSONString(map); Map<String, Object> resultMap = new HashMap<>();
resultMap.put("report", reportMap);
resultMap.put("extract", extractMap);
return resultMap;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment