jmeter接口mysql测试_Jmeter接口测试通过SQL查询进行数据校验

本文介绍了如何在JMeter中进行接口测试,并利用数据库查询结果与接口返回数据进行校验。通过加载Oracle JDBC驱动,创建JDBC连接配置,编写Java类进行JSON比较,最后在HTTP响应中使用BeanShell PostProcessor进行断言检查。当数据不一致时,JMeter会返回错误信息,帮助定位问题。
摘要由CSDN通过智能技术生成

在使用Jmeter做查询类接口测试的时候,我们可以通过数据库查询结果与实际接口返回的结果进行数据校验。

接口的返回值:

{

"PageResult":{

"SummaryData":{

"SumMonery":10000,

"SumFee":900,

"SumIncome":16000

},

"PageSize":10,

"CurrentPage":1,

"Data":[

{

"Id":10,

"Fee":7.65,

"Monery":8.65,

"UserName":"测试",

"Time":"2017-12-12 09:00:00",

"PartnerIdentity":"江西省代理",

"PartnerType":1,

"State":1,

"Income":7.65

}

],

"TotalItems":10

}

}

如上就是我们接口正常的返回数据。

我们使用Oracle作为数据库,因此需要加载Oracle安装目录下(C:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib)的ojdbc6.jar文件复制到Jmeter软件的lib\ext目录下。

在测试计划中导入odbc6.jar到classpath里头

然后新增一个JDBC连接配置

接着编写一个JAVA项目:import com.alibaba.fastjson.*;import java.util.*;public class JsonDiff{    /**     * 对JSON进行排序     * @param jsonStr     * @return     */    @SuppressWarnings({ "rawtypes", "unchecked" })    public static List> generateSortedTreeMap(String jsonStr){        //最终接受排序后的数据        List> dataList = new ArrayList>();        //对数据转换成有序的Map        List list = new ArrayList();        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 keys = (Set)map.keySet();            List sortKeys = new ArrayList(keys);            //对键进行排序            Collections.sort(sortKeys);            //使用有序列表来存储            TreeMap tree = new TreeMap();            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> data1List = generateSortedTreeMap(json1);        List> data2List = generateSortedTreeMap(json2);        for(TreeMap 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);    }*/}

最后打成一个jar包,也新增到刚才的CLASSPATH下

在HTTP连接下新建一个JDBC PostProcessor

再然后新建一个BeanShell PostProcessorimport 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);    }

如果校验不通过将自动返回一个错误的值,否则返回正常的值

ps:如果需要对返回的结果做替换可以使用

String get_data=response_data.replaceAll("old","new");

例如:

String data2 = rdata.replaceAll("\"SummaryData\":\"", "\"SummaryData\":[");

String response_data = data2.replaceAll("}\",\"IsSucess\"","}],\"IsSucess\"");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值