JMeter使用BeanShell的断言解释

发表于:2021-11-16 09:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:书院小先生    来源:博客园

  BeanShell简介
  BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如:
  ·定时器:BeanShell Timer
  · 前置处理器:BeanShell PreProcessor
  · 采样器:BeanShell Sampler
  · 后置处理器:BeanShell PostProcessor
  · 断言:BeanShell Assert
  · 监听器:BeanShell Listener
  通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。
  Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,比如:
  prInt:非GUI模式下打印信息(输出信息到stdout)
  log:输出信息到日志(文件)
    - log.debu("调试信息")
    - log.info("响应状态码" + ResponseCode)
    - log.warn("警告信息")
    - log.error("出错信息")
  ResponseCode:响应状态码(String类型)
  ResponseHeaders:响应头(String类型)
  prev:获取当前请求结果
    - prew.getResponseDataAsString():获取响应体数据(String类型)
    - prew.getResponseCode():获取状态码(同ResponseCode,String类型)
  vars: 操作jmeter变量
    - String var1 = vars.get("变量名"):获取变量的值(假设为String类型)
    - vars.put("变量名", 变量值):设置变量值
  props: 操作JMeter属性
    - props.get(String,String) 可以获取Jmeter中已经生成的属性
    - props.put(String,String) 可以创建和更新Jmeter属性
  ctx:获取当前线程上下文数据(可获取所有信息)
    - ctx.getVariables("变量名"):获取变量值(同vars.get())
    - ctx.setVariables("变量名", "变量值"):设置变量(同vars.put())
    - ctx.getProperties("属性名"):获取属性值(同props.get())
    - ctx.setProperties("属性名","属性值"):设置属性(同props.put())
    - ctx.getPreviousResult():获取当前请求结果同(prev)
    - ctx.getCurrentSampler():获取当前采样器
    - ctx.getPreviousSampler():获取前一采样器
    - ctx.getThreadNum():获取线程数
    - ctx.getThreadGroup():获取线程组
    - ctx. getThread():获取当前线程
    - ctx.getEngine():获取引擎
    - ctx.isSamplingStarted():判断采样器是否启动
    - ctx.isRecording():判断是否开启录制
    - ctx.getSamplerContext():获取采样器山下文数据
  BeanShell断言
  BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据,结合if判断通过变量Failure=false或Failure=true来设置断言是否通过,当设置Failure=true时,还可以设置FailureMessage来设置失败原因。
  状态码断言
  Copy
  //状态码断言
  log.info("状态码:" + ResponseCode);
  if(ResponseCode.equals("200")){ 
  Failure=false;
  }
  else{
  Failure=true;
  FailureMessage="响应状态码非200";  //指定失败原因
  }
  注:字符串只能使用双引号,字符串相等要使用"".equals("")
  响应体包含特定字符#
  Copy
  //获取响应数据
  String response = prev.getResponseDataAsString();
  log.info("响应体:" + response);
  //响应数据包含
  if(response.contains("登录成功")){
  Failure=false;
  }
  else{
  Failure=true;
  FailureMessage="响应数据不包含登录成功";
  }
  JSON响应体字段提取及断言
  将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,下载地址如下:
  json.jar:下载地址 密码:8it7
  gson.jar:下载地址 密码:6a7v
  以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:
  Copy
  //JSON响应断言
  import org.json.*;   //导入org.json包
  String response = prev.getResponseDataAsString();  //获取响应数据
  JSONObject responseJson = new JSONObject(response);  //转为JSON对象
  String message = responseJson.getString("message"); 
  log.info("响应message字段:" + message);
  if(message.equals("成功")){
  Failure=false;
  }
  else{
  Failure=true;
  FailureMessage="响应message字段非成功";
  }
  JSONObject对象除了getString()方法外,还支持:
  ·getBoolean("字段名") :获取布尔类型字段值
  · getInt("字段名"):获取整型字段值
  · getLong("字段名"):获取长整型字段值
  · getDouble("字段名"):获取双精型字段值
  · getJSONObject("字段名"):获取嵌套Object类型字段值,JSONObject类型
  · getJSONArray("字段名"):获取嵌套Array类型,JSONArray类型
  响应头解析
  响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项。
  Copy
  import java.util.HashMap;
  import java.util.Map;
  //将字符串用换行符 截取为adc数组
  String [] headersList = ResponseHeaders.split("\n");
  Map headersMap = new HashMap();   //创建HashMap来从新组装headers
  for(int i=1;i<headersList.length;i++){
  String [] itemList=headersList[i].split(": ");   // 将每一条Headerr项按冒号分割
  headersMap.put((itemList[0]), itemList[1]);   // 分键值放入HashMap
  }
  String contentType = headersMap.get("Content-Type");   // 提取相应项
  log.info("响应Content-Type:" + contentType)

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号