前言

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

一、第一种Json格式

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

  1. {
  2. "msg":"success",
  3. "code":"0",
  4. "info":{
  5. "list":[
  6. {
  7. "id":13628,
  8. "materialColor":"浅粉",
  9. "addOrderTime":"2020-11-26 20:11:09",
  10. "unit":"米"
  11. },
  12. {
  13. "id":13629,
  14. "materialColor":"浅粉",
  15. "addOrderTime":"2020-11-26 20:11:09",
  16. "unit":"米"
  17. }
  18. ],
  19. "pageCount":50,
  20. "recordCount":5425
  21. }
  22. }

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

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

  1. //Case1:检查返回的recordCount是否等于前一个接口提取的的num
  2.  
  3. //导入json的包
  4. import org.json.*;
  5.  
  6. //获取响应结果,并转换为json
  7. String response=prev.getResponseDataAsString();
  8. JSONObject responseJson=new JSONObject(response);
  9. log.info("转换后的响应结果json:"+ responseJson);
  10.  
  11. //获取msg,code,是字符串型,所以用getString
  12. String message = responseJson.getString("msg");
  13. String code = responseJson.getString("code");
  14. log.info("msg的值为:"+message+"---code的值为:"+code);
  15.  
  16. //获取list,因为是数组,所以要用JSONArray
  17. JSONArray list = responseJson.getJSONObject("info").getJSONArray("list");
  18. log.info("list数组的值为:"+list);
  19.  
  20. //获取recordCount:因为recordCount是数值型,所以用getInt
  21. int recordCount = responseJson.getJSONObject("info").getInt("recordCount");
  22. log.info("recordCount的值为:"+ recordCount);
  23.  
  24. //判断返回的recordCount是否等于tab的num,num是前面接口提取出的变量,在这里可以直接用${num}引用,或者用vars.get("num")也行
  25. if(recordCount == ${num}){
  26. Failure=false;
  27. log.info("比对结果为:"+recordCount+"="+ ${num});
  28. }
  29. else{
  30. Failure=true;
  31. FailureMessage="recordCount不等于tab的num,请检查";
  32. log.info(FailureMessage);
  33. }

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

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

  1. //Case2:检查返回数据的下单时间是否在检索条件内
  2.  
  3. //导入json的包
  4. import org.json.*;
  5.  
  6. //导入 时间在转换成Date类型时要用到的方法
  7. import java.util.Date;
  8. import java.text.SimpleDateFormat;
  9.  
  10. //为了变量能在全局使用,所以在try{}和for{}外面先声明变量
  11. String addOrderTime;
  12. String addOrderTime1;
  13.  
  14. try {
  15. //获取响应结果,并转换为json
  16. String response=prev.getResponseDataAsString();
  17. JSONObject responseJson=new JSONObject(response);
  18. log.info("转换后的响应结果json:"+ responseJson);
  19.  
  20. //获取list里第[1]个数组对象的id值:这个与本次断言无关
  21. JSONArray list=responseJson.getJSONObject("info").getJSONArray("list");
  22. log.info("list为:"+ list);
  23. JSONObject jsonTemp = list.getJSONObject(1);
  24. String id = jsonTemp.get("id").toString();
  25. log.info("id:"+id);
  26.  
  27. //获取list数组的长度
  28. int len = list.length();
  29. String strlen = Integer.toString(len);
  30. log.info("list数组的长度为:"+strlen);
  31.  
  32. //拿到list数组长度后,用for循环输出addOrderTime的值
  33. int i ;
  34. for(i=0 ;i < len;++i)
  35. {
  36. //获取 list[ i ] 数组对象;
  37. JSONObject jsonTemp = list.getJSONObject(i);
  38. addOrderTime = jsonTemp.get("addOrderTime").toString();
  39. log.info("第一种写法,通过list数组长度一直循环拿出addOrderTime的值为:"+addOrderTime);
  40. }
  41.  
  42. //获取list里第[1]个数组对象的addOrderTime值
  43. JSONArray list=responseJson.getJSONObject("info").getJSONArray("list");
  44. log.info("list为:"+ list);
  45. JSONObject jsonTemp = list.getJSONObject(1);
  46. addOrderTime1 = jsonTemp.get("addOrderTime").toString();
  47. log.info("第二种写法,直接写死数组,获取到的addOrderTime1的值为:"+addOrderTime1);
  48.  
  49. }
  50.  
  51. catch (Throwable ex) {
  52. log.error("Failed in Beanshell", ex);
  53. throw ex;
  54. }
  55.  
  56. //获取开始时间和结束时间:这2个是在前面接口提取出来的参数变量,所以直接用${}引用即可
  57. String beginTime = "${addOrderTimeStart}";
  58. String endTime = "${addOrderTimeEnd}";
  59. log.info("筛选条件的开始日期为:"+beginTime+"/"+"筛选条件的结束日期为:" +endTime);
  60.  
  61. //将日期转换成Date类型,并转换成时间戳去比较大小
  62. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  63. Date date1 = format.parse(beginTime);
  64. Date date2 = format.parse(endTime);
  65. Date date3 = format.parse(addOrderTime1);
  66. log.info("转换成Date类型后输出的值分别为:"+date1+"/"+date2+"/"+date3);
  67.  
  68. long beginMillisecond = date1.getTime();
  69. long endMillisecond = date2.getTime();
  70. long date3Millisecond = date3.getTime();
  71. log.info("yyyy-MM-dd转换时间戳后的值:"+beginMillisecond+"/"+endMillisecond+"/"+date3Millisecond);
  72.  
  73. //筛选条件的日期是年月日,而返回数据的日期是年月日时分秒,所以这里单独将addOrderTime1的值用yyyy-MM-dd HH:mm:ss转换时间戳
  74. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  75. Date date4 = format.parse(addOrderTime1);
  76. long date4Millisecond = date4.getTime();
  77. log.info("yyyy-MM-dd HH:mm:ss转换时间戳后的值:"+beginMillisecond+"/"+endMillisecond+"/"+date4Millisecond);
  78.  
  79. //判断下单时间是否在检索条件范围内
  80. if( endMillisecond > date4Millisecond && beginMillisecond < date4Millisecond){
  81. Failure=false;
  82. log.info("校验通过啦,beginMillisecond的值为"+beginMillisecond+"/date3Millisecond的值为:"+date3Millisecond+"/endMillisecond的值为:"+endMillisecond);
  83. }
  84. else{
  85. Failure=true;
  86. FailureMessage="不在时间范围内,请检查,beginMillisecond的值为"+beginMillisecond+"/date3Millisecond的值为:"+date3Millisecond+"/endMillisecond的值为:"+endMillisecond;
  87. log.info(FailureMessage);
  88. }

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

二、第二种Json格式

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

  1. {
  2. "msg":"success",
  3. "code":"0",
  4. "info":{
  5. "id":217369,
  6. "materialBaseInfo":{
  7. "id":235350,
  8. "sku":"M007925",
  9. },
  10. "supplierMaterialInfo":[
  11. {
  12. "id":240717,
  13. "supplierId":5658,
  14. "supplier":"XX",
  15. "supplierCode":"P445"
  16. },
  17. {
  18. "id":240718,
  19. "supplierId":1,
  20. "supplier":"XX1",
  21. "supplierCode":"P04"
  22. }
  23. ],

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

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

  1. import org.json.*;
  2.  
  3. //获取响应结果,并转换为json
  4. String response=prev.getResponseDataAsString();
  5. JSONObject responseJson=new JSONObject(response);
  6. log.info("转换后的响应结果json:"+ responseJson);
  7.  
  8. //Case1:提取并断言返回的Info{id}
  9. int infoid = responseJson.getJSONObject("info").getInt("id");
  10. log.info("info下id的值为"+infoid);
  11.  
  12. if( infoid == ${id}){
  13. Failure=false;
  14. log.info("校验通过啦,infoid的值为"+infoid+"/id的值为:"+ ${id});
  15. }
  16. else{
  17. Failure=true;
  18. FailureMessage="校验不通过呀,infoid的值为"+infoid+"/id的值为:"+ ${id};
  19. log.info(FailureMessage);
  20. }
  21.  
  22. //Case2:提取并断言返回的Info{materialBaseInfo{sku}}
  23. String materialBaseInfosku = responseJson.getJSONObject("info").getJSONObject("materialBaseInfo").getString("sku");
  24. log.info("materialBaseInfosku的值为"+materialBaseInfosku);
  25. String materialSku = vars.get("materialSku");
  26. log.info(materialSku);
  27.  
  28. if( materialBaseInfosku.equals(materialSku)){
  29. Failure=false;
  30. log.info("校验通过啦,materialBaseInfosku的值为"+materialBaseInfosku+"/materialSku的值为:"+ materialSku);
  31. }
  32. else{
  33. Failure=true;
  34. FailureMessage="校验不通过呀,materialBaseInfosku的值为"+materialBaseInfosku+"/materialSku的值为:"+ materialSku;
  35. log.info(FailureMessage);
  36. }
  37.  
  38. //Case3:提取返回的Info{supplierMaterialInfo[{supplierId,supplier}]}
  39. JSONArray supplierMaterialInfo = responseJson.getJSONObject("info").getJSONArray("supplierMaterialInfo");
  40. log.info("supplierMaterialInfo数组的值为:"+supplierMaterialInfo);
  41. String supplier1 = supplierMaterialInfo.getJSONObject(0).getString("supplier");
  42. log.info("第一种方法拿到supplier的值为"+supplier1);
  43.  
  44. int len =supplierMaterialInfo.length();
  45. log.info("数组的长度为"+len);
  46. int i;
  47. for(i=0;i<len;++i){
  48. JSONObject jsons= supplierMaterialInfo.getJSONObject(i);
  49. supplier = jsons.getString("supplier");
  50. log.info("第二种方法循环拿supplier的值为"+supplier);
  51. }
  52. for(i=0;i<len;++i){
  53. JSONObject jsons= supplierMaterialInfo.getJSONObject(i);
  54. int supplierId = jsons.getInt("supplierId");
  55. log.info("第二种方法循环拿supplierId的值为"+supplierId);
  56. }

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. Redis学习五(Redis 阻塞的原因及其排查方向).

    一.慢查询 因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况. 二.bigkey 大对象 bigke ...

  2. React react-redux props或state更新视图无法重新渲染问题

    记录学习React时自己是如何挖坑把自己埋了的过程:children以及其它props被修改时相关组件无法重新渲染(做了两天) 父组件代码: class UserHome extends Compon ...

  3. filter 请求过程中过滤链组装和调用解析

    自定义filter需要先下载依赖包 首先过滤链不是责任链的设计模式,因为一个request可以被链条上的多个filter处理.但是,对于责任链来说,一个request只能被链条中的一个handler处 ...

  4. DTU的工作原理和流程

    DTU是无线数据传输模块,采用2G,3G,4G网络,将本地串口数据经DTU打包成TCP或者UDP数据进行远程传输的设备.使用方便.已经在各行业远程数据传输,设备监控等领域大量应用.如智能仪器仪表.智能 ...

  5. php post请求https

    <?php $url = 'https://www.xxx.com'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); c ...

  6. margin的讲究

    什么元素允许有margin值,无论块状元素还是行内元素都可以,只是各有限制. 先说行内元素,这个是不允许有上下 外边距的, 再说块状元素,上下左右外边距都允许  但是相邻元素的外边距会合并,要注意的是 ...

  7. 2020 中国.NET 开发者峰会正式启动

    2014年微软组织并成立.NET基金会,微软在成为主要的开源参与者的道路上又前进了一步. 2014年以来已经有众多知名公司加入.NET基金会,Google,微软,AWS三大云厂商已经齐聚.NET基金会 ...

  8. GC 的认识(转) https://github.com/qcrao/Go-Questions/blob/master/GC/GC.md#1-什么是-gc有什么作用

    1. 什么是 GC,有什么作用? GC,全称 Garbage Collection,即垃圾回收,是一种自动内存管理的机制. 当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内 ...

  9. shell编程之trap命令

    trap command  signal trap捕获信号(软中断),command一般是linux命令 若为' '表示发生陷阱时为空指令,'-'表示发生陷阱时采用缺省指令 signal: HUP(1 ...

  10. 爬虫练习之正则表达式爬取猫眼电影Top100

    #猫眼电影Top100import requests,re,timedef get_one_page(url): headers={ 'User-Agent':'Mozilla/5.0 (Window ...