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

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


实战示例

1、测试场景

  • 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖

库存余量查询响应结果
  • 响应结果一般是json字符串的形式,响应示例如下:

2、期望获取的结果

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

标注如下:

3、jmeter beanshell书写代码建议

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

IDEA调试结果如下:

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

4、测试脚本

附jmeter-beanshell测试脚本(当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"));            });        });    }

5、其它

另外使用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/testGET data:{"period_stock":"80"}[no cookies]Request Headers:Connection: keep-aliveContent-Type: application/jsonContent-Length: 21Host: 127.0.0.1:8080User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_181)

6、常用变量总结

1、vars: 实际引用Jmeter线程的局部变量, 连通Jmeter 和 beanshell

vars.get(String key) //获取变量值
vars.put(String key, String value) //存储value到变量key

2、log: 写入信息到日志中

log.info("*****开始测试******"+period_stock)  //括号放置需要的变量

3、prev:获取当前响应结果和响应状态;

prev.getResponseDataAsString()
prev.getResponseCode()

4、 props:class java.util.Properties

变量属性复制给变量

props.put("some_variable",vars.get("some_variable"))

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​
在这里插入图片描述​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值