借鉴jmeter函数表达式,故Req_data用${__函数名(参数1,参数2)}表示
表达式| Functions | 函数表达式 | 备注 |
|---|---|---|
| Time | ${__Time(,)} | 时间戳 |
| ${__Time(YMDHMS,)} | 年月日时分秒 格式:2050-10-01 13:00:00 | |
| ${__Time(YMD,)} | 年月日 格式:2050-10-01 | |
| ${__Time(HMS,)} | 时分秒 格式:13:00:00 | |
| ${__Time(yyyyMMddHHmmss,)} | 年月日时分秒 格式:20501001130000 | |
| ${__Time(yyyyMMddHHmmssSS,)} | 年月日时分秒毫秒 格式:20501001130000123 | |
| ${__Time(yyyy,)} | 年 | |
| ${__Time(MM,)} | 月 | |
| ${__Time(dd,)} | 日 | |
| ${__Time(HH,)} | 时 | |
| ${__Time(mm,)} | 分 | |
| ${__Time(ss,)} | 秒 | |
| ${__Time(SS,)} | 毫秒 | |
| Random | ${__Random(1,min,max)} | 1代表随机整数 情况1:min=0,max>0 随机范围是[min,max) 情况2:min>0,max>0 随机范围是[min,max) |
| ${__Random(2,)} | 2代表随机boolean值 | |
| ${__Random(3,min,max)} | 3代表随机Float值 情况1:min=0,max>0 随机范围是[0,max) 情况2:min>0,max>0 随机范围是[min,max+min) | |
| ${__Random(4,min,max)} | 4代表随机Double值 情况1:min=0,max>0 随机范围是[0,max) 情况2:min>0,max>0 随机范围是[min,max+min) | |
| ${__Random(5,length)} | 5代表随机String值 注:length>=1 | |
| UUID | ${__UUID(,)} | 生成1个唯一的UUID字符串 |
| Md5 | ${__Md5(key,)} | 得到key的md5值 |
TestRun.java流水线
—> PatternUtil.java类 handlerReqDataOfFunc(String reqData)方法—>
1.正则表达式提取funcName,funcParam
2.利用funcName映射autotest工程对应的funcName类,再据此类对funcParam处理并返回value
3.据value进行替换
step3:开发funcName对应的类(step2-2引入) step4:开发funcName与类的映射关系 step5:开发step2-2和step2-3 方案流程图 代码 TestRun.java//处理函数表达式的reqData,增加在发送请求前 reqData = PatternUtil.handlerReqDataOfFunc(reqData);PatternUtil.java
//初始化正则表达式
private static String funcRegex = "\$\{\_\_(\w+)\(([\w,]+)\)\}";
//函数表达式处理
public static String handlerReqDataOfFunc(String reqData) throws Exception {
//建立规范
Pattern p = Pattern.compile(funcRegex);
Matcher m = p.matcher(reqData);
//匹配结果
while(m.find()) {
String group = m.group();
String funcName = m.group(1);
String[] funcParam = m.group(2).split(",");
//得到函数表达式对应的值并进行替换
if (MapperClassUtil.isFunc(funcName)) {
String value = MapperClassUtil.getValue(funcName, funcParam);
reqData = StringUtil.replaceStr(reqData, group, value);
}
}
return reqData;
}
Function.java
public interface Function {
String getFunc();
String execParam(String[] args);
}
Md5Function.java
public class Md5Function implements Function{
public String getFunc() {
return "Md5";
}
public String execParam(String[] args) {
if(args.length == 1) {
return DigestUtils.md5Hex(args[0]);
}
return null;
}
}
RandomFunction.java
public class RandomFunction implements Function{
public String getFunc() {
return "Random";
}
public String execParam(String[] args) {
if("1".equals(args[0])) {
int min = Integer.valueOf(args[1]);
int max = Integer.valueOf(args[2]);
return String.valueOf(RandomUtil.getRandomInt(min, max));
}else if ("2".equals(args[0])) {
return String.valueOf(RandomUtil.getRandomBoolean());
}else if ("3".equals(args[0])) {
Float min = Float.valueOf(args[1]);
Float max = Float.valueOf(args[2]);
return String.valueOf(RandomUtil.getRandomFloat(min, max));
}else if ("4".equals(args[0])) {
Double min = Double.valueOf(args[1]);
Double max = Double.valueOf(args[2]);
return String.valueOf(RandomUtil.getRandomDouble(min, max));
}else if ("5".equals(args[0])) {
return RandomUtil.getRandomString(Integer.valueOf(args[1]));
}
return null;
}
}
TimeFunction.java
public class TimeFunction implements Function{
public String getFunc() {
return "Time";
}
public String execParam(String[] args) {
if(args.length == 0) {
return String.valueOf(DateTimeUtil.getTimeImpl());
}else if("YMDHMS".equals(args[0])) {
return DateTimeUtil.getDateTime();
}else if("YMD".equals(args[0])) {
return DateTimeUtil.getDate();
}else if("HMS".equals(args[0])) {
return DateTimeUtil.getTime();
}else {
return DateTimeUtil.getPatternDateTime(args[0]);
}
}
}
UUIDFunction.java
public class UUIDFunction implements Function{
public String getFunc() {
return "UUID";
}
public String execParam(String[] args) {
if(args.length == 0) {
return UUID.randomUUID().toString().replace("-", "");
}
return null;
}
}
MapperClassUtil.java
public class MapperClassUtil {
private static Map> funcMap= new HashMap<>();
private MapperClassUtil() {};
static {
//关键词和类建立映射关系,存储到Map中
try {
//得到父接口Function
Class> function = Class.forName("com.youceedu.interf.functions.Function");
//得到父接口Function路径
String pk = function.getPackage().getName();
String classPath = function.getClassLoader().getResource(pk.replace(".", "/")).getPath();
//打开路径,得到类
for (File file : new File(classPath).listFiles()) {
String className = file.getName().substring(0, file.getName().length()-6);
Class> c = Class.forName(pk + "." + className);
//阻止Function.class进funcMap
if(!function.equals(c) && function.isAssignableFrom(c)) {
Function funcObj = (Function) c.newInstance();
String funcName = funcObj.getFunc();
funcMap.put(funcName, funcObj.getClass());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//得到函数表达式计算后的值
public static String getValue(String funcName, String[] args) throws Exception {
return funcMap.get(funcName).newInstance().execParam(args);
}
//判断funcMap是否包含funcName
public static Boolean isFunc(String funcName) {
return funcMap.containsKey(funcName);
}
}



