JMeter中BeanShell的使用方法和常用语法

本文介绍了BeanShell在JMeter中的优势,如何扩展功能、操作变量,以及其常用的语法和不同组件的使用示例,包括脚本编写、引入外部源码和jar包。

一、什么是BeanShell

BeanShell是由java编写的,是一个轻量级的脚本语言,也相当于一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性。

二、JMeter中用BeanShell的好处

JMeter也是由java编写的,而java运行时需要先编译,然后才可以运行,而BeanShell是一款解释器,直接可能运行源代码;

三、BeanShell在JMeter的作用

(1)对JMeter的功能的扩展;

(2)对jmeter变量的一些操作;

四、JMeter中BeanShell常用的基本语法:

   1、log:打印日志,写入信息到jmeber.log文件;

   2、SampleResult:获取SampleResult对象,能通过这个对象获取想要的信息;

   3、Response:获取Response对象,能通过这个对象获取响应信息;

   4、Failure:查看接口调使用能否成功,假如返回false是成功的,true是失败的。

   5、FailureMessage:失败信息,没有设置的时候失败信息是空的,能set这个信息。

   6、ResponseData:获取response body类型是byte[]。

   7、ResponseCode:返回接口code成功是200。

   8、ResponseMessage:获取msg成功是OK。

   9、ResponseHeaders:获取接口服务端返回的头部信息。

  10、RequestHeaders:获取用户端请求的头部信息。

  11、SampleLabel:获取接口请求的名称。

  12、SamplerData:获取请求的url和body。

  13、ctx 当前线程的上下文信息,能直接用

  14、vars即JMeterVariables,操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),常用方法:

     (1) vars.get("String key"):从jmeter中获得变量值;

     (2) vars.put("String key","String value"):将数据存到jmeter变量中;

  15、prev 获取sample返回的信息,常用方法:

     (1) getResponseDataAsString():获取响应信息。

    (2) getResponseCode() :获取响应code。

五、Jmeter中包含的BeanShell类型
    1、BeanShell前置处理器:BeanSell PreProcessor
    2、BeanShell取样器:BeanSell Sampler
    3、BeanShell后置处理器:BeanSell PostProcessor
    4、BeanShell监听器:BeanSell Listener
    5、BeanShell定时器:BeanSell Timer
    6、BeanShell断言:BeanSell断言

BeanShell前置处理器、BeanShell取样器、BeanShell后置处理器,它们之间的区别:

   1、BeanShell前置处理器、BeanShell后置处理器 比 BeanShell取样器多一个重置解释器(Reset Interpreter),意思是指:对于每一次处理是不是都要进行重置;

 2、在JMeter中BeanShell取样器是当成线程处理的,所以运行时是有一定的消耗的,而使用BeanShell前置处理器、BeanShell后置处理器总体来说比BeanShell取样器消耗低,相当于少起一个线程。

六、JMeter中BeanShell使用

1、BeanSell取样器中直接编写代码

(1)提取下图中的https的链接地址

(2)首先用正则表达式提取器来提取值,这边的正则表达式可以只提取一个值,也就是只写了一个()

(3)在BeanShell取样器输入输入源码,注意:这边一定要写参数${ABCDEF},这个值依赖于正则表达式提取数据,并且在代码中一定要写str = bsh.args[0],表示获取数组参数,如果是取变量,用vars.get("String key")

 

public static void link(){
    String IP;
    String path;
    String str;
    str = bsh.args[0];
    IP = str.substring(0,str.indexOf("/"));
    path = str.substring(str.indexOf("/")+1);
    vars.put("IP",IP);
    vars.put("path",path);        
}
link(); 

 (4)Http2请求中服务器与路径的数据依赖于BeanShell取样器中所获取的IP、path的值

(5)运行后,在察看结果树中,可以看到获取到了IP与path的值

 

(6)察看结果树中显示Http2请求数据正确

 

2、引用外部的java源码

(1)java源码,右键--Properties,查看java源码的存放路径

public class BeanShell {
 
    public static String[] beanShellMethod(String str){
        
         String[] arr = new String[2];
           
        //截取/前的字符串
            arr[0] = str.substring(0,str.indexOf("/"));
            
        //截取/后的字符串
            arr[1] = str.substring(str.indexOf("/")+1);
            
            return arr;
                                    
    }    
}

(2)BeanShell取样器中要引入java源码的存放路径,source("E:/jmeterMethod/BeanShell.java");

source("E:/jmeterMethod/BeanShell.java");
 
String str = bsh.args[0];
 
BeanShell method = new BeanShell();
 
String[] array = method.beanShellMethod(str);
 
for(int i=0;i<array.length-1;i++) {
    String IP = array[i];
    String path = array[i+1];
    vars.put("IP",IP);
        vars.put("path",path);
}

(3)Http2请求中服务器与路径的数据依赖于BeanShell取样器中所获取的IP、path的值

 

3、引入外部class文件

(1)DOS中将源码编译成class文件

(2)BeanShell取样器,引入class文件用addClassPath("相对路径或绝对路径"),还需用import导入,格式为: import 包名.类名,注意:包名一定要写上。

注意:addClassPath()是找指定的路径,source()是找指定的文件

addClassPath("F:\\java\\j\\p\\src");
 
import com.jyh.BeanShell;
 
String str = bsh.args[0];
 
BeanShell method = new BeanShell();
 
String[] array = method.beanShellMethod(str);
 
for(int i=0;i<array.length-1;i++) {
    String IP = array[i];
    String path = array[i+1];
    vars.put("IP",IP);
        vars.put("path",path);
}

(3)运行后,在察看结果树中,可以看到获取到了IP与path的值

 

4、引入外部jar包

  (1)将jar包复制到jmeter\lib\ext路径下,这个lib\ext路径下存放引入外部的一些jar包

(2)BeanShell取样器,注意一定要用import导入包

 import com.jyh.BeanShell;
 
String str = bsh.args[0];
 
BeanShell method = new BeanShell();
 
String[] array = method.beanShellMethod(str);
 
for(int i=0;i<array.length-1;i++) {
        String IP = array[i];
    String path = array[i+1];
    vars.put("IP",IP);
        vars.put("path",path);
}

(3)运行后,在察看结果树中,可以看到获取到了IP与path的值

 

 

 

 

 

 

 

### BeanShell 脚本语法详解 BeanShell 是一种完全符合 Java 语法规范的脚本语言,同时具备一些独特的语法方法,使其更加灵活。BeanShell 是用 Java 编写的,是一个小型的、免费的、可嵌入的 Java 源代码解释器,具有对象脚本语言特性,非常适合在 JMeter 中进行脚本编写调试 [^3]。 #### 基本语法 BeanShell语法与 Java 非常相似,但它也支持松散类型,这意味着变量不需要显式声明类型。例如: ```java // 声明变量 int a = 10; String b = "Hello"; // 松散类型变量 c = 20; d = "World"; // 输出变量 print(a); print(b); print(c); print(d); ``` #### 控制结构 BeanShell 支持常见的控制结构,如 `if` 语句、`for` 循环、`while` 循环等: ```java // if 语句 if (a > 5) { print("a is greater than 5"); } else { print("a is less than or equal to 5"); } // for 循环 for (i = 0; i < 5; i++) { print(i); } // while 循环 i = 0; while (i < 5) { print(i); i++; } ``` #### 函数定义 BeanShell 允许定义函数,这些函数可以接受参数并返回值: ```java // 定义函数 function add(a, b) { return a + b; } // 调用函数 result = add(5, 10); print(result); ``` #### 内置变量对象 在 JMeter使用 BeanShell 时,可以访问一些内置变量对象,这些变量对象可以帮助你更好地与 JMeter 进行交互。例如,`vars` 对象可以用来访问设置 JMeter 变量: ```java // 设置 JMeter 变量 vars.put("myVar", "Hello World"); // 获取 JMeter 变量 myVar = vars.get("myVar"); print(myVar); ``` #### 调试测试 由于 BeanShell 内置了一些特有的变量,无法在一些集成代码工具上进行调试。因此,在编写调试 BeanShell 脚本时,通常需要直接在 JMeter 中进行测试 [^2]。 #### 示例:使用 BeanShell 预处理器 在 JMeter 中,可以使用 BeanShell 预处理器来修改请求参数。例如,可以在 HTTP 请求采样器之前添加一个 BeanShell 预处理器,以动态生成请求参数: ```java // 生成动态参数 currentDate = new Date(); vars.put("timestamp", currentDate.getTime() + ""); ``` 然后在 HTTP 请求采样器中使用 `${timestamp}` 来引用这个动态生成的参数。 ### 相关问题 1. 如何在 JMeter使用 BeanShell 脚本进行参数化? 2. BeanShell 脚本中如何处理异常错误? 3. 如何在 JMeter 中调试 BeanShell 脚本? 4. BeanShell 脚本中如何调用外部 Java 类方法? 5. BeanShell 脚本中如何处理 JSON 数据?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值