前言

  最近在学习BeanShell断言,发现有点强大哈,只要会写代码,就没有什么是断言不了的,哈哈哈,不过我现在只会写点蹩脚的代码,下面将介绍下如何将返回的JSON数据与数据库数据做对比。

注:本次涉及到的知识点有 1)BeanShell PostProcessor拼接字符串;2)BeanShell 断言的基本使用;

背景

  jmeter断言接口返回的count与数据库查询出来的是否一致,接口返回的JSON响应数据如下:

  (count说明:比如12/17,即12是代表商品数 [先用X代替],17是代表收藏夹的数量 [用Y代替])XY只是为了方便区分,后面方便偷懒,哈哈。

{
"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取值哈)

  第三步:将提取出的count与数据库查询说来的拼接值做对比,判断是否一致。

一、BeanShell知识点摘要(*必看

  如果之前没有接触过BeanShell的话,这节一点要仔细看哈,虽然只是简单提及几个知识点。

1、什么是Bean Shell

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

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结构字段值的文章。

二、实例操作第一步:sql查询

  jmeter连接数据库在之前就已经讲过了,这里就不再赘述了哈,直接进入主题了。这次的查询比较特别一点,为什么呢?因为查询用到的表在不同的数据库中,不是同一个库了,为了方便理解,还是大概说一下吧。

category表在A库,collect表在B库,在查collect表里的商品数时,是需要用到category表查询出来的id的,因为查询出来的id可能不止一个,所以就会涉及到要将id拼接起来,再放到collect表里查询。说的可能比较抽象,哈哈哈,下面直接上图了。

1、查询category表的文件夹总数,即count中的X

  添加JDBC Request,具体写法如下:

2、查询category表的文件夹的id(用在另一个库的数据表的)

  添加JDBC Request,具体写法如下:

3、将category表查询出的文件夹的id拼接起来

  添加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);

4、查询collect表的商品总数,即count中的Y

  添加JDBC Request,具体写法如下:

三、实例操作第二、三步:提取JSON字段和断言

  添加背景里说到的接口的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);
}

四、线程组框架展示:

Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)的更多相关文章

  1. 记录jmeter使用beanshell断言获取复杂的json字符串参数值

    实战示例 测试场景 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式 ...

  2. jmeter BeanShell断言(一)

    原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...

  3. jmeter BeanShell断言(四)

    Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...

  4. jmeter BeanShell断言(三)数据处理

    在做接口测试时,对响应数据的校验是非常重要的部分:在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言.BeanShell断言等等,BeanShell断言可以自定义断言,自由灵 ...

  5. (jmeter内置可调用的变量)jmeter beanShell断言

    用户可以在jmeter- “beanShell断言”中自定义断言.自由灵活的用脚本实现自己的断言  beanShell断言接口介绍  在beanShell中直接可以调用的变量,无需加前缀.  1.lo ...

  6. jmeter beanshell断言接口自动化实例

    一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...

  7. Jmeter BeanShell断言

    这篇文章用来记录编写beanshell断言遇到得问题. 问题1:JSONObject not found in namespace 流程:在beanshell下写代码如下: 1 String resp ...

  8. Jmeter4.0 _Beanshell解析并获取json响应数据数组长度

    我们在做jmeter接口测试的时候,有时候碰到开发没返回数据total,只返回了一条条记录,可是呢,我们又需要知道到底返回了多少条数据时,咋办呢?咋办呢?咋办呢? 不要急,接下来,让我们见证奇迹是如何 ...

  9. jmeter使用正则表达式从上一个http响应数据里提取关键字传递给下一个http请求(二)

    通过jmeter从表格批量读取数据(一)(http://www.cnblogs.com/lelexiong/p/8728993.html)介绍了从表格批量读取数据,读取数据之后,如果要提取响应数据里面 ...

随机推荐

  1. .NET CORE 下如何使用国产数据库进行 开发

    主流国产数据库 随着贸易战的升级 ,自主研发和知识产权也是一个大的趋势,达梦和人大金仓是国产数据库中比较主流的 1.达梦数据库 更接近Oracle,更偏向自主研发,对开发人员友好度不如金仓 达梦公司在 ...

  2. mysql报错10061和10038

    用navicat连接报错10038,用sqlyog报错10061,又去查看服务,发现服务丢失 经过一系列的查阅资料,用下面的方式解决了问题 1.用管理员的方式打开命令行窗口 2.进入mysql的bin ...

  3. django支持多语言

    Django支持多语言切换 下面介绍下如何使网站或APP国际化,让其支持多种语言 . 官网 效果 1.创建locale文件夹 先在项目根目录下创建一个名为locale的文件夹,这个文件夹是用来存放dj ...

  4. python机器学习卷积神经网络(CNN)

    卷积神经网络(CNN) 关注公众号"轻松学编程"了解更多. 一.简介 ​ 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人 ...

  5. python实现有趣的数学逻辑程序

    1.无重复数字的三位数 题目:有1.2.3.4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? for i in range(1,5): for j in range(1,5): fo ...

  6. js音乐播放器【简洁】

    辞职的第二天没有去找工作还,准备回家. 但到了火车站才发现沃特玛的买的票不是在这个火车站坐. 这就耽误了行程...... 说出来真舒服!!!淦 代码 这里已经上传到码云了,大家可以直接引用. 目前只有 ...

  7. Inception系列之Inception_v1

    目前,神经网络模型为了得到更好的效果,越来越深和越来越宽的模型被提出.然而这样会带来以下几个问题: 1)参数量,计算量越来越大,在有限内存和算力的设备上,其应用也就越难以落地. 2)对于一些数据集较少 ...

  8. 【阿里云-大数据】阿里云DataWorks学习视频汇总

    阿里云DataWorks学习视频汇总 注意:本文档中引用的视频均来自阿里云官方的帮助文档,本文档仅仅是汇总整理,方便学习. 阿里云DataWorks帮助文档链接:https://help.aliyun ...

  9. 内网渗透 day1-基础

    粘滞键和放大镜 1. 到/windows/system32下用takeown改变该文件夹下的文件拥有权(因为粘滞键和放大镜都在system32文件夹下) cd /Windows/system32    ...

  10. 处理ceph incompelete的经验

    前言 最近已经见到几个环境出现过incompelete了,这个在很久以前Jewel正在合入mark-complete工具的时候就有做过类似的处理,但是随着处理的环境越来越多,这个地方还是有些需要注意的 ...