提交 e82e62c2 authored 作者: 黄夏豪's avatar 黄夏豪

fix(base): 修复了case执行器,如果前端不给detail会出现空指针的情况

上级 05d9a191
package org.matrix.actuators.move;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -23,6 +24,7 @@ import org.matrix.enums.MoveType;
import org.matrix.exception.GlobalException;
import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.util.BeanFlattener;
import org.matrix.util.JsonFormatUtil;
import org.springframework.stereotype.Component;
import java.util.*;
......@@ -207,7 +209,7 @@ public class MoveActuator implements Actuator {
LogQueueRuntime.addNewLog(getClass(),MOVE_ACTUATOR, String.format(
"当前执行的行为策略 = %s, 行为名 = %s, 动作名 = %s , 动作id = %d , 动作池里的变量 = %s",
strategy.getDes(),move.getName(),action.getName(),action.getId(),res));
strategy.getDes(),move.getName(),action.getName(),action.getId(), JsonFormatUtil.formatJson(JSONObject.toJSONString(res))));
log.info("[动作执行器] 动作执行完毕");
}
......
......@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.matrix.actuators.Actuator;
import org.matrix.actuators.checkpoint.CheckPointActuator;
import org.matrix.actuators.datasource.DataSourceDTO;
import org.matrix.actuators.datasource.IDataSourceService;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.move.MoveActuator;
......@@ -29,6 +28,7 @@ import org.matrix.socket.pool.TestCaseExecuteSocketPool;
import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.socket.vo.TestExecuteLog;
import org.matrix.util.JsonFormatUtil;
import org.matrix.util.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -86,11 +86,9 @@ public class CaseActuator implements Actuator {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!");
executeMove(testCaseBto.getTestCase().getMoveBefore()
, envId, projectId, null, MoveStrategy.PRE_MOVE);
//向线程中设置当前正在执行的DataId
LogQueueRuntime.setTestData(testCaseBto.getTestData().getId());
LocalDateTime dataStartTime = LocalDateTime.now();
//执行测试用例的本体内容
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail(
HttpResponseDetail baseTestCaseResponseDetail = executionCaseDetail(
envId,
projectId,
testCaseBto.getTestCase(),
......@@ -116,8 +114,6 @@ public class CaseActuator implements Actuator {
baseTestCaseResponseDetail,
checkPointResult);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, JSON.toJSONString(testDataExecuteResult));
//将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData();
return testDataExecuteResult;
}
......@@ -142,7 +138,7 @@ public class CaseActuator implements Actuator {
try {
changeExecutionHistoryStatus(ExecutionHistoryStatus.RUN);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行数据组ID:" + testData.getId());
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail(
HttpResponseDetail baseTestCaseResponseDetail = executionCaseDetail(
envId,
projectId,
testCaseBto.getTestCase(),
......@@ -166,7 +162,7 @@ public class CaseActuator implements Actuator {
checkPointResult
);
resultList.add(testDataExecuteResult);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "用例执行结果:" + JSON.toJSONString(testDataExecuteResult));
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "用例执行结果:" + JsonFormatUtil.formatJson(JSONObject.toJSONString(testDataExecuteResult)));
//执行后置动作
executeMove(testCaseBto.getTestCase().getMoveAfterCase()
, envId, projectId, baseTestCaseResponseDetail!=null?baseTestCaseResponseDetail.getResponseBody():null, MoveStrategy.AFT_MOVE);
......@@ -246,13 +242,25 @@ public class CaseActuator implements Actuator {
return new CheckPointResult();
}
private HttpResponseDetail getHttpResponseDetail(
/**
* 根据Case的Detail进行Case的核心部分执行
* @param envId
* @param projectId
* @param testCase
* @param testData
* @return
*/
private HttpResponseDetail executionCaseDetail(
Long envId, Long projectId, TestCase testCase, TestData testData) {
if (testCase.getType().equals(TestCaseTypeEnum.HTTP.getValue())) {
HttpRequestDetail httpRequestDetail = JSON.parseObject(testData.getDetail(), HttpRequestDetail.class);
if (httpRequestDetail==null||httpRequestDetail.getMethod()==null||httpRequestDetail.getRequestType()==null){
throw new GlobalException("HTTP请求发送失败,测试数据组中不存在请求数据");
}
return httpClientActuator.sendHttpRequest(httpRequestDetail, envId, projectId);
}else {
throw new GlobalException("不支持当前测试用例的类型");
}
return null;
}
private CheckPoint getCheckPointEntity(TestData testData) {
......
package org.matrix.util;
import com.alibaba.fastjson.JSONObject;
/**
* 对JSON进行格式化
* @author huangxiahao
*/
public class JsonFormatUtil {
public static String formatJson(String jsonString) {
//json 字符串
int level = 0;
//存放格式化的json字符串
StringBuffer jsonForMatStr = new StringBuffer();
//将字符串中的字符逐个按行输出
for(int index=0;index<jsonString.length();index++)
{
//获取s中的每个字符
char c = jsonString.charAt(index);
//level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入
if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
jsonForMatStr.append(getLevelStr(level));
}
//遇到"{"和"["要增加空格和换行,遇到"}"和"]"要减少空格,以对应,遇到","要换行
switch (c) {
case '{':
case '[':
jsonForMatStr.append(c + "\n");
level++;
break;
case ',':
jsonForMatStr.append(c + "\n");
break;
case '}':
case ']':
jsonForMatStr.append("\n");
level--;
jsonForMatStr.append(getLevelStr(level));
jsonForMatStr.append(c);
break;
default:
jsonForMatStr.append(c);
break;
}
}
return jsonForMatStr.toString();
}
private static String getLevelStr(int level) {
StringBuffer levelStr = new StringBuffer();
for (int levelI = 0; levelI < level; levelI++) {
levelStr.append("\t");
}
return levelStr.toString();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论