day6作业记录(正则表达式提取器&JSON提取器&断言&接口调用&json转Map获取关键字&JSON数组排序
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); } }
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}
第二种:
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删除一个学生
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)); } }