美文网首页自动化测试kettle
接口依赖:从接口返回值提取想要的数据,作为下次接口使用(自己研究

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

作者: 仰望星空_4645 | 来源:发表于2018-11-27 12:34 被阅读14次
    图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;

    }

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/feorjftx.html