diff --git a/src/main/java/yi/master/business/message/action/AutoTestAction.java b/src/main/java/yi/master/business/message/action/AutoTestAction.java index 999ba66209a813b55eec6285fddfe6c9435bae5b..f0c0831f075ae4ca4b155721e3a88e72a663a8fd 100644 --- a/src/main/java/yi/master/business/message/action/AutoTestAction.java +++ b/src/main/java/yi/master/business/message/action/AutoTestAction.java @@ -21,6 +21,7 @@ import yi.master.business.testconfig.service.TestConfigService; import yi.master.business.user.bean.User; import yi.master.business.user.service.UserService; import yi.master.constant.SystemConsts; +import yi.master.coretest.message.parse.MessageParse; import yi.master.coretest.message.test.MessageAutoTest; import yi.master.coretest.message.test.TestMessageScene; import yi.master.exception.AppErrorCode; @@ -191,6 +192,8 @@ public class AutoTestAction extends ActionSupport implements ModelDriven getEnableSettingDataParameter(List params) throws Exception { - - if (params == null) { - params = new ArrayList(); - } - - if (this.selfParameter == null) { - throw new Exception("接口参数有变动,导致报文生成不正确!"); - } - - String parameterType = this.selfParameter.getType(); - if (MessageKeys.MessageParameterType.isStringOrNumberType(parameterType)) { - params.add(this.selfParameter); - } else { + if (params == null) { + params = new ArrayList(); + } + + if (this.selfParameter == null) { + throw new Exception("接口参数有变动,导致报文生成不正确!"); + } + + String parameterType = this.selfParameter.getType(); + if (MessageKeys.MessageParameterType.isStringOrNumberType(parameterType)) { + params.add(this.selfParameter); + } else if (MessageKeys.MessageParameterType.ARRAY.name().equalsIgnoreCase(parameterType) + && this.getChildComplexParameters().size() == 0) { + params.add(this.selfParameter); + } else { for (ComplexParameter cp:this.getChildComplexParameters()) { cp.getEnableSettingDataParameter(params); } diff --git a/src/main/java/yi/master/constant/SystemConsts.java b/src/main/java/yi/master/constant/SystemConsts.java index 5234f3624835feffca690e6794396a6fb2b14884..041363192f12994301f1832103b11c3ef10f6c2f 100644 --- a/src/main/java/yi/master/constant/SystemConsts.java +++ b/src/main/java/yi/master/constant/SystemConsts.java @@ -13,7 +13,7 @@ public interface SystemConsts { /** * 当前版本号 */ - String VERSION = "1.0.3"; + String VERSION = "1.0.4"; /** diff --git a/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java b/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java index 4152583376abfb6bed9b88af81d074bfc27ed3bf..2907e124167921319f221c5d471788b768181b0f 100644 --- a/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java @@ -177,15 +177,19 @@ public class JSONMessageParse extends MessageParse { if (MessageParameterType.isArrayType(parameterType)) { message.append("["); - for (int i = 0; i < childParams.size(); i++) { - if (childParams.get(i).getSelfParameter() == null) { - continue; - } - parseJsonMessage(childParams.get(i), message, messageData); - if (i < childParams.size() - 1) { - message.append(","); - } - } + if (childParams.size() == 0) { + message.append(findParameterValue(param, messageData)); + } else { + for (int i = 0; i < childParams.size(); i++) { + if (childParams.get(i).getSelfParameter() == null) { + continue; + } + parseJsonMessage(childParams.get(i), message, messageData); + if (i < childParams.size() - 1) { + message.append(","); + } + } + } message.append("]"); } diff --git a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java index b26b33f92e0f1ea7fa0abeb17cecd44e9d6195bc..b18ee16ac6d9c0aab174ed752230beacb2b10d00 100644 --- a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java +++ b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java @@ -288,6 +288,8 @@ public class MessageAutoTest { entry.getValue() + MessageKeys.CUSTOM_PARAMETER_BOUNDARY_SYMBOL_RIGHT, value)); } + //处理可能存在的路径参数 + scene.setRequestUrl(PracticalUtils.replacePathVariableParameter(scene.getRequestUrl(), scene.getRequestMessage(), scene.getParseUtil())); } boolean successFlag = false; int requestCount = 0; @@ -313,20 +315,26 @@ public class MessageAutoTest { results.add(result); //测试成功要获取保存变量并设置数据状态 if (successFlag) { + String key = null; //保存上下文变量 for (Map.Entry entry:scene.getScene().getConfig().getSaveVariables().entrySet()) { - String str = null; - //保存响应头中的变量 - if (entry.getKey().startsWith("ResponseHeader.") && StringUtils.isNotBlank(result.getHeaders())) { + String str = null; + key = entry.getKey().replaceAll("\"#\"", "\":\""); + //保存响应头中的变量 + if (entry.getKey().startsWith("ResponseHeader.") && StringUtils.isNotBlank(result.getHeaders())) { JSONObject header = JSONObject.fromObject(result.getHeaders()); String headerKey = entry.getKey().substring(entry.getKey().indexOf(".") + 1); if (header.getJSONObject("ResponseHeader").has(headerKey)) { str = header.getJSONObject("ResponseHeader").getString(headerKey); } + //保存入参中的变量 } else if (entry.getKey().startsWith("RequestMessage.")) { - String pathKey = entry.getKey().replace("RequestMessage.", ""); + String pathKey = entry.getKey().replace("RequestMessage.", ""); str = scene.getParseUtil().getObjectByPath(scene.getRequestMessage(), pathKey); - } else { + //通过关联规则去关联 + } else if (MessageKeys.MessageType.JSON.name().equals(MessageParse.judgeType(key))) { + str = PracticalUtils.getValueByRelationKeyWord(JSONObject.fromObject(key), result.getResponseMessage()); + } else { //保存body体中的变量 str = MessageParse.judgeMessageType(result.getResponseMessage()).getObjectByPath(result.getResponseMessage(), entry.getKey()); } @@ -699,15 +707,21 @@ public class MessageAutoTest { //替换测试集公共变量 requestMessage = PracticalUtils.replaceSetPublicVariable(parseUtil.depacketizeMessageToString(msg.getComplexParameter() , paramsData.toString()), config.getPublicDataObject()); - //替换入参报文中的全局变量 - requestMessage = PracticalUtils.replaceGlobalVariable(requestMessage, globalVariableService); - } + + //替换入参报文中的全局变量 + requestMessage = PracticalUtils.replaceGlobalVariable(requestMessage, globalVariableService); + + //处理请求URL中的全局变量 + requestUrl = PracticalUtils.replaceGlobalVariable(requestUrl, globalVariableService); + //处理路径参数:在请求URL中出现 #路径path# + requestUrl = PracticalUtils.replacePathVariableParameter(requestUrl, requestMessage, parseUtil); + testScene.setTestClient(TestClient.getTestClientInstance(info.getInterfaceProtocol())); testScene.setRequestMessage(requestMessage); testScene.setComplexFlag(false); testScene.setScene(scene); - testScene.setRequestUrl(PracticalUtils.replaceGlobalVariable(requestUrl, globalVariableService)); + testScene.setRequestUrl(requestUrl); testScene.setParseUtil(parseUtil); testScene.setBusinessSystem(system); testScene.setConfig(config); diff --git a/src/main/java/yi/master/listener/VersionUpdateUtil.java b/src/main/java/yi/master/listener/VersionUpdateUtil.java index c66b7e37e304ba29418fca1d4c1e3341b44c7704..5bf870bab22529d442bdf08cd9ef540fe91aa7bf 100644 --- a/src/main/java/yi/master/listener/VersionUpdateUtil.java +++ b/src/main/java/yi/master/listener/VersionUpdateUtil.java @@ -49,6 +49,7 @@ public class VersionUpdateUtil { ALL_VERSION_LIST.add("1.0.1"); ALL_VERSION_LIST.add("1.0.2"); ALL_VERSION_LIST.add("1.0.3"); + ALL_VERSION_LIST.add("1.0.4"); } /** diff --git a/src/main/java/yi/master/util/PracticalUtils.java b/src/main/java/yi/master/util/PracticalUtils.java index e4f7fbd9779efb92a9148573ba1020af15a0de71..8415656a36159d996b1c93a8b89c800f972d93b1 100644 --- a/src/main/java/yi/master/util/PracticalUtils.java +++ b/src/main/java/yi/master/util/PracticalUtils.java @@ -650,6 +650,40 @@ public class PracticalUtils { return msg; } + /** + * 处理请求URL中可能存在的路径参数
+ * @author xuwangcheng + * @date 2020/3/4 14:14 + * @param requestUrl requestUrl 路径参数写法 #path# + * @param msg msg + * @return {@link String} + */ + public static String replacePathVariableParameter (String requestUrl, String msg, MessageParse parseUtil) { + if (StringUtils.isBlank(msg) || StringUtils.isBlank(requestUrl)) { + return requestUrl; + } + + String regex = "#(.*?)#"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(requestUrl); + + String pString = null; + String vString = null; + while (matcher.find()) { + pString = "#" + matcher.group(1) + "#"; + if (!requestUrl.contains(pString)) { + continue; + } + + vString = parseUtil.getObjectByPath(msg, matcher.group(1)); + if (StringUtils.isNotBlank(vString)) { + requestUrl = requestUrl.replace(pString, vString); + } + } + + return requestUrl; + } + /** * 替换测试集公共数据变量 * @author xuwangcheng diff --git a/src/main/webapp/resource/message/messageScene.js b/src/main/webapp/resource/message/messageScene.js index 107db3079cc45bdc08639e347fbfefb8f1b98117..dea686ea3af28b2692ee46e01ef9957c866ca8c7 100644 --- a/src/main/webapp/resource/message/messageScene.js +++ b/src/main/webapp/resource/message/messageScene.js @@ -470,7 +470,7 @@ var eventList = { chooseParameterNodePath(REQUEST_URL.MESSAGE_SCENE.GET_REQUEST_MSG_JSON_TREE, {messageSceneId:messageSceneId}, { titleName:currentScene.interfaceName + "-" + currentScene.messageName + "-" + currentScene.sceneName + " 入参节点树", isChoosePath:true, - notChooseTypes:["Array", "Map", "List", "Object"], + notChooseTypes:["Map", "List", "Object"], choosenCallback:function (path) { $("#scene-variables-key").val(path); } @@ -512,12 +512,36 @@ var eventList = { chooseParameterNodePath(getUrl, {messageSceneId:messageSceneId}, { titleName:titleName, isChoosePath:true, - notChooseTypes:["Array", "Map", "List", "Object"], + notChooseTypes:["Map", "List", "Object"], choosenCallback:function (path) { $("#scene-variables-key").val(path); } }); }, + //自定义关联获取组合场景的保存变量 + "#choose-scene-variables-key-relation-add":function() { + let v = $('#scene-variables-key').val(); + if (strIsNotEmpty(v)) { + v = v.replace(/"#"/g, '":"'); + } + if (!isJSON(v)) { + v = "{}"; + } + layer_show("编辑关联规则", templates["complex-scene-variable-relation-keyword"](JSON.parse(v)), 890, 315, 1, null + , function(index, layero) { + v = {}; + v.searchScope = $(layero).find('#searchScope').val(); + v.LB = $(layero).find('#LB').val(); + v.RB = $(layero).find('#RB').val(); + v.OFFSET = $(layero).find('#OFFSET').val(); + v.ORDER = $(layero).find('#ORDER').val(); + v.LENGHT = $(layero).find('#LENGHT').val(); + + $('#scene-variables-key').val(JSON.stringify(v).replace(/":"/g, '"#"')); + layer.msg('已保存配置!', {icon: 1, time:1600}); + layer.close(index); + }, null, {shadeClose: false}); + }, "#choose-header-variables-key":function(){//选择指定的节点路径-请求头或者返回头信息 var getUrl; var titleName; @@ -836,7 +860,7 @@ function editSceneConfigVariable (obj, editMode) { context.add = true; } - layer_show(title + "-" + name, templates["scene-edit-variables"](context), 800, 260, 1, function(layero, index) { + layer_show(title + "-" + name, templates["scene-edit-variables"](context), 875, 260, 1, function(layero, index) { $("#save-new-varibales").attr("layer-index", index); $("#save-new-varibales").attr("mode", editMode); $("#save-new-varibales").attr("parent-parameter-name", name); diff --git a/src/main/webapp/resource/template/customTemplate.htm b/src/main/webapp/resource/template/customTemplate.htm index 5f05b3b9b7d08dc5ccc2d538fb3bb104e228294f..3a001c51955a2ef991b6edd67f6b2a8cc3cd35c8 100644 --- a/src/main/webapp/resource/template/customTemplate.htm +++ b/src/main/webapp/resource/template/customTemplate.htm @@ -428,7 +428,7 @@
@@ -443,26 +443,29 @@ {{#if use}} Query节点 {{/if}} + {{#if add}} + 关联规则 + {{/if}}
-
- -
-
- - {{#if use}} - 上下文变量 - {{/if}} -
-
-
+
+ +
+
+ + {{#if use}} + 上下文变量 + {{/if}} +
+
+
@@ -2176,4 +2179,51 @@
+ + + + \ No newline at end of file diff --git a/update.md b/update.md index e67841f7f18690361647c1ee0529398721b201cf..8c3bde1118e6324a34b3b5c41cab67700668cbb0 100644 --- a/update.md +++ b/update.md @@ -1,8 +1,10 @@ ### v1.0.4 -#### 2020.2.28 +#### 2020.3.9 - 修复:性能测试结果文件保存出错的问题; - 修复:在测试集测试、性能测试中,如果接口中使用了动态接口全局变量时会出现无法获取到正确的值的错误; - +- 新增:对路径参数的支持,在接口、报文、场景的请求路径中使用#参数path#,例如/get/#id#或者/query/#root.id#; +- 更新:非对象数组参数可自定义数据,例如{"root":{"bb":[22,33]}},其中bb数组可在测试数据中被定义,可设置值22,33,44或者"aa","bb"(字符串需加上双引号); +- 新增:在组合场景中可以通过关联规则来获取保存变量。 ### v1.0.3 #### 2020.2.27