////
//在测试计划中导入odbc6.jar到classpath里头
//打jar包,put in path where jmeter bin is Jmeter软件的lib\ext目录下
import com.alibaba.fastjson.*;
import java.util.*;
public class JsonDiff{
/**
* 对JSON进行排序
* @param jsonStr
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List<TreeMap<String,Object>> generateSortedTreeMap(String jsonStr){
//最终接受排序后的数据
List<TreeMap<String,Object>> dataList = new ArrayList<TreeMap<String,Object>>();
//对数据转换成有序的Map
List<Map> list = new ArrayList<Map>();
try {
list = JSON.parseArray(jsonStr, Map.class);
}catch(Exception e) {
System.out.println("+++++++++转换JSON数组失败,尝试转换成JSON对象:"+e.getMessage());
try {
Map obj = JSON.parseObject(jsonStr, Map.class);
list.add(obj);
}catch(Exception e1) {
System.out.println("+++++++++JSON对象转换失败:"+e.getMessage());
}
}
for(Map map:list) {
//获取JSON的键
Set<String> keys = (Set<String>)map.keySet();
List<String> sortKeys = new ArrayList<String>(keys);
//对键进行排序
Collections.sort(sortKeys);
//使用有序列表来存储
TreeMap<String,Object> tree = new TreeMap<String,Object>();
for(String key:sortKeys) {
tree.put(key, map.get(key));
}
dataList.add(tree);
}
return dataList;
}
/**
* 对比两个JSON
* @param json1
* @param json2
* @return
*/
public static boolean compareJSON(String json1,String json2) {
List<TreeMap<String,Object>> data1List = generateSortedTreeMap(json1);
List<TreeMap<String,Object>> data2List = generateSortedTreeMap(json2);
for(TreeMap<String,Object> map:data1List) {
if(!data2List.contains(map)) {
return false;
}
}
return true;
}
/*
public static void main(String[] args) {
//JSON字符串
//String json1 = "[{\"size\": 6,\"data\": \"hello linux\",\"data1\":{\"aa\":1,\"id\": {\"userid\": 3333,\"name\": \"hello world\"}}}},{\"data\": \"world\",\"size\": 7}]";
//String json2 = "[{\"data\": \"world\",\"size\": 7}, {\"data1\":{\"aa\":1,\"id\": {\"userid\": 3333,\"name\": \"hello world\"}},\"data\": \"hello linux\",\"size\": 6}]";
//String json1 = "[{\"name\": \"work\",\"passwd\": \"123456\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}]";
//String json2 = "[{\"name\": \"work\",\"passwd\": \"123456\",\"classname\": [ {\"score\":78,\"name\": \"match\"},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}]";
//String json1="{\"size\": 6,\"data\": \"hello linux\"}";
//String json2="{\"data\": \"hello linux\",\"size\": 6}";
//String json1 = "{\"name\": \"testuser\",\"passwd\": \"123456\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}";
//String json2 = "{\"passwd\": \"123456\",\"name\": \"testuser\",\"classname\": [ {\"name\": \"match\",\"score\":78},{\"name\": [ {\"name\": \"match\",\"score\":78} ]} ],\"teacher\":[ {\"name\": \"bob\",\"classname\": \"99\" }]}";
boolean result = compareJSON(json1, json2);
System.out.println(result);
}
*/
}
//再然后新建一个BeanShell PostProcessor
import com.alibaba.fastjson.*;
import java.util.*;
import JsonDiff.*;
String response_data =prev.getResponseDataAsString(); //获取web响应内容
JSONObject obj=JSON.parseObject(response_data);
String app_str = obj.get("Data").toString().toLowerCase();
log.info("response:"+app_str);
List results=vars.getObject("sqlresult"); //获取sql查询
String sql_str=JSONObject.toJSONString(results).toLowerCase(); //list转换为json数据
log.info("SQL查询:"+sql_str);
boolean result=JsonDiff.compareJSON(apps_str,sql_str)
if(result){
log.info("数据一致");
}else{ //用预期的JSON串和查询到的结果JSON串进行对比
//如果不一样的情况下,说明数据库的断言失败,可能是程序的问题
String result =prev.getResponseDataAsString(); //拿到实际结果的值,用于存放到返回数据中
prev.setResponseCode("506"); //我们自定义了一个CODE码,告诉结果显示的CODE是这个
prev.setSuccessful(false); //设置结果为错误
prev.setResponseMessage("接口断言通过,数据库校验未通过"); //设置一个提示信息,大概是说明原因导致的
//写入结果返回的结果,还有数据库校验未通过,我们的预期数据库的值是,实际的值是,加上这个是为了方便定位问题
prev.setResponseData(result+",\n数据库校验未通过,\n预期值:"+str+",\n实际值:"+apps_str);
}
https://blog.51cto.com/fengwan/2069393
网友评论