最近在学习BeanShell断言,发现有点强大哈,只要会写代码,就没有什么是断言不了的,哈哈哈,不过我如今只会写点蹩脚的代码,下面将介绍下如何将返回的JSON数据与数据库数据作对比。html
注:本次涉及到的知识点有 1)BeanShell PostProcessor拼接字符串;2)BeanShell 断言的基本使用;java
jmeter断言接口返回的count与数据库查询出来的是否一致,接口返回的JSON响应数据以下:sql
(count说明:好比12/17,即12是表明商品数 [先用X代替],17是表明收藏夹的数量 [用Y代替])XY只是为了方便区分,后面方便偷懒,哈哈。shell
{
"code":"0",
"msg":"OK",
"info":{
"categoryList":[
{
"id":45,
"categoryName":"ca文件夹",
"imageUrlList":[
"https://img/29/15302571783635805807.jpg"
],
"count":2,
"tip":null
}
],
"count":"12/17"
}
}
第一步:用sql分别查出商品数和收藏夹数,而后拼接成“12/17”的形式;数据库
第二步:提取出响应数据的count值;(这一步其实有不少种实现方法,好比用jsonpath也能够提取,但本次用的是BeanShell取值哈)apache
第三步:将提取出的count与数据库查询说来的拼接值作对比,判断是否一致。json
若是以前没有接触过BeanShell的话,这节一点要仔细看哈,虽然只是简单说起几个知识点。api
二、Bean Shell经常使用内置变量数组
JMeter在它的BeanShell中内置了变量,用户能够经过这些变量与JMeter进行交互,其中主要的变量及其使用方法以下:框架
log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);
ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。
vars - (JMeterVariables):操做jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,经常使用方法:
a) vars.get(String key):从jmeter中得到变量值
b) vars.put(String key,String value):数据存到jmeter变量中
更多方法可参考:org.apache.jmeter.threads.JMeterVariables
props - (JMeterProperties - class java.util.Properties):操做jmeter属性,该变量引用了JMeter的配置信息,能够获取Jmeter的属性,它的使用方法与vars相似,可是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
a) props.get("START.HMS"); 注:START.HMS为属性名,在文件jmeter.properties中定义
b) props.put("PROP1","1234");
prev - (SampleResult):获取前面的sample返回的信息,经常使用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
更多方法可参考:org.apache.jmeter.samplers.SampleResult
sampler - (Sampler):gives access to the current sampler
三、Bean Shell判断返回的JSON
首先要下载JSON依赖包(org.json.jar),放到\apache-jmeter-5.0\lib\ext中,而后重启jmeter便可在beanshell中import json包了。具体要怎么提取到JSON中的某个值,在博文最后会贴代码,请拉到最后查看,后续也会根据不一样的JSON结构专门写一篇如何提取JSON结构字段值的文章。
jmeter链接数据库在以前就已经讲过了,这里就再也不赘述了哈,直接进入主题了。此次的查询比较特别一点,为何呢?由于查询用到的表在不一样的数据库中,不是同一个库了,为了方便理解,仍是大概说一下吧。
category表在A库,collect表在B库,在查collect表里的商品数时,是须要用到category表查询出来的id的,由于查询出来的id可能不止一个,因此就会涉及到要将id拼接起来,再放到collect表里查询。说的可能比较抽象,哈哈哈,下面直接上图了。
添加JDBC Request,具体写法以下:
添加JDBC Request,具体写法以下:
添加BeanShell PostProcessor,Script写法以下:
//先取得id的数量,即查询出来一共有多少个id,这里能够直接引用A_#,能够看debug sampler log.info("ids的数量为:"+vars.get("A_#")); int id = Integer.valueOf("${A_#}"); //定义变量ids,用来存放拼接后的字符串 String ids = ""; //用id数量去for循环,循环查询出每一个id,并拼接成字符串 for(i=1; i<=id; i++){ String Id = vars.get("A_"+i); log.info("Id为:" + vars.get("A_" + i)); ids += Id + ","; } //去掉字符串最后一个多余的逗号 ids = ids.substring(0, ids.length() - 1); log.info("ids为:" + ids); //将id列表保存为参数 vars.put("ids",ids);
添加JDBC Request,具体写法以下:
添加背景里说到的接口的http请求,在http请求里添加BeanShell断言,Script写法以下:
//导入json的包 import org.json.*; //获取响应结果,并转换为json String response = prev.getResponseDataAsString(); JSONObject responseJson = new JSONObject(response); log.info("输出转换为JSON对象的响应数据:" + responseJson); /*获取categoryList数组的数据:这个与本次断言无关 JSONArray categoryList = responseJson.getJSONObject("info").getJSONArray("categoryList"); log.info("categoryList:" + categoryList); String message = responseJson.getString("msg"); log.info("响应message字段:" + message); */ //获取count的值 String count = responseJson.getJSONObject("info").getString("count"); log.info("请求响应结果返回的count的值为" + count); //将数据库查询出来的文件夹总数和商品总数拼接起来,好比12/19 sqlcount=${B_1}+"/"+${C_1}; log.info("第一种方法直接引用变量去拼接的值为:"+sqlcount); String sqlcountB = vars.get("B_1"); String sqlcountC = vars.get("C_1"); sqlcount2= sqlcountB +"/"+sqlcountC; log.info("第二种方法用vars.get到值再拼接的值为:"+sqlcount2); //断言返回的count与数据库的count是否一致 //if(count.equals("12/17")){ if(count.equals("sqlcount")){ Failure=false; log.info("数据一致"+"-----count的值为:"+count+"------sqlcount的值为:"+sqlcount); } else{ Failure=true; FailureMessage="不相等呀,请检查!!!"+"count的值为:"+count+"------sqlcount的值为:"+sqlcount; log.info(FailureMessage); }