首页 JMeter中BeanShell的使用方法和常用语法
文章
取消

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

一、什么是BeanShell

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

二、JMeter中用BeanShell的好处

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

三、BeanShell在JMeter的作用

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1、log:打印日志,写入信息到jmeter.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
2
3
4
5
6
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有一些默认的内置变量和方法,用户可以通过这些变量与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上下文

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

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

图1

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

六、JMeter中BeanShell使用

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

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

图2

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

图3

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

图4

1
2
3
4
5
6
7
8
9
10
11
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取样器中所获取的IPpath的值

图5

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

图6

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

图7

2、引用外部的java源码

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

图8

1
2
3
4
5
6
7
8
9
10
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");

图9

1
2
3
4
5
6
7
8
9
10
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的值

图10

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

图11

3、引入外部class文件

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

图12

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

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

图13

1
2
3
4
5
6
7
8
9
10
11
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的值

图14

4、引入外部jar包

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

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

图15

1
2
3
4
5
6
7
8
9
10
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的值

图16

本文由作者按照 CC BY 4.0 进行授权

RPC与Http的区别

接口测试理论