fix(接口测试): 带参数的mock函数不生效
--bug=1044204 --user=陈建星 【接口测试】请求体json类型-参数值为带参数的mock函数-执行接口-函数获取失败 https://www.tapd.cn/55049933/s/1551122
This commit is contained in:
parent
03a5af4f73
commit
2f77188fd3
|
@ -87,23 +87,22 @@ public abstract class MsBodyConverter<T> {
|
|||
* @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 等格式
|
||||
|
|
|
@ -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<JsonBody> {
|
|||
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<String, Object> 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<JsonBody> {
|
|||
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<JsonBody> {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue