SQLServer数据库之Jmeter接口测试通过SQL查询进行数据校验
小标 2019-05-24 来源 : 阅读 1433 评论 0

摘要:本文主要向大家介绍了SQLServer数据库之Jmeter接口测试通过SQL查询进行数据校验,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了SQLServer数据库之Jmeter接口测试通过SQL查询进行数据校验,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

SQLServer数据库之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连接配置

接着编写一个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

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

本文由职坐标整理并发布,希望对同学们学习SQL Server有所帮助,更多内容请关注职坐标数据库SQL Server数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程