JMeter使用BeanShell断言

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来设置失败原因。

状态码断言

复制代码
复制代码
  1. Copy//状态码断言

  2. log.info("状态码:" + ResponseCode);

  3. if(ResponseCode.equals("200")){

  4. Failure=false;

  5. }

  6. else{

  7. Failure=true;

  8. FailureMessage="响应状态码非200"; //指定失败原因

  9. }

注:字符串只能使用双引号,字符串相等要使用"".equals("")

响应体包含特定字符
复制代码
  1. Copy//获取响应数据Stringresponse= prev.getResponseDataAsString();

  2. log.info("响应体:" + response);

  3. //响应数据包含if(response.contains("登录成功")){

  4. Failure=false;

  5. }

  6. else{

  7. Failure=true;

  8. FailureMessage="响应数据不包含登录成功";

  9. }

JSON响应体字段提取及断言

将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,下载地址如下:

以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:

复制代码
  1. Copy//JSON响应断言import org.json.*; //导入org.json包Stringresponse= prev.getResponseDataAsString(); //获取响应数据JSONObjectresponseJson=newJSONObject(response); //转为JSON对象Stringmessage= responseJson.getString("message");

  2. log.info("响应message字段:" + message);

  3. if(message.equals("成功")){

  4. Failure=false;

  5. }

  6. else{

  7. Failure=true;

  8. FailureMessage="响应message字段非成功";

  9. }

JSONObject对象除了getString()方法外,还支持

  • getBoolean("字段名") :获取布尔类型字段值
  • getInt("字段名"):获取整型字段值
  • getLong("字段名"):获取长整型字段值
  • getDouble("字段名"):获取双精型字段值
  • getJSONObject("字段名"):获取嵌套Object类型字段值,JSONObject类型
  • getJSONArray("字段名"):获取嵌套Array类型,JSONArray类型
响应头解析

响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项

复制代码
  1. Copyimport java.util.HashMap;

  2. import java.util.Map;

  3. //将字符串用换行符 截取为adc数组

  4. String [] headersList = ResponseHeaders.split("\n");

  5. MapheadersMap=newHashMap(); //创建HashMap来从新组装headersfor(int i=1;i<headersList.length;i++){

  6. String [] itemList=headersList[i].split(": "); // 将每一条Headerr项按冒号分割

  7. headersMap.put((itemList[0]), itemList[1]); // 分键值放入HashMap

  8. }

  9. StringcontentType= headersMap.get("Content-Type"); // 提取相应项

  10. log.info("响应Content-Type:" + contentType)

最后感谢每一个认真阅读我文章的人!作为一位过来人也是希望大家少走一些弯路,如果

相关推荐
正经教主4 分钟前
【菜鸟飞】Conda安装部署与vscode的结合使用
运维·vscode·python·conda
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧6 分钟前
C语言_数据结构总结4:不带头结点的单链表
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
轻松Ai享生活18 分钟前
5 Python 技巧,让你秒变大神
python
极客代码21 分钟前
Linux IPC:System V共享内存汇总整理
linux·c语言·开发语言·并发·共享内存·通信·system v
orangapple27 分钟前
一个差劲的软件设计
开发语言·c#
算法与编程之美29 分钟前
冒泡排序
java·开发语言·数据结构·算法·排序算法
Aphelios38031 分钟前
Java 学习记录:基础到进阶之路(一)
java·开发语言·学习·idea
白总Server32 分钟前
Bash和Zsh在处理大文件时优化方法
开发语言·网络·ide·stm32·安全·udp·bash
苦逼的老王1 小时前
java之uniapp实现门店地图
java·开发语言·uni-app
一条晒干的咸魚1 小时前
【C#学习笔记03】进制转换与反码、补码、原码
开发语言·笔记·学习·c#