zoukankan      html  css  js  c++  java
  • 记录jmeter使用beanshell断言获取复杂的json字符串参数值

    实战示例

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

    2、期望获取的结果

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

    3、jmeter bea

    测试获取建议操作
    • 由于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"))

    更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:
    Coding测试

  • 相关阅读:
    JBPM 入门阅读
    Jquery ligerui下拉框复选,使下拉框中相应值对勾选中
    spring quartz 1.6配置方法
    断点续传的原理
    转:DWR详细应用介绍
    转:第一个DWR示例
    解决(CXF):SOAPFaultException: Fault occurred while processing
    s2sh保存错误: a different object with the same identifier value was already associated
    解决 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lan
    转载:struts2重要标签学习
  • 原文地址:https://www.cnblogs.com/CodingTest/p/13748127.html
Copyright © 2011-2022 走看看