好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)

 {
    "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响应数据与数据库比对)

标签:height   processor   url   区分   imp   ops   这一   bug   标准   

查看更多关于Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)的详细内容...

  阅读:39次