接口自动化之数据生成,提取,替换


注:

全局变量:在提取数据到全局变量时,可能数据比较多,不能先在全局环境变量中定义变量名。因此应该在全局变量文件environment.class中添加hashmap,将提取到的数据存入hashmap中。

public static final Map environmentdata=new HashMap<>();

一.随机数

1.生成随机号

一般在用手机号注册的场景时,需要用到生成随机号

public static String randomphone(){
Random random=new Random();
String phonepre="13"; //先设置号码的前3位固定值
for (int i=0;i<9;i++){ //循环11-2次,
int num=random.nextInt(9); //随机选取0-9中的一位
phonepre=phonepre+num; //在上次的基础上增加上次得到的一位随机数,循环9次,在原来的数加了9位数
}
return phonepre;
}

2.判断生成的随机号是否存在数据库中

生成的随机数如果必须是第一次使用,需要连接数据库查询数据库判断得到的随机数是否在数据库中已经存在。如果存在则重新生成,再重新判断新生成的随机数是否在数据库中存在。

public static String unexitsqlnum(){
String phone=""; //先定义一个变量名
while (true){ //循环
phone=randomphone(); //randomphone()为以上二次封装过的生成随机数的方法
Object result=singledata("select count(*) from member where mobile_phone="+phone); //查询生成的随机数是否存在数据库中,singledata()为二次封装过的查询数据库的方法
if ((long)result==0){ //如果查询结果数量为0,即在数据库中不存在这条数据
break; //生成的随机数在数据库中不存在,则使用生成的随机数,结束循环
}else {
continue; //生成的随机数在数据库中存在,则重新循环生成随机数并在数据库中继续查询
}
}
return phone;
}

二.数据提取到全局环境变量中

在多接口自动化中,需要将从响应结果中获取到的数据提取到全局环境变量中,用来在下个接口中使用,或者将生成或定义的数据提取到全局变量中,以便在整个多接口中使用。

如下:接口中的id需要在下一个接口中使用,所以需要提取数据key和value到全局环境变量的hashmap中。先在用例中添加提取返回数据,提取返回数据的key为存放环境变量中的hashmap的key,提取返回数据的value为gpath路径,在代码中通过gpath路径得到response响应数据(response.jsonpath().get(data.id)),得到的response响应数据为存放到环境变量的value。

public void extracttoevironment(String extract){                //extract来自表格存放的接口返回数据,值为接口响应体的gpath路径(data.token_info.token)
Map extractmap=JSONObject.parseObject(extract,Map.class); //将json格式转化为map格式
for (String key:extractmap.keySet()){ //循环map中的key
Object path=extractmap.get(key); //通过key得到key的值(path),值(path)为接口响应体的gpath路径
Object value= response.jsonPath().get(path.toString()); //将路径放入gpath表达式中(response.jsonpath().get(data.token_info.token)),得到value。通过路径得到响应数据
Environment.environmentdata.put(key,value); //将原来的key和响应数据存放到全局的hashmap环境变量中
}
}

三.数据替换

1.正则表达式

模拟jmeter中的正则表达式。提取上一个接口的响应结果数据,传递给下一个接口

接口中的id需要在下一个接口中使用,所以需要提取数据key和value到全局环境变量的hashmap中。先在用例中添加提取返回数据,提取返回数据中的key为存放环境变量的hashmap中的key,提取返回数据中的value为gpath路径,在提取数据到全局变量的代码中通过gpath路径得到response响应数据(response.jsonpath().get(data.id)),得到的response响应数据为存放到环境变量的hashmap中的value。(Environment.environmentdata.put(key,value))。

在下一个接口中需要使用提取到的数据,因此需要将数据传入下一个接口请求中。先设置一个原始值,再进行数据替换。首先用正则表达式匹配器内的原始值在全局环境变量的hashmap中获取到value数据(Environment.environmentdata.get(member_id)),因此上一个接口提取返回数据的key等于下一个接口请求的value。最后将整个匹配对象替换为得到的value数据。

public String changestr(String originalstr){
if (originalstr!=null){
Pattern pattern=Pattern.compile("\\$\\{(.*?)}"); //正则表达式匹配器,\\$\\{(.*?)}表示正则表达式匹配器为${},.*?为匹配的内容:${member_id}
Matcher matcher= pattern.matcher(originalstr); //去匹配哪一个原始字符串,得到匹配对象
String result=originalstr;
while (matcher.find()){
String outstr=matcher.group(0); //0表示获取整个匹配对象:${member_id}
String instr=matcher.group(1); //1表示获取包裹着的对象:member_id
Object changestr= Environment.environmentdata.get(instr); //在全局环境变量的hashmap中获取key(member_id)为包裹着的对象的value
result=result.replace(outstr, String.valueOf(changestr)); //changestr为具体的值
}
return result;
}
return originalstr;
}

2.用例替换

在请求头,请求体,期望返回结果,数据库校验等表格里运用到正则表达器${},用正则表达式替换后需要再设置。

public void casereplace(FutureloanPojo futureloanPojo){
String requestheaderresult=changestr(futureloanPojo.getRequestheader());
futureloanPojo.setRequestheader(requestheaderresult);
String inputparamresult=changestr(futureloanPojo.getInputparams());
futureloanPojo.setInputparams(inputparamresult);
String expectresult=changestr(futureloanPojo.getExpected());
futureloanPojo.setExpected(expectresult);
String sqlresult=changestr(futureloanPojo.getSql());
futureloanPojo.setSql(sqlresult);
}