Jmeter接口测试通过SQL查询进行数据校验

简介:

在使用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连接配置
Jmeter接口测试通过SQL查询进行数据校验

接着编写一个JAVA项目:

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);
    }
*/

}

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

在HTTP连接下新建一个JDBC PostProcessor
Jmeter接口测试通过SQL查询进行数据校验

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

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

ps:如果需要对返回的结果做替换可以使用
String get_data=response_data.replaceAll("old","new");
例如:
String data2 = rdata.replaceAll("\"SummaryData\":\"", "\"SummaryData\":[");
String response_data = data2.replaceAll("}\",\"IsSucess\"","}],\"IsSucess\"");




本文转自 rong341233 51CTO博客,原文链接:http://blog.51cto.com/fengwan/2069393

相关文章
|
4月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
4月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
6月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
896 0
|
8月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
669 1
|
4月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
5月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
366 18
|
3月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
282 0
|
5月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
1202 10
|
5月前
|
监控 Java 数据挖掘
利用Jmeter工具进行HTTP接口的性能测试操作
基础上述步骤反复迭代调整直至满足预期目标达成满意水平结束本轮压力评估周期进入常态监控阶段持续关注系统运转状态及时发现处理新出现问题保障服务稳定高效运作
816 0
|
7月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1190 23