自动化测试kettle

接口依赖:从接口返回值提取想要的数据,作为下次接口使用(自己研究

2018-11-27  本文已影响14人  仰望星空_4645
图1

1、假如一个接口返回的格式如上,需要提取ad的值,

1)String e="${a}=live:0/course:0/ad";这是我定义的提取格式书写,"="左边是要存储的变量名称,右边是真正要提取的格式,层级以"/"标识,如果遇到数组,则写成key:索引,0代表第一个,依次类推,需要从根目录的key开始,不能跨越

  private void extractionValue(String report,String string){//report:接口的返回值,string:自己要提取的整条字符串,就是上面的e

         String before=StringUtils.substringBefore(string,"=");//需要存储的可变参数

         String after=StringUtils.substringAfter(string,"=");//要获取的字符串

         Object json01 = JSONObject.parse(report);

         if(after.contains("/")){//

                多层级结构

                 String finalReport=report;

                 String[] su=after.split("/");

                 if(su!=null&&su.length>0){//

                        有数据

                         for(int i=0;ilength;i++){

                         String item=su[i];

                                 if(item.contains(":")){//

                                        代表是数组

                                         finalReport= ((Map)JSONObject.parse(finalReport)).get(item.substring(0,item.indexOf(":"))).toString();

                                         JSONArray bookinfos=JSON.parseArray(finalReport);

                                         json01 = JSONObject.parse(bookinfos.get(Integer.parseInt(item.substring(item.indexOf(":")+1))).toString());

                                         finalReport=json01.toString();

                                 }else{

                                         finalReport= ((Map)json01).get(item).toString();

                                 }

                         }

                         GlobalVariable.put(before,finalReport);

                 }

         }else{//

                根目录的数据

                 GlobalVariable.put(before,((Map)json01).get(after).toString());

         }

           System.out.println("测试结果"+before+" "+GlobalVariable.get(before));

}

这里面需要用到fastjson,这是我能想到的一种方法,可以用在自动化接口中

2)正则匹配,这个是比较简单的,当有多个重复的字段

 如果提取的是数字:String regex="(?<=\"id\":)([0-9]*)";

 如果提取的是字符串:String regex="(?<=\"name\":)\"(.+?)\"";

 Pattern p=Pattern.compile(regex); Matcher m=p.matcher(f); while(m.find()){ System.out.println(m.group(1)); }

扩展:当一个结果中出现多个重复的参数,这在列表接口中会出现,这时就需要对上面的正则表达方法封装

//report接口返回值 regex:正则匹配表达式 index:这个值出现的索引,就是需要第几次出现的这个值

private String extractionValue(String report,String regex,int index){

         Pattern p=Pattern.compile(regex);

         Matcher m=p.matcher(report);

         int num=0;

         while(m.find()){

                 if(num==index){

                         return m.group(1);

                 }

                 num++;

         }

         return null;

}

注:如果大家有别的思路,可互相交流

上一篇下一篇

猜你喜欢

热点阅读