前言

  为了更加熟悉BeanShell,所以用几个实例来记录说明下,不同的Json格式是怎么提取相应字段和判断断言的。(会持续更新...)

一、第一种Json格式

1、Json响应数据内容如下:

{
"msg":"success",
"code":"0",
"info":{
"list":[
{
"id":13628,
"materialColor":"浅粉",
"addOrderTime":"2020-11-26 20:11:09",
"unit":"米"
},
{
"id":13629,
"materialColor":"浅粉",
"addOrderTime":"2020-11-26 20:11:09",
"unit":"米"
}
],
"pageCount":50,
"recordCount":5425
}
}

2、按要求进行提取和断言

Case1:要求分别提取出msg,code,list,recordCount的值,并且断言recordCount与另一个接口返回的num是否一致,具体写法如下:

//Case1:检查返回的recordCount是否等于前一个接口提取的的num

//导入json的包
import org.json.*; //获取响应结果,并转换为json
String response=prev.getResponseDataAsString();
JSONObject responseJson=new JSONObject(response);
log.info("转换后的响应结果json:"+ responseJson); //获取msg,code,是字符串型,所以用getString
String message = responseJson.getString("msg");
String code = responseJson.getString("code");
log.info("msg的值为:"+message+"---code的值为:"+code); //获取list,因为是数组,所以要用JSONArray
JSONArray list = responseJson.getJSONObject("info").getJSONArray("list");
log.info("list数组的值为:"+list); //获取recordCount:因为recordCount是数值型,所以用getInt
int recordCount = responseJson.getJSONObject("info").getInt("recordCount");
log.info("recordCount的值为:"+ recordCount); //判断返回的recordCount是否等于tab的num,num是前面接口提取出的变量,在这里可以直接用${num}引用,或者用vars.get("num")也行
if(recordCount == ${num}){
Failure=false;
log.info("比对结果为:"+recordCount+"="+ ${num});
}
else{
Failure=true;
FailureMessage="recordCount不等于tab的num,请检查";
log.info(FailureMessage);
}

log.info(),是打印日志到控制台里,如下图:(在Options/Log Viewer,可以调出日志控制台)

 Case2:要求提取list数组里的addOrderTime,并且断言是否在另一个接口入参的时间范围内(addOrderTimeStart - addOrderTimeEnd),具体写法如下:

//Case2:检查返回数据的下单时间是否在检索条件内

//导入json的包
import org.json.*; //导入 时间在转换成Date类型时要用到的方法
import java.util.Date;
import java.text.SimpleDateFormat; //为了变量能在全局使用,所以在try{}和for{}外面先声明变量
String addOrderTime;
String addOrderTime1; try {
//获取响应结果,并转换为json
String response=prev.getResponseDataAsString();
JSONObject responseJson=new JSONObject(response);
log.info("转换后的响应结果json:"+ responseJson); //获取list里第[1]个数组对象的id值:这个与本次断言无关
JSONArray list=responseJson.getJSONObject("info").getJSONArray("list");
log.info("list为:"+ list);
JSONObject jsonTemp = list.getJSONObject(1);
String id = jsonTemp.get("id").toString();
log.info("id:"+id); //获取list数组的长度
int len = list.length();
String strlen = Integer.toString(len);
log.info("list数组的长度为:"+strlen); //拿到list数组长度后,用for循环输出addOrderTime的值
int i ;
for(i=0 ;i < len;++i)
{
//获取 list[ i ] 数组对象;
JSONObject jsonTemp = list.getJSONObject(i);
addOrderTime = jsonTemp.get("addOrderTime").toString();
log.info("第一种写法,通过list数组长度一直循环拿出addOrderTime的值为:"+addOrderTime);
} //获取list里第[1]个数组对象的addOrderTime值
JSONArray list=responseJson.getJSONObject("info").getJSONArray("list");
log.info("list为:"+ list);
JSONObject jsonTemp = list.getJSONObject(1);
addOrderTime1 = jsonTemp.get("addOrderTime").toString();
log.info("第二种写法,直接写死数组,获取到的addOrderTime1的值为:"+addOrderTime1); } catch (Throwable ex) {
log.error("Failed in Beanshell", ex);
throw ex;
} //获取开始时间和结束时间:这2个是在前面接口提取出来的参数变量,所以直接用${}引用即可
String beginTime = "${addOrderTimeStart}";
String endTime = "${addOrderTimeEnd}";
log.info("筛选条件的开始日期为:"+beginTime+"/"+"筛选条件的结束日期为:" +endTime); //将日期转换成Date类型,并转换成时间戳去比较大小
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = format.parse(beginTime);
Date date2 = format.parse(endTime);
Date date3 = format.parse(addOrderTime1);
log.info("转换成Date类型后输出的值分别为:"+date1+"/"+date2+"/"+date3); long beginMillisecond = date1.getTime();
long endMillisecond = date2.getTime();
long date3Millisecond = date3.getTime();
log.info("yyyy-MM-dd转换时间戳后的值:"+beginMillisecond+"/"+endMillisecond+"/"+date3Millisecond); //筛选条件的日期是年月日,而返回数据的日期是年月日时分秒,所以这里单独将addOrderTime1的值用yyyy-MM-dd HH:mm:ss转换时间戳
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date4 = format.parse(addOrderTime1);
long date4Millisecond = date4.getTime();
log.info("yyyy-MM-dd HH:mm:ss转换时间戳后的值:"+beginMillisecond+"/"+endMillisecond+"/"+date4Millisecond); //判断下单时间是否在检索条件范围内
if( endMillisecond > date4Millisecond && beginMillisecond < date4Millisecond){
Failure=false;
log.info("校验通过啦,beginMillisecond的值为"+beginMillisecond+"/date3Millisecond的值为:"+date3Millisecond+"/endMillisecond的值为:"+endMillisecond);
}
else{
Failure=true;
FailureMessage="不在时间范围内,请检查,beginMillisecond的值为"+beginMillisecond+"/date3Millisecond的值为:"+date3Millisecond+"/endMillisecond的值为:"+endMillisecond;
log.info(FailureMessage);
}

log.info(),打印日志到控制台里,如下图:

二、第二种Json格式

1、Json响应数据内容如下:

{
"msg":"success",
"code":"0",
"info":{
"id":217369,
"materialBaseInfo":{
"id":235350,
"sku":"M007925",
},
"supplierMaterialInfo":[
{
"id":240717,
"supplierId":5658,
"supplier":"XX",
"supplierCode":"P445"
},
{
"id":240718,
"supplierId":1,
"supplier":"XX1",
"supplierCode":"P04"
}
],

2、按要求进行提取和断言

Case直接在脚本里体现了,Script如下:

import org.json.*;

//获取响应结果,并转换为json
String response=prev.getResponseDataAsString();
JSONObject responseJson=new JSONObject(response);
log.info("转换后的响应结果json:"+ responseJson); //Case1:提取并断言返回的Info{id}
int infoid = responseJson.getJSONObject("info").getInt("id");
log.info("info下id的值为"+infoid); if( infoid == ${id}){
Failure=false;
log.info("校验通过啦,infoid的值为"+infoid+"/id的值为:"+ ${id});
}
else{
Failure=true;
FailureMessage="校验不通过呀,infoid的值为"+infoid+"/id的值为:"+ ${id};
log.info(FailureMessage);
} //Case2:提取并断言返回的Info{materialBaseInfo{sku}}
String materialBaseInfosku = responseJson.getJSONObject("info").getJSONObject("materialBaseInfo").getString("sku");
log.info("materialBaseInfosku的值为"+materialBaseInfosku);
String materialSku = vars.get("materialSku");
log.info(materialSku); if( materialBaseInfosku.equals(materialSku)){
Failure=false;
log.info("校验通过啦,materialBaseInfosku的值为"+materialBaseInfosku+"/materialSku的值为:"+ materialSku);
}
else{
Failure=true;
FailureMessage="校验不通过呀,materialBaseInfosku的值为"+materialBaseInfosku+"/materialSku的值为:"+ materialSku;
log.info(FailureMessage);
} //Case3:提取返回的Info{supplierMaterialInfo[{supplierId,supplier}]}
JSONArray supplierMaterialInfo = responseJson.getJSONObject("info").getJSONArray("supplierMaterialInfo");
log.info("supplierMaterialInfo数组的值为:"+supplierMaterialInfo);
String supplier1 = supplierMaterialInfo.getJSONObject(0).getString("supplier");
log.info("第一种方法拿到supplier的值为"+supplier1); int len =supplierMaterialInfo.length();
log.info("数组的长度为"+len);
int i;
for(i=0;i<len;++i){
JSONObject jsons= supplierMaterialInfo.getJSONObject(i);
supplier = jsons.getString("supplier");
log.info("第二种方法循环拿supplier的值为"+supplier);
}
for(i=0;i<len;++i){
JSONObject jsons= supplierMaterialInfo.getJSONObject(i);
int supplierId = jsons.getInt("supplierId");
log.info("第二种方法循环拿supplierId的值为"+supplierId);
}

log.info(),打印日志到控制台里,如下图:

Jmeter-BeanShell断言的运用二(不同Json格式的字段提取和断言判断)的更多相关文章

  1. 取response里 Json格式的字段值

    1.

  2. Jmeter beanshell编程实例

    1.引言 BeanShell是一种小型的,免费的,可嵌入的符合Java语法规范的源代码解释器,具有对象脚本语言特性. 在Jmeter实践中,由于BeanShell组件较高的自由度,通常被用来处理较为复 ...

  3. json格式数据整理

    一,json的两种数据结构 1.1,对象 对象结构以"{"大括号开始,以"}"大括号结束.中间部分由0或多个以","分隔的"key ...

  4. Nginx 高级配置-自定义json格式日志

    Nginx 高级配置-自定义json格式日志 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据运维工作中,我们经常会使用flume,filebeat相关日志收集工具取收集日志 ...

  5. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  6. mysql 5.7 支持json格式

    1.JSON格式的支持:mysql> create table user ( uid int auto_increment,      -> data json,primary key(u ...

  7. go基础之json格式数据处理

    go基础之json格式数据处理 1.结构体小写问题导致出错 2.struct没有正确加tag 3.struct加上tag 4.struct tag扩展 go基础之json格式数据处理 go标准库里面提 ...

  8. 使用BeanShell断言判断请求返回的Json相应结果(不同json格式整理)

    第一种json格式 { "code": 0, "msg": "success", "success": true, &q ...

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

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

随机推荐

  1. Java学习的第四十二天

    1.例4.7弦截法求方程f(x)=x^3-5x^2+16x-80=0的根 import java.util.Scanner; import java.lang.*; public class cjav ...

  2. pause容器作用

    1.概念 Pause容器 全称infrastucture container(又叫infra)基础容器. 作为init pod存在,其他pod都会从pause 容器中fork出来. 每个Pod里运行着 ...

  3. typeerror object of type ‘decimal‘ is not json serializable jsonify

    当使用flask的jsonify返回json数据时,由于数据库有些字段类型使用decimal,而jsonify无法处理 解决方案 导入下面的包即可解决 pip install simplejson

  4. python机器学习TensorFlow框架

    TensorFlow框架 关注公众号"轻松学编程"了解更多. 一.简介 ​ TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运 ...

  5. 微服务通信之ribbon实现原理

    前言 上一篇我们知道了feign调用实现负载均衡是通过集成ribbon实现的.也较为详细的了解到了集成的过程.现在我们看一下ribbo是如何实现负载均衡的.写到这里我尚未去阅读源代码,我在这里盲猜一下 ...

  6. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  7. MySQL的安装及安装问题解答(一)

    1. MySQL简介 MySQL属于关系型数据库管理系统,RDBMS(Relational Datebase Management System), 前身为瑞典MySQL AB公司开发,当前属于Orq ...

  8. P1526 [NOI2003]智破连环阵

    目录 题意描述 算法分析 闲话 初步分析 具体思路 剪枝一 剪枝二 剪枝三 总结一下 代码实现 预处理 剪枝一 剪枝二 剪枝三 二分图匹配 代码综合 结语 又是被楼教主虐的体无完肤的一天 题意描述 在 ...

  9. 前端未来趋势之原生API:Web Components

    声明:未经允许,不得转载. Web Components 现世很久了,所以你可能听说过,甚至学习过,非常了解了.但是没关系,可以再重温一下,温故知新. 浏览器原生能力越来越强. js 曾经的 JQue ...

  10. 寻找性能更优秀的动态 Getter 和 Setter 方案

    反射获取 PropertyInfo 可以对对象的属性值进行读取或者写入,但是这样性能不好.所以,我们需要更快的方案. 方案说明 就是用表达式编译一个 Action<TObj,TValue> ...