day6作业记录(正则表达式提取器&JSON提取器&断言&接口调用&json转Map获取关键字&JSON数组排序

day6作业:

4、JSON数组排序(按字段排序)

1、第一步分拆

Map map = JSONObject.parseObject(myjson);
List userlist= (List)map.get("userlist");
System.out.println(userlist);

 

 

 2、对接口做排序

下图的输出结果,按照id正序

 

 代码:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import org.testng.annotations.Test;

import java.awt.image.ImageProducer;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class testpaixu {
@Test
public void jsonpaixu(){
String myjson="{\"userlist\":[{\"ID\":\"135\",\"Name\":\"Fargo Chan\"},{\"ID\":\"432\",\"Name\":\"Aaron Luke\"},{\"ID\":\"252\",\"Name\":\"Dilip Singh\"}]}";
Map map = JSONObject.parseObject(myjson);
List userlist= (List)map.get("userlist");
Collections.sort(userlist, new Comparator<JSONObject>() {
private static final String KEYNAME = "ID";//final可修饰不可修改,KEYNAME一定要大写
@Override
public int compare(JSONObject o1, JSONObject o2) {
String var1=null;
String var2=null;
try {
var1=o1.getString(KEYNAME);
var2=o2.getString(KEYNAME);
}catch (JSONException e){
throw new RuntimeException("按照关键字,未取到值,请确认");
}
return var1.compareTo(var2);
}
});
System.out.println(userlist);
map.put("userlist",userlist);
String jsonString=JSONObject.toJSONString(map);
System.out.println(jsonString);
}
}

 

错误示例:

如下图,按下面这种方法分拆,执行后得出的json,有两个中括号,不是想要的结果

 

1.抓包获取登录、验证通过接口实现

要求:1、使用正则表达式提取器和JSON提取器实现关联;2、必须有断言

1.新增http请求(登录login):如下图

(注意点:对POST使用multipart / form-data选项如果勾选上了,【http信息头管理器】中就不用再次添加这个了,不然重复会引起报错)

 

2.新增正则表达式提取器

 

3.新增json提取器

 

4.新增BeallShell断言

String message="${token}";
if(message == null){
Failure=true;
FailureMessage="断言失败";
}
else{
FailureMessage="断言成功";
}

 

 

5.新增JSON断言

 

6.新增响应断言,检查响应文本是否有token

 

执行结果:

 7、新增http接口,名字叫登录verfyToken

 

 8.新增HTTP信息头管理器,具体内容如下:

 

 9.执行结果如下:

 

 

2.swagerui的接口通过jmeter 完成所有接口的串联(必做)

2.1上传文件接口

2.1.1新增http请求,举例上传图片

对POST使用multipart / form-data,这个选项要勾上(使用multipart选项)//这个现在选不选,都能成功。

文件名称:文件绝对路径+文件名

参数名称:file

mime类型:image/jpeg

注:mime类型需要根据当前文件类型,填写相应的值。

 

【高级】页签,【实现】改为java

 

2.通过【姓名、分数、学号】查询学生信息

第一种:在【查询所有学生接口】中,添加BellShell后置处理器,如下图

 

 代码:

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import util.Arrays;
import util.List;

String res=prev.getResponseDataAsString();
JSONObject jsonObject=JSONObject.parseObject(res);//转为json对象
JSONArray mydata1=jsonObject.getJSONArray("data");//定义第一层data对象数据
JSONObject object = mydata1.getJSONObject(0);//mydata1中有很多组数据,此时需要取第一段,下标是0
String myname = object.getString("name");//获取name字段的值
String myscore = object.getString("score");//获取score字段的值
String mystudentId = object.getString("studentId");//获取studentId字段的值
String myId = object.getString("Id");//获取Id字段的值
System.out.println(myscore);
System.out.println(mystudentId);
System.out.println(myId);

log.info(myname);
vars.put("myname",myname);
vars.put("myscore",myscore);
vars.put("mystudentId",mystudentId);
vars.put("myId",myId);

 

 

2.2.2.2.添加【通过name查询学生信息】接口

姓名路径:/findStudentByName/${myname}

分数路径:/findStudentByScore/${myscore}

学号路径:/findStudentByStudentId/${mystudentId}

 

第二种:

1、新增学生接口

 

 2、新增http信息头管理器(Content-Type     application/json)

 

 

3、学生接口下增加json提取器,如下图

 

 其中data.id为什么这样写,见下图。地址:http://jsonpath.com/

 

2、把具体的字段值,都改为${st_id},以此类推

 

 第三种,把具体的参数添加到下面,如下图

 

 

 

 

第四种:下面都是直接输入字段值来查询、修改、删除

2.2、通过姓名查询学生信息

直接输入name值:接口地址:http://localhost:8090/findStudentByName/xiaoqiang

 

2.3通过分数查询学生信息

直接输入分数,接口地址:http://localhost:8090/findStudentByScore/90

 

2.4通过学号查询学生信息

接口地址:http://localhost:8090/findStudentByStudentId/002

 

2.5新增学生

接口地址:http://localhost:8090/studentAdd

{
  "className": "3.9",
  "courseName": "shuxue",
  "email": "huhu@qq.com",
  "name": "huhu",
  "score": 100,
  "sex": "man",
  "studentId": "string"
}

 

 

2.6通过ID删除一个学生

接口地址:http://localhost:8090/studentDelete/26

 

2.7通过ID查找一个学生信息(studentFindById)

接口地址:http://localhost:8090/studentFindById?id=001

 

2.8通过ID查找一个学生信息(/studentFindOne/{id})

接口地址:http://localhost:8090/studentFindOne/26

第一种:

第二种:

 

2.9修改学生信息

接口地址:http://localhost:8090/studentUpdate/38?studentId=123&name=huhu1&score=150&sex=boy&className=9.6&courseName=%E8%8B%B1%E8%AF%AD&email=huhu@qq.com

 

 

 

 

2.10查询所有学生

接口地址:http://localhost:8090/students

知识点:如果遇到乱码问题,增加一个beanshell后置处理器(prev.setDataEncoding("UTF-8");)

 

 

3.1json转Map获取关键字

 

代码:

public void testDatezuoye() {
        String json="{\"code\":1,\"msg\":\"success\",\"data\":{\"name\":\"pig\",\"age\":\"18\",\"sex\":\"man\",\"hometown\":{\"province\":\"江西省\",\"city\":\"抚州市\",\"county\":\"崇仁县\"}}}";
        Map<String,String> parseObject= JSON.parseObject(json,Map.class);
        //获取data节点
        String data=String.valueOf(parseObject.get("data"));
        //获取data集合
        Map dataMap  = JSON.parseObject(data,Map.class);
        //获取hometown集合
        Map hometownMap = (Map)dataMap.get("hometown");
        //获取province节点
        Object province = hometownMap.get("province");
        System.out.println(province);
    }

 

3.2关键字对比实现,判断返回的JSON是否相同

 

代码如下:

public class JsonMapzuoye {
    //判断两个json是否相等
    //actual是预期结果,expected是实际结果
    public static Boolean isTrue(Object actual,Object expected){
        Boolean flag;//定义一个flag变量,类型是boolen,返回值是true或false
        if (actual instanceof String){
            flag=((String) actual).equals(((String) expected));
            //八种基本数据类型分别是:1、4种整数类型(byte、short、int、long);2、2种浮点类型(float、double);
            // 3、1种字符类型“char”;4、1种布尔类型“boolean”。
        } else if (actual instanceof Boolean){
            flag=((Boolean) actual).equals(((Boolean) expected));
        } else if (actual instanceof Byte){
            flag=((Byte) actual).equals(((Byte) expected));
        } else if (actual instanceof Short){
            flag=((Short) actual).equals(((Short) expected));
        } else if (actual instanceof Integer){
            flag=((Integer) actual).equals(((Integer) expected));
        } else if (actual instanceof Long){
            flag=((Long) actual).equals(((Long) expected));
        } else if (actual instanceof Float){
            flag=((Float) actual).equals(((Float) expected));
        } else if (actual instanceof Double){
            flag=((Double) actual).equals(((Double) expected));
        } else if (actual instanceof Character){
            flag=((Character) actual).equals(((Character) expected));
        } else{
            JSONObject jsonObject1=JSONObject.parseObject(actual.toString());
            JSONObject jsonObject2=JSONObject.parseObject(expected.toString());
            String res1=jsonObject1.toString();
            String res2=jsonObject2.toString();
            flag=res1.equalsIgnoreCase(res2);
        }
        return flag;
    }
    //关键字对比
    public static Boolean isEquals(Object actual,Object expected){
        boolean flag = true;
        Map<String,String> map1=JSONObject.parseObject(actual.toString(), Map.class);
        Map<String,String> map2=JSONObject.parseObject(expected.toString(),Map.class);
        for (Map.Entry< String,String>map:map1.entrySet()){
            String key=map.getKey();
            Object value1=map1.get(key);
            Object value2=map2.get(key);
            if(!isTrue(value1,value2)){
                flag=false;
                break;
            }
        }
        return flag;
    }
    public static void main(String[] args){
        String str1="{\"code\":1,\"msg\":\"success\",\"data\":{\"name\":\"pig\",\"age\":\"18\",\"sex\":\"man\",\"hometown\":{\"province\":\"江西省\",\"city\":\"抚州市\",\"county\":\"崇仁县\"}}}";
        String str2="{\"code\":11,\"msg\":\"success\",\"data\":{\"name\":\"pig\",\"age\":\"18\",\"sex\":\"man\",\"hometown\":{\"province\":\"江西省\",\"city\":\"抚州市\",\"county\":\"崇仁县\"}}}";
        System.out.println(isEquals(str1,str2));
    }
}

 


 

 
posted @ 2023-02-24 09:06  御宸云汐  阅读(48)  评论(0编辑  收藏  举报