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

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

上级 05d9a191
package org.matrix.actuators.move; package org.matrix.actuators.move;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -23,6 +24,7 @@ import org.matrix.enums.MoveType; ...@@ -23,6 +24,7 @@ import org.matrix.enums.MoveType;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
import org.matrix.socket.queue.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.util.BeanFlattener; import org.matrix.util.BeanFlattener;
import org.matrix.util.JsonFormatUtil;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.*; import java.util.*;
...@@ -207,7 +209,7 @@ public class MoveActuator implements Actuator { ...@@ -207,7 +209,7 @@ public class MoveActuator implements Actuator {
LogQueueRuntime.addNewLog(getClass(),MOVE_ACTUATOR, String.format( LogQueueRuntime.addNewLog(getClass(),MOVE_ACTUATOR, String.format(
"当前执行的行为策略 = %s, 行为名 = %s, 动作名 = %s , 动作id = %d , 动作池里的变量 = %s", "当前执行的行为策略 = %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("[动作执行器] 动作执行完毕"); log.info("[动作执行器] 动作执行完毕");
} }
......
...@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; ...@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.checkpoint.CheckPointActuator; import org.matrix.actuators.checkpoint.CheckPointActuator;
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.HttpClientActuator;
import org.matrix.actuators.move.MoveActuator; import org.matrix.actuators.move.MoveActuator;
...@@ -29,6 +28,7 @@ import org.matrix.socket.pool.TestCaseExecuteSocketPool; ...@@ -29,6 +28,7 @@ import org.matrix.socket.pool.TestCaseExecuteSocketPool;
import org.matrix.socket.queue.LogQueueRuntime; import org.matrix.socket.queue.LogQueueRuntime;
import org.matrix.socket.vo.CaseExecuteVo; import org.matrix.socket.vo.CaseExecuteVo;
import org.matrix.socket.vo.TestExecuteLog; import org.matrix.socket.vo.TestExecuteLog;
import org.matrix.util.JsonFormatUtil;
import org.matrix.util.SpringUtils; import org.matrix.util.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -86,11 +86,9 @@ public class CaseActuator implements Actuator { ...@@ -86,11 +86,9 @@ public class CaseActuator implements Actuator {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!");
executeMove(testCaseBto.getTestCase().getMoveBefore() executeMove(testCaseBto.getTestCase().getMoveBefore()
, envId, projectId, null, MoveStrategy.PRE_MOVE); , envId, projectId, null, MoveStrategy.PRE_MOVE);
//向线程中设置当前正在执行的DataId
LogQueueRuntime.setTestData(testCaseBto.getTestData().getId());
LocalDateTime dataStartTime = LocalDateTime.now(); LocalDateTime dataStartTime = LocalDateTime.now();
//执行测试用例的本体内容 //执行测试用例的本体内容
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail( HttpResponseDetail baseTestCaseResponseDetail = executionCaseDetail(
envId, envId,
projectId, projectId,
testCaseBto.getTestCase(), testCaseBto.getTestCase(),
...@@ -116,8 +114,6 @@ public class CaseActuator implements Actuator { ...@@ -116,8 +114,6 @@ public class CaseActuator implements Actuator {
baseTestCaseResponseDetail, baseTestCaseResponseDetail,
checkPointResult); checkPointResult);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, JSON.toJSONString(testDataExecuteResult)); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, JSON.toJSONString(testDataExecuteResult));
//将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData();
return testDataExecuteResult; return testDataExecuteResult;
} }
...@@ -142,7 +138,7 @@ public class CaseActuator implements Actuator { ...@@ -142,7 +138,7 @@ public class CaseActuator implements Actuator {
try { try {
changeExecutionHistoryStatus(ExecutionHistoryStatus.RUN); changeExecutionHistoryStatus(ExecutionHistoryStatus.RUN);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行数据组ID:" + testData.getId()); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行数据组ID:" + testData.getId());
HttpResponseDetail baseTestCaseResponseDetail = getHttpResponseDetail( HttpResponseDetail baseTestCaseResponseDetail = executionCaseDetail(
envId, envId,
projectId, projectId,
testCaseBto.getTestCase(), testCaseBto.getTestCase(),
...@@ -166,7 +162,7 @@ public class CaseActuator implements Actuator { ...@@ -166,7 +162,7 @@ public class CaseActuator implements Actuator {
checkPointResult checkPointResult
); );
resultList.add(testDataExecuteResult); 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() executeMove(testCaseBto.getTestCase().getMoveAfterCase()
, envId, projectId, baseTestCaseResponseDetail!=null?baseTestCaseResponseDetail.getResponseBody():null, MoveStrategy.AFT_MOVE); , envId, projectId, baseTestCaseResponseDetail!=null?baseTestCaseResponseDetail.getResponseBody():null, MoveStrategy.AFT_MOVE);
...@@ -246,13 +242,25 @@ public class CaseActuator implements Actuator { ...@@ -246,13 +242,25 @@ public class CaseActuator implements Actuator {
return new CheckPointResult(); 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) { Long envId, Long projectId, TestCase testCase, TestData testData) {
if (testCase.getType().equals(TestCaseTypeEnum.HTTP.getValue())) { if (testCase.getType().equals(TestCaseTypeEnum.HTTP.getValue())) {
HttpRequestDetail httpRequestDetail = JSON.parseObject(testData.getDetail(), HttpRequestDetail.class); 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); return httpClientActuator.sendHttpRequest(httpRequestDetail, envId, projectId);
}else {
throw new GlobalException("不支持当前测试用例的类型");
} }
return null;
} }
private CheckPoint getCheckPointEntity(TestData testData) { 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论