From 2f77188fd3e8807074b18f94df8d3c9fc8019f2f Mon Sep 17 00:00:00 2001 From: AgAngle <1323481023@qq.com> Date: Fri, 19 Jul 2024 15:01:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):=20?= =?UTF-8?q?=E5=B8=A6=E5=8F=82=E6=95=B0=E7=9A=84mock=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1044204 --user=陈建星 【接口测试】请求体json类型-参数值为带参数的mock函数-执行接口-函数获取失败 https://www.tapd.cn/55049933/s/1551122 --- .../parser/jmeter/body/MsBodyConverter.java | 9 ++-- .../jmeter/body/MsJsonBodyConverter.java | 46 +++++++++++++++++-- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java index 08fb5b1775..4ef46f4de4 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsBodyConverter.java @@ -87,23 +87,22 @@ public abstract class MsBodyConverter { * @return */ protected String parseTextMock(String text) { - String pattern = "@[a-zA-Z\\\\(|,'-\\\\d ]*[a-zA-Z)-9),\\\\\"]"; + String pattern = "[\"\\s:]@[a-zA-Z\\\\(|,'-\\\\d ]*[a-zA-Z)-9),\\\\\"]"; Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(text); while (matcher.find()) { //取出group的最后一个字符 主要是防止 @string|number 和 @string 这种情况 //如果是 “ 或者, 结尾的 需要截取 String group = matcher.group(); - String lastChar = null; if (group.endsWith(",") || group.endsWith("\"")) { - lastChar = group.substring(group.length() - 1); group = group.substring(0, group.length() - 1); } - text = text.replace(matcher.group(), StringUtils.join("${__Mock(", group, ")}", lastChar)); + // 去掉第一个字符,因为第一个字符是 " : 或者空格 + group = group.substring(1, group.length()); + text = text.replace(group, StringUtils.join("${__Mock(", group.replace(",", "\\,"), ")}")); } return text; } - /** * 处理raw格式参数 * 包含了 json 等格式 diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java index 3288a1ff32..4405ad1c7a 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/jmeter/body/MsJsonBodyConverter.java @@ -1,7 +1,7 @@ package io.metersphere.api.parser.jmeter.body; import io.metersphere.api.dto.request.http.body.JsonBody; -import io.metersphere.jmeter.mock.Mock; +import io.metersphere.jmeter.functions.MockFunction; import io.metersphere.plugin.api.dto.ParameterConfig; import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.LogUtils; @@ -12,6 +12,8 @@ import org.springframework.http.MediaType; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @Author: jianxing @@ -44,11 +46,11 @@ public class MsJsonBodyConverter extends MsBodyConverter { if (StringUtils.startsWith(value, "[") && StringUtils.endsWith(value, "]")) { List list = JSON.parseArray(jsonStr); parseMock(list); - return JSON.toJSONString(list); + return replaceMockComma(JSON.toJSONString(list)); } else { Map map = JSON.parseObject(jsonStr, Map.class); parseMock(map); - return JSON.toJSONString(map); + return replaceMockComma(JSON.toJSONString(map)); } } catch (Exception e) { // 如果json串中的格式不是标准的json格式,正则替换变量 @@ -66,7 +68,7 @@ public class MsJsonBodyConverter extends MsBodyConverter { parseMock((Map) obj); } else if (obj instanceof String) { if (StringUtils.isNotBlank((String) obj)) { - String str = Mock.buildFunctionCallString((String) obj); + String str = buildFunctionCallString((String) obj); replaceDataMap.put(index, str); } } @@ -87,10 +89,44 @@ public class MsJsonBodyConverter extends MsBodyConverter { parseMock((Map) value); } else if (value instanceof String) { if (StringUtils.isNotBlank((String) value)) { - value = Mock.buildFunctionCallString((String) value); + value = buildFunctionCallString((String) value); } map.put(key, value); } } } + + /** + * ${__Mock(@integer(1,100))} -> ${__Mock(@integer(1\,100))} + * 将 mock 函数中的逗号转义,让 jmeter 识别 + * + * @param text + * @return + */ + protected String replaceMockComma(String text) { + String pattern = "\\$\\{__Mock\\((.+)\\)\\}"; + Pattern regex = Pattern.compile(pattern); + Matcher matcher = regex.matcher(text); + while (matcher.find()) { + String group = matcher.group(); + if (StringUtils.contains(group, ",")) { + text = text.replace(group, group.replace(",", "\\,")); + } + } + return text; + } + + /** + * 将文本中的 @xxx 转换成 ${__Mock(@xxx)} + * 这里不使用 Mock.buildFunctionCallString 的逗号转义 + * + * @param input + * @return + */ + public static String buildFunctionCallString(String input) { + if (!StringUtils.startsWith(input, "@")) { + return input; + } + return String.format("${%s(%s)}", MockFunction.KEY, input); + } }