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

实战示例

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

2、期望获取的结果

通过上面响应结果,想获取参数为periods数组下的period_stock参数值和back_periods数组period_stock参数值。
标注如下:


image

3、jmeter beanshell

测试获取建议操作
  • 由于jmeter中beanshell断言中书写代码没有提示(超不方便),不过可提前在IEDA工具中先调试获取结果再复制到beanshell中。
  • IDEA调试结果如下:


然后就只把把代码复制到beanshell中即可。在jmeter中可以打印下获取的库存余量,结果如下:


  • 附测试脚本(当back_periods库存值=0时,beanshell断言生效,可及时查看订单创建数量是否与库存数量一致)
  import org.json.*;
  //获取上一个请求的返回值
  String response = prev.getResponseDataAsString();
  //将返回值转换为json
  JSONObject responseJson = new JSONObject(response);
  //获取responseMessage
  JSONArray data = responseJson.getJSONObject("data").getJSONArray("ticket_periods");
  JSONObject ticket_periods = (JSONObject)data.get(0);
  JSONObject periods =(JSONObject)(ticket_periods.getJSONArray("periods").get(0));
  Integer period_stock = periods.getInt("period_stock");
  JSONObject back_periods=(JSONObject)(ticket_periods.getJSONArray("back_periods").get(0));
  Integer  period_stock_back = back_periods.getInt("period_stock");
  log.info("==========获取库存开始===========");
  log.info("periods内余量值:" + period_stock);
  log.info("back_periods内余量值:" +period_stock_back);
  log.info("==========获取库存结束===========");
  //beanshell断言
 if(period_stock == 0){
   Failure = true; 
   FailureMessage = "period_stock的值:" + period_stock +"警告:已无库存,请注意查看"+ "||period_id的值为:"+period_stock_back+"警告:已无库存,请注意查看";
}
  • 获取所有数组内的参数值,这个需要进行遍历操作


    示例结果

    附遍历代码

public void testCase() throws IOException {
//        //将返回值转换为json
//        JSONObject responseJson = new JSONObject(str);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        Map map = objectMapper.readValue(str, Map.class);
        Map dataMap = (Map) map.get("data");
        List<Map<String, Object>> list = (List<Map<String, Object>>) dataMap.get("ticket_periods");
        list.stream().forEach(item ->{
            List<Map<String, Object>> periodsList = (List<Map<String, Object>>) item.get("periods");
            periodsList.stream().forEach(periods ->{
                System.out.println("当前period_stock的值:"+periods.get("period_stock"));
            });
        });
    }

  • 另外使用jmeter的beanshell功能经常会用到以下方式传递变量
    1、在beanshell中如果拿到响应结果的某个值,可以通过赋值方式传入,然后通过变量取值即可
vars.put赋值,格式为 vars.put("key","value")
vars.get 获取变量,vars.get("period_stock")

2、特别说明:如果想把Integer类型通过vars放入的话需要加上toString()方法,上面需要把Integer 类型period_stock作为变量传递,示例

 vars.put("period_stock",period_stock.toString());

其它接口可通过变量名取值:{"period_stock":"${period_stock}"}
传递结果

GET http://127.0.0.1:8080/test

GET data:
{"period_stock":"80"}

[no cookies]

Request Headers:
Connection: keep-alive
Content-Type: application/json
Content-Length: 21
Host: 127.0.0.1:8080
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_181)
  • 常用变量总结:
    • vars: 实际引用Jmeter线程的局部变量, 连通Jmeter 和 beanshell
      vars.get(String key) //获取变量值
       vars.put(String key, String value) //存储value到变量key
    • log: 写入信息到日志中,log.info(""),括号放置需要的变量
    • prev:获取当前响应结果和响应状态;
       getResponseDataAsString()
       getResponseCode()
    • props:class java.util.Properties
      变量属性复制给变量props.put("some_variable",vars.get("some_variable"))

  • jmeter变量提取方法
    1、正则提取方法
    匹配规则


响应示例

{
    "code":200,
    "data":[
        {
            "id":100,
            "regname":"test1",
            "pwd":"A31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":200,
            "regname":"test2",
            "pwd":"B31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":300,
            "regname":"test3",
            "pwd":"C31BFB0C8955E3780342A5EAF0282FF"
        }
    ],
    "msg":"success"
}

期望结果:取出id、regname、pwd参数值,通过正则提取
可使用在线验证工具:https://tool.oschina.net/regex/
验证结果
方法:

1、ID的:"id":(.*?)," 或者: "id":(.+?),"可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个
2、regname的:"regname":"(.*?)",或者:"regname":"(.+?)"," 可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个
3、pwd的:"pwd":"(.*?)","或者:"pwd":"(.+?)","可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个

2、json提取器方法
同样是上述示例

{
    "code":200,
    "data":[
        {
            "id":100,
            "regname":"test1",
            "pwd":"A31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":200,
            "regname":"test2",
            "pwd":"B31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":300,
            "regname":"test3",
            "pwd":"C31BFB0C8955E3780342A5EAF0282FF"
        }
    ],
    "msg":"success"
}

期望结果:取出id、regname、pwd参数值,通过json提取器
方法:

写法:$.data[0].id  其他参数参考此提取方法
规则说明:$开始;.data:第一层里的数据;[0]:data里有三组数据,取第一组的数据;.id:取第一组数据里的id的值
当[*]代表取所有数据,例$.data[*].id取出80,81,82
当[:N]代表取前两个值,例$.data[:2].id取出80,81

扩展:

扩展1:取指定pwd为A31BFB0C8955E3780342A5EAF0282FF的id
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].id
扩展2:固定条件多个key的value
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].["id","regname","pwd"]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342