时间:2021-07-01 10:21:17 帮助过:28人阅读
- <span style="color: rgba(0, 0, 0, 1)">{
- "code":"0",
- "msg":"OK",
- "info":{
- "categoryList":[
- {
- "id":45,
- "categoryName":"ca文件夹",
- "imageUrlList":[
- "https://img/29/15302571783635805807.jpg"
- ],
- "count":2,
- "tip":null
- }
- ],
- "count":"12/17"
- }
- }</span>
第一步:用sql分别查出商品数和收藏夹数,然后拼接成“12/17”的形式;
第二步:提取出响应数据的count值;(这一步其实有很多种实现方法,比如用jsonpath也可以提取,但本次用的是BeanShell取值哈)
第三步:将提取出的count与数据库查询说来的拼接值做对比,判断是否一致。
如果之前没有接触过BeanShell的话,这节一点要仔细看哈,虽然只是简单提及几个知识点。
2、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
3、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写法如下:
- <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">先取得id的数量,即查询出来一共有多少个id,这里可以直接引用A_#,可以看debug sampler</span>
- log.info("ids的数量为:"+vars.get("A_#"<span style="color: rgba(0, 0, 0, 1)">));
- </span><span style="color: rgba(0, 0, 255, 1)">int</span> id = Integer.valueOf("${A_#}"<span style="color: rgba(0, 0, 0, 1)">);
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义变量ids,用来存放拼接后的字符串</span>
- String ids = ""<span style="color: rgba(0, 0, 0, 1)">;
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用id数量去for循环,循环查询出每个id,并拼接成字符串</span>
- <span style="color: rgba(0, 0, 255, 1)">for</span>(i=1; i<=id; i++<span style="color: rgba(0, 0, 0, 1)">){
- String Id </span>= vars.get("A_"+<span style="color: rgba(0, 0, 0, 1)">i);
- log.info(</span>"Id为:" + vars.get("A_" +<span style="color: rgba(0, 0, 0, 1)"> i));
- ids </span>+= Id + ","<span style="color: rgba(0, 0, 0, 1)">;
- }
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">去掉字符串最后一个多余的逗号</span>
- ids = ids.substring(0, ids.length() - 1<span style="color: rgba(0, 0, 0, 1)">);
- log.info(</span>"ids为:" +<span style="color: rgba(0, 0, 0, 1)"> ids);
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将id列表保存为参数</span>
- vars.put("ids",ids);
添加JDBC Request,具体写法如下:
添加背景里说到的接口的http请求,在http请求里添加BeanShell断言,Script写法如下:
- <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入json的包</span>
- <span style="color: rgba(0, 0, 255, 1)">import</span> org.json.*<span style="color: rgba(0, 0, 0, 1)">;
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取响应结果,并转换为json</span>
- String response =<span style="color: rgba(0, 0, 0, 1)"> prev.getResponseDataAsString();
- JSONObject responseJson </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JSONObject(response);
- log.info(</span>"输出转换为JSON对象的响应数据:" +<span style="color: rgba(0, 0, 0, 1)"> responseJson);
- </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">获取categoryList数组的数据:这个与本次断言无关
- JSONArray categoryList = responseJson.getJSONObject("info").getJSONArray("categoryList");
- log.info("categoryList:" + categoryList);
- String message = responseJson.getString("msg");
- log.info("响应message字段:" + message);
- </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
- <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取count的值</span>
- String count = responseJson.getJSONObject("info").getString("count"<span style="color: rgba(0, 0, 0, 1)">);
- log.info(</span>"请求响应结果返回的count的值为" +<span style="color: rgba(0, 0, 0, 1)"> count);
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将数据库查询出来的文件夹总数和商品总数拼接起来,比如12/19</span>
- sqlcount=${B_1}+"/"+<span style="color: rgba(0, 0, 0, 1)">${C_1};
- log.info(</span>"<span style="color: rgba(255, 0, 0, 1)">第一种方法直接引用变量去拼接的值为</span>:"+<span style="color: rgba(0, 0, 0, 1)">sqlcount);
- String sqlcountB </span>= vars.get("B_1"<span style="color: rgba(0, 0, 0, 1)">);
- String sqlcountC </span>= vars.get("C_1"<span style="color: rgba(0, 0, 0, 1)">);
- sqlcount2</span>= sqlcountB +"/"+<span style="color: rgba(0, 0, 0, 1)">sqlcountC;
- log.info(</span>"<span style="color: rgba(255, 0, 0, 1)">第二种方法用vars.get到值再拼接的值为</span>:"+<span style="color: rgba(0, 0, 0, 1)">sqlcount2);
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">断言返回的count与数据库的count是否一致
- </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">if(count.equals("12/17")){</span>
- <span style="color: rgba(0, 0, 255, 1)">if</span>(count.equals("sqlcount"<span style="color: rgba(0, 0, 0, 1)">)){
- Failure</span>=<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
- log.info(</span>"数据一致"+"-----count的值为:"+count+"------sqlcount的值为:"+<span style="color: rgba(0, 0, 0, 1)">sqlcount);
- }
- </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
- Failure</span>=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
- FailureMessage</span>="不相等呀,请检查!!!"+"count的值为:"+count+"------sqlcount的值为:"+<span style="color: rgba(0, 0, 0, 1)">sqlcount;
- log.info(FailureMessage);
- }</span>
Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)
标签:height processor url 区分 imp ops 这一 bug 标准