From ad961dd63a69095d8049d58c6f98b0229b8eaa95 Mon Sep 17 00:00:00 2001 From: xuwangcheng Date: Wed, 4 Mar 2020 15:12:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=AF=B9?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=8F=82=E6=95=B0=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/action/AutoTestAction.java | 3 ++ .../message/test/MessageAutoTest.java | 8 ++++- .../java/yi/master/util/PracticalUtils.java | 33 +++++++++++++++++++ update.md | 3 +- 4 files changed, 45 insertions(+), 2 deletions(-) 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 999ba66..f0c0831 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 + * @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/update.md b/update.md index e67841f..4f486a8 100644 --- a/update.md +++ b/update.md @@ -1,7 +1,8 @@ ### v1.0.4 -#### 2020.2.28 +#### 2020.3.4 - 修复:性能测试结果文件保存出错的问题; - 修复:在测试集测试、性能测试中,如果接口中使用了动态接口全局变量时会出现无法获取到正确的值的错误; +- 新增:对路径参数的支持。 ### v1.0.3 -- Gitee From 0b212285d5d698059de11759294c9386b2889741 Mon Sep 17 00:00:00 2001 From: xuwangcheng Date: Wed, 4 Mar 2020 19:21:32 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=AF=B9?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=8F=82=E6=95=B0=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yi/master/coretest/message/test/MessageAutoTest.java | 4 +++- src/main/java/yi/master/util/PracticalUtils.java | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) 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 c3b4815..281cb65 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; @@ -706,7 +708,7 @@ public class MessageAutoTest { //处理请求URL中的全局变量 requestUrl = PracticalUtils.replaceGlobalVariable(requestUrl, globalVariableService); - //处理路径参数:在请求URL中出现 {路径path} + //处理路径参数:在请求URL中出现 #路径path# requestUrl = PracticalUtils.replacePathVariableParameter(requestUrl, requestMessage, parseUtil); testScene.setTestClient(TestClient.getTestClientInstance(info.getInterfaceProtocol())); diff --git a/src/main/java/yi/master/util/PracticalUtils.java b/src/main/java/yi/master/util/PracticalUtils.java index c22cc11..8415656 100644 --- a/src/main/java/yi/master/util/PracticalUtils.java +++ b/src/main/java/yi/master/util/PracticalUtils.java @@ -654,7 +654,7 @@ public class PracticalUtils { * 处理请求URL中可能存在的路径参数
* @author xuwangcheng * @date 2020/3/4 14:14 - * @param requestUrl requestUrl 路径参数写法 {path} + * @param requestUrl requestUrl 路径参数写法 #path# * @param msg msg * @return {@link String} */ @@ -662,14 +662,15 @@ public class PracticalUtils { if (StringUtils.isBlank(msg) || StringUtils.isBlank(requestUrl)) { return requestUrl; } - String regex = "\\{(.*?)\\}"; + + 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) + "}"; + pString = "#" + matcher.group(1) + "#"; if (!requestUrl.contains(pString)) { continue; } -- Gitee From 89d9b8ddf5e6d1aa1cbd462c68d14d749981072d Mon Sep 17 00:00:00 2001 From: xuwangcheng Date: Sat, 7 Mar 2020 13:37:25 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=9D=9E=E5=AF=B9=E8=B1=A1=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=8F=82=E6=95=B0=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/bean/ComplexParameter.java | 40 +++++++++---------- .../message/parse/JSONMessageParse.java | 22 +++++----- .../message/test/MessageAutoTest.java | 6 +-- .../webapp/resource/message/messageScene.js | 4 +- update.md | 3 +- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/main/java/yi/master/business/message/bean/ComplexParameter.java b/src/main/java/yi/master/business/message/bean/ComplexParameter.java index 292edb3..646e1e4 100644 --- a/src/main/java/yi/master/business/message/bean/ComplexParameter.java +++ b/src/main/java/yi/master/business/message/bean/ComplexParameter.java @@ -1,17 +1,11 @@ package yi.master.business.message.bean; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.struts2.json.annotations.JSON; - import yi.master.constant.MessageKeys; +import java.io.Serializable; +import java.util.*; + /** * 复杂参数组成 @@ -84,19 +78,21 @@ public class ComplexParameter implements Serializable { */ @JSON(serialize=false) public List 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/coretest/message/parse/JSONMessageParse.java b/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java index 4152583..2907e12 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 281cb65..5d1882b 100644 --- a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java +++ b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java @@ -701,11 +701,11 @@ 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# diff --git a/src/main/webapp/resource/message/messageScene.js b/src/main/webapp/resource/message/messageScene.js index 107db30..4212b0d 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,7 +512,7 @@ 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); } diff --git a/update.md b/update.md index 4f486a8..c46ea65 100644 --- a/update.md +++ b/update.md @@ -2,7 +2,8 @@ #### 2020.3.4 - 修复:性能测试结果文件保存出错的问题; - 修复:在测试集测试、性能测试中,如果接口中使用了动态接口全局变量时会出现无法获取到正确的值的错误; -- 新增:对路径参数的支持。 +- 新增:对路径参数的支持,在接口、报文、场景的请求路径中使用#参数path#,例如/get/#id#或者/query/#root.id#; +- 更新:非对象数组参数可自定义数据,例如{"root":{"bb":[22,33]}},其中bb数组可在测试数据中被定义,可设置值22,33,44或者"aa","bb"(字符串需加上双引号); ### v1.0.3 -- Gitee From de977c0a359eadd6a2aa4d0c394e1b2a26b4a4de Mon Sep 17 00:00:00 2001 From: xuwangcheng Date: Mon, 9 Mar 2020 03:34:53 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=9C=A8=E7=BB=84=E5=90=88=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E4=B8=AD=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87=E5=85=B3?= =?UTF-8?q?=E8=81=94=E8=A7=84=E5=88=99=E6=9D=A5=E8=8E=B7=E5=8F=96=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/test/MessageAutoTest.java | 16 ++-- .../webapp/resource/message/messageScene.js | 26 +++++- .../resource/template/customTemplate.htm | 86 +++++++++++++++---- update.md | 4 +- 4 files changed, 106 insertions(+), 26 deletions(-) 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 5d1882b..b18ee16 100644 --- a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java +++ b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java @@ -315,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()); } diff --git a/src/main/webapp/resource/message/messageScene.js b/src/main/webapp/resource/message/messageScene.js index 4212b0d..dea686e 100644 --- a/src/main/webapp/resource/message/messageScene.js +++ b/src/main/webapp/resource/message/messageScene.js @@ -518,6 +518,30 @@ var eventList = { } }); }, + //自定义关联获取组合场景的保存变量 + "#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 5f05b3b..3a001c5 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 c46ea65..8c3bde1 100644 --- a/update.md +++ b/update.md @@ -1,10 +1,10 @@ ### v1.0.4 -#### 2020.3.4 +#### 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 -- Gitee From 37918958ec7d3b9c135de64a6df2d24eb95d9b33 Mon Sep 17 00:00:00 2001 From: xuwangcheng Date: Mon, 9 Mar 2020 03:35:51 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=88=B0v1.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/yi/master/constant/SystemConsts.java | 2 +- src/main/java/yi/master/listener/VersionUpdateUtil.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/yi/master/constant/SystemConsts.java b/src/main/java/yi/master/constant/SystemConsts.java index 5234f36..0413631 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/listener/VersionUpdateUtil.java b/src/main/java/yi/master/listener/VersionUpdateUtil.java index c66b7e3..5bf870b 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"); } /** -- Gitee