首页 > 系统相关 >JMeter基础 — JMeter中BeanShell断言详解

JMeter基础 — JMeter中BeanShell断言详解

时间:2023-12-03 17:57:20浏览次数:45  
标签:String 获取 ctx 响应 详解 BeanShell JMeter 断言

JMeter中的BeanShell断言,可以使用BeanShell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用BeanShell语。

1、BeanShell简介

Beanshell是一种类似JAVA的脚本语言,通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。还可以直接调用外部的JAR包,例如:可以直接引入现成的第三方JSON解析包来使用。

在JMeter的多种组件中都有BeanShell的身影,如下:

  • 定时器:BeanShell Timer
  • 前置处理器:BeanShell PreProcessor
  • 采样器:BeanShell Sampler
  • 后置处理器:BeanShell PostProcessor
  • 断言:BeanShell Assert
  • 监听器:BeanShell Listener

在JMeter运行的流程控制中,BeanShell出现的位置,如下图所示:

 

   

2、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():获取采样器山下文数据。

提示:ctx详细API可参考:JMeter上下文

3、BeanShell断言界面详解

添加BeanShell断言组件操作:选中“取样器”右键 —> 添加 —> 断言 —> BeanShell断言。

界面如下图所示:

 

BeanShell断言组件的详细说明:

  • 名称:BeanShell断言组件的自定义名称,见名知意最好。
  • 注释:即添加一些备注信息,对该BeanShell断言组件的简短说明,以便后期回顾时查看。
  • Reset bsh.Interpreter before each
    call:每个BeanShell测试元素都有自己的解释器副本(对于每个线程)。如果重复调用测试元素,例如在循环内,除非选择在每次调用之前重置bsh.Interpreter选项,否则解释器将保留在调用之间。一些长时间运行的测试可能会导致解释器使用大量内存。
    由于BeanShell的bsh.Interpreter存在内存泄露,常规方法无法支持长时间的压力测试。JMeter官网推荐,在使用BeanShell进行长时间测试时,打开选项Reset
    bsh.Interpreterbefore each
    call,则在每次调用BeanShell程序前,都把解释器重置,以释放解释器之前占用的内存。
  • 参数 (-> String Parameters和String[]bsh.args):输入String参数。String
    []bsh.args是主类main函数的形式参数,是一个String 对象数组,可以用来获取命令行用户输入进去的参数。
  • 脚本文件:脚本文件(可以填入脚本文件路径),可以点击后边的浏览选择脚本文件。
  • Script (see below for variables that are
    defined):编写脚本,参照下文定义的变量(使脚本文件参照定义的变量来运行)

4、BeanShell断言的使用

BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据。结合if判断,通过变量Failure=false或Failure=true来设置断言是否通过。当设置Failure=true时,还可以设置FailureMessage来设置失败原因。

我们以一个登陆接口,来演示BeanShell断言组件的应用。

(1)测试计划内包含的元件

添加元件操作步骤:

1、创建测试计划。

2、创建线程组:选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组。

3、在线程组里面,添加取样器“HTTP请求”组件:选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求。

4、在取样器下,添加断言“BeanShell断言”组件:选中“取样器”右键 —> 添加 —> 断言 —> BeanShell断言。

5、在取样器下,添加监听器“断言结果”组件:选中“取样器”右键 —> 添加 —> 监听器 —> 断言结果。

6、在线程组里面,添加监听器“察看结果树”组件:查看结果,选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树。

最终测试计划中的元件如下:

 

点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。

(2)登陆接口请求界面内容

标准的Post请求,填写请求的基本信息和参数即可。

编写内容如下:

 

(3)BeanShell断言界面内容

我把只要把自己编写的BeanShell代码,复制到Script (see below for variables that are defined)下的输入框即可。

如果需要进行模拟压力测试的时候,可以勾选上Reset bsh.Interpreter before each call选项。我们这里不用。

编辑好的界面,如下图所示:

 

说明:

1)状态码断言代码:

//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){ 
	Failure=false;	// 表示断言成功
}
else{
	Failure=true;	// 表示断言失败
	FailureMessage="响应状态码非200";  // 自定义的失败信息
}

注:字符串只能使用双引号,字符串相等要使用" “.equals(” ")表达式。

2)响应体包含特定内容断言代码:

//获取响应数据
String response = prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含
if(response.contains("登录成功")){
	Failure=false;	// 表示断言成功
}
else{
	Failure=true;	// 表示断言失败
	FailureMessage="响应数据不包含登录成功";
}

(4)查看运行结果

我们在察看结果树组件中,观察脚本运行之后的结果。

如果断言正确,和正常发送请求一样,如下图:

//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应状态码非200"; // 自定义的失败信息
}

如果断言失败,则会出现断言失败的提示,如下图所示:

//获取响应数据
String response = prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含
if(response.contains("登录成功")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应数据不包含登录成功";
}

 

(5)断言结果组件说明

也添加断言结果监听器,通过断言结果组件来判断断言是否通过。

如下图所示:

 

说明:

  • 已通过的断言仅显示取样器名称。
  • 未通过的,除了显示取样器的名称,还显示错误原因。

5、补充知识点

(1)JSON响应体字段提取及断言

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

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

//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字段非成功";
}

//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类型。

Copyimport 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)

(2)响应头解析

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

Copyimport 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)

Copyimport 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)

 

标签:String,获取,ctx,响应,详解,BeanShell,JMeter,断言
From: https://www.cnblogs.com/alan5201314/p/17873486.html

相关文章

  • BeanShell 后置处理程序
     Stringresponse=prev.getResponseDataAsString();StringResponseCode=prev.getResponseCode();//获取状态码(同ResponseCode,String类型)StringresponseHeaders=prev.getResponseHeaders();//prev.getResponseDataAsString();//获取响应体数据(String类型)Stringresponse=pre......
  • jmeter初步学习1
    http请求报文 响应报文 常见状态码 启动jmeter1、添加HTTP请求 正则表达式获取变量值 content":"(.*?)"}  起始内容:content":"结尾内容:"}  中间取值:(.*?)  --任意匹配JSON提取器 输出查验获取结果: 上面选择日志查看,可以查看输出:也可以调试开......
  • jmeter汉化
    jmeter默认是英语环境,但是可以通过设置来显示为中文。方法一:在jmeter面板上选择Options-->ChooseLanguage-->Chinese但是这种方法设置的只能在当前界面生效,下次打开jmeter仍然会显示为英文。 方法二:通过设置jmeter.properties文件来设置语言为中文(这种方法设置后,以后打开......
  • 解决Jmeter响应报文中文乱码的问题-3种解决办法
    1.遇到问题:Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码。   2.问题分析:响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析。   3.解决方案:办法一:通过后置处理器BeanShellPostProcessor 1)在线程组中添加后置处理器:Be......
  • Linux expect命令详解
    在Linux系统中,expect是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。什么是Expect命令?expect是一个用于自动化交互式进程的工具。它的主要功能是根据程序的输出模式(patterns)发送输入,从而......
  • Java之API详解之BigDecimal类的详细解析
     7BigDecimal类7.1引入首先我们来分析一下如下程序的执行结果:publicclassBigDecimalDemo01{publicstaticvoidmain(String[]args){System.out.println(0.09+0.01);}}这段代码比较简单,就是计算0.09和0.01之和,并且将其结果在控制台进行输出。那么......
  • 进程优先级详解
    Linux中采用了两种不同的优先级范围,一种是nice值,一种是实时优先级。在上一篇粗略的说了一下nice值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级。linux内核版本为linux2.6.34。进程优先级的相关信息,存放在进程描述符task_struct中:structtask_struct{......
  • 详解十大经典排序算法(二):选择排序(Selection Sort)
    算法原理选择排序通过重复选择数组中最小元素,将其与未排序部分的第一个元素交换,实现排序。算法描述选择排序是一种简单的排序算法,它每次从待排序的元素中选择最小(或最大)的元素,将其放到已排序序列的末尾,直到整个序列排序完成。选择排序的基本思想是通过不断选择剩余元素中的最小(或......
  • SMTP操作使用详解并通过python进行smtp邮件发送示例
    转载请注明出处:1.SMTP     SMTP 的全称是“SimpleMailTransferProtocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服......
  • 学习C语言必备的基础知识详解
    (⽬录)前言学习C语言的第一步,肯定是要先去学习了解一下相关的概念和符号,我们写的代码就是由一堆规定好的有特殊含义的符号组成的。1、数据类型C语言的数据类型细分出来会有很多种,每种数据类型占内存大小都不同,对于刚接触编程语言的人来说,确实很让人头疼。其实存在这么多的类型,......