【Jmeter】BeanShell 脚本

发布时间 2023-05-17 17:11:57作者: Phoenixy

一、BeanShell

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

  BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  BeanShell是一种松散类型的脚本语言(这点和JS类似);
  BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
  BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

 

二、jmeter中有哪些beanShell

BeanShell 取样器

取样器是被当做当成线程处理

 

BeanShell 预处理程序

通过编写代码的方式更好的处理接口性能测试中的请求前置入参和后置数据的获取等等

 

BeanShell 后置处理程序

通过编写代码的方式更好的处理接口性能测试中的请求前置入参和后置数据的获取等等

 

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


BeanShell 定时器

BeanShell断言

BeanShell 监听器

 

三、BeanShell在JMeter的作用

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

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

 

四、BeanShell 常见写法

 通过${}可以直接调用

1、在Beanshell面板直接写脚本

String a = vars.get("a");
String b = vars.get("b");

log.info("打印变量a=" + a);
log.info("打印变量b=" + b);

String new_b = "update_b_" + b;
vars.put("b", new_b);
log.info("修改后的b值:" + vars.get("b"))

 

执行结果:

 

2、引用外部java源文件

public class DemoMethod{
    public static String test(String x){
        String y = ".java update_" + x;
        return y;
    }
}
DemoMethod.java

 

//引用java文件
source("Z:/DemoMethod.java");  //java文件地址 source()找指定的文件

String a=vars.get("a");
log.info("修改前的b值"+vars.get("b"));
String new_b = new DemoMethod().test(a);
vars.put("b", new_b);
log.info("修改后的b值:" + vars.get("b"))

 

执行结果:

 

3、应用class文件

编译java文件得到class文件

命令行输入:javac DemoMethod.java

      

//引用class文件
addClassPath("Z:/");  //指定class文件路径 addClassPath()找指定的路径

import DemoMethod;   //导入DemoMethod方法

String a=vars.get("a");
log.info("修改前的b值"+vars.get("b"));
String new_b = new DemoMethod().test(a);
vars.put("b",new_b);
log.info("修改后的b值:" + vars.get("b"))

 

执行结果:

 

4、引用外部jar包

命令行输入:jar cvf DemoMethod.jar DemoMethod.class

  

将jar包复制到 jmeter\lib\ext 路径下< lib\ext路径下存放引入外部的一些jar包>

  

 

需要重启下jmeter后生效

// 引用外部jar包
import DemoMethod; // 导入jar包

String a = vars.get("a");
String new_b = new DemoMethod().test(a);
log.info("修改前b:" + vars.get("b"));
vars.put("b", new_b);
log.info("修改后b:" + vars.get("b"));

 

执行结果:

 

 

五、BeanShell常用的内置对象

适用元件  

   

 

   1、log:打印日志,写入信息到jmeber.log文件;<仅输出字符串>

System.out.println("System.out.println 打印demo 练习");    //打印到jmeter.bat的windows批处理
log.info("log.info demo 练习");    // 写入信息到bin目录下的jmeber.log

System打印:

log.info打印:

   

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

常用方法:

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

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

  

  

  

   结果:

 

  3、POPS

操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。

props的全局性

结果: 

 

4、prev 获取sample返回的信息;

常用方法:
  (1) getResponseDataAsString():获取响应信息。
  (2) getResponseCode() :获取响应code。

结果:

 

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

SampleResult中的所有方法都可以通过prev.来调用 

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

  SamplerData:获取请求的url和body。

String code = prev.getSampleLabel();
log.info("获取接口请求的名称 :" + code);

String msg = prev.getSamplerData();
log.info("获取请求的url和body: " + msg);

 

执行结果: 

 

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

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

  ResponseMessage:获取msg成功是OK。

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

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

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

String code = prev.getResponseCode();
log.info("获取接口结果code :" + code);

String msg = prev.getResponseMessage();
log.info("获取msg状态: " + msg);

String data = prev.getResponseData().toString();
log.info("获取response: " + data);

String resph = prev.getResponseHeaders();
log.info("获取接口服务端返回的头部信息 :" + resph);

String reqh = prev.getResponseHeaders();
log.info("获取用户端请求的头部信息 :" + reqh);

String ctime = prev.getConnectTime().toString();
log.info("获取连接到服务器的时间:" + ctime);

String tname = prev.getThreadName();
log.info("获取线程名:" + tname);
String name="修改后的线程name";
prev.setThreadName(name); //修改线程名
log.info("修改后的线程名:" + prev.getThreadName());

 

执行结果:

 

7、Failure/FailureMessage/设置响应断言

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

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

状态码断言

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="响应数据不包含成功";
}

 

执行结果:  

 

 

 

Jmeter 常用API:https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.html