jmeter使用beanshell断言获取复杂的json字符串参数值 分手后的思念是犯贱 2023-09-26 15:41 78阅读 0赞 ### 实战示例 ### ### 1、测试场景 ### 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式,响应示例如下: ![图片][0f7b6385e9164fce9c601bfd54edff75.png] ### 2、期望获取的结果 ### 通过上面响应结果,想获取参数为periods数组下的period\_stock参数值和back\_periods数组period\_stock参数值。 标注如下: ![图片][b1a432e32f5d40b48886554628611029.png] ### 3、jmeter beanshell书写代码建议 ### 由于jmeter中beanshell断言中书写代码没有提示(超不方便),不过可提前在IEDA工具中先调试获取结果再复制到beanshell中。 IDEA调试结果如下: ![图片][ef8b3223df0945bfa27d14d58a94bf0c.png] 然后就只把把代码复制到beanshell中即可。在jmeter中可以打印下获取的库存余量,结果如下: ![图片][a8b3566b324742588ddc91c413454654.png] ### 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+"警告:已无库存,请注意查看"; } 如果要获取所有数组内的参数值,需要进行遍历操作。 ![图片][39af9377d77c4c59b0fbd32c003d3f8b.png] 示例结果 附遍历代码 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/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) ### 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")) -------------------- ### 资源分享 ### **下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 `【保证100%免费】`** ![在这里插入图片描述][b9a9eea1ed5c42429c5e383b00ba6e0c.png_pic_center] ![在这里插入图片描述][d96b58a511f84668b59f3f620964da07.png_pic_center] [0f7b6385e9164fce9c601bfd54edff75.png]: https://img-blog.csdnimg.cn/0f7b6385e9164fce9c601bfd54edff75.png [b1a432e32f5d40b48886554628611029.png]: https://img-blog.csdnimg.cn/b1a432e32f5d40b48886554628611029.png [ef8b3223df0945bfa27d14d58a94bf0c.png]: https://img-blog.csdnimg.cn/ef8b3223df0945bfa27d14d58a94bf0c.png [a8b3566b324742588ddc91c413454654.png]: https://img-blog.csdnimg.cn/a8b3566b324742588ddc91c413454654.png [39af9377d77c4c59b0fbd32c003d3f8b.png]: https://img-blog.csdnimg.cn/39af9377d77c4c59b0fbd32c003d3f8b.png [b9a9eea1ed5c42429c5e383b00ba6e0c.png_pic_center]: https://img-blog.csdnimg.cn/b9a9eea1ed5c42429c5e383b00ba6e0c.png#pic_center [d96b58a511f84668b59f3f620964da07.png_pic_center]: https://img-blog.csdnimg.cn/d96b58a511f84668b59f3f620964da07.png#pic_center
还没有评论,来说两句吧...