JMeter 里面有几个用到 Beanshell 的地方,这里作统一介绍。

  • Beanshell Sampler – 一个独立的 Beanshell 请求
  • Beanshell PreProcessor – sample 的一个预处理装置,在 sample 之前执行,可用来作为执行的先决条件(例如产生某些输入)
  • Beanshell PostProcessor – 在 sample 之后再执行的一个提交处理器,可用来恢复数据或清除数据
  • Beanshell Assertion – 一个访问 JMeter API 的后期断言装置,Java 的逻辑可以被用来设置这个断言的结果
  • __Beanshell Function – 允许在 sample 执行期间,客户自定义 Beanshell 代码的 JMeter 函数

下面说明会经常使用的 Beanshell 语法:

假设你有个自定义的变量 id,想给这变量重新赋值,那么你可以使用 vars 操作相关变量

获取变量:vars.get("id");

给变量赋值:vars.put("id","J_123456");

如果你想对 JMeter 内部属性进行重新赋值,那么可以用 props

它的使用方法与 vars 类似,但是只能 put 进去 String 类型的值,而不能是一个对象。对应于 java.util.Properties

例:props.get("START.HMS"); 获取线程启动时间

props.get("sampleresult.default.encoding"); 获取默认编码

props.put("sampleresult.default.encoding","gb2312"); 重新给编码格式赋值

prev — JMeter 内置对象【获取前面的 sample 返回的信息】

prev.getResponseDataAsString(); // 获取前一个请求返回的响应数据

getResponseCode(); // 获取响应 code 2××,3××...

小例子

获取前一个请求的结果,得到具体某个返回参数的值,判断是否和预期一致。

访问接口:http://p.3.cn//prices/mgets?skuIds=J_123456&type=1

结果:[{"cbf":"0","id":"J_123456","l":"1999.00","m":"238.00","op":"189.00","p":"-1.00"}]

要取其中的 op 的值,这里是 189.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data = prev.getResponseDataAsString(); // 获取前一个请求结果
data = data.replace("[","").replace("{","").replace("}","").replace("]","").replace("\"",""); // 去掉多余字符
String[] arr = data.split(","); // 分割字符串,组成数组
String value = "";
for(int i=0; i<arr.length; i++){
String[] data = arr[i].split(":");
if(data[0].equals("op")){ // 获取具体参数的值
value = data[1];
break;
}
}
// 如果和预期不一致,那么提示失败,或作其他操作,后面自行展开
String op = vars.get("op"); // 取出设置的一个预期值
if(value.equals(op)){
System.out.println("yes!");
}

ctx — JMeter 内置对象

1
2
3
4
5
6
7
import org.apache.jmeter.samplers.SampleResult;

SampleResult result = ctx.getPreviousResult(); // 获取返回响应数据
String RequestHeaders = result.getRequestHeaders(); // getRequestHeaders() 方法返回 String 字符串
String ResponseHeaders = result.getResponseHeaders(); // getResponseHeaders() 返回响应 headers
String responseCode = result.getResponseCode(); // getResponseCode() 返回响应状态码字符串
URL url = result.getURL(); // getURL() 返回请求 URL 对象

Beanshell 对数组去重

1
2
3
4
5
6
7
8
9
10
11
12
13
String[] list = new String[]{"111","222","333","444","111"};

for(int i=0; i<list.length; i++){
for(int j=i+1; j<list.length; j++){
if(list[i]==list[j]){
list[j] = null;
break;
}
}
if(list[i] != null){
System.out.println(list[i]);
}
}

打印二维数组

1
2
3
4
5
6
7
String[][] list1 = new String[][]{{"1","A"},{"2","B"},{"3","C"}};

for(String[] string:list1){
for(int i=0; i<string.length; i++){
System.out.println(string[i]);
}
}

自定义函数

引入外部自定义 Java 文件

首先定义一个 Java 文件:

imgimg

引入外部 class 文件

.java 是 Java 的源文件后缀,里面存放程序员编写的功能代码。

.class 文件是字节码文件,由 .java 源文件通过 javac 命令编译后生成的文件。是可以运行在任何支持 Java 虚拟机的硬件平台和操作系统上的二进制文件。

.class 文件并不是本地的可执行程序。Java 虚拟机就是去运行 .class 文件从而实现程序的运行。

我们这里把 count.java 直接编译成 count.class:使用 javac 命令。

imgimg

引用外部 jar 包

如果 Java 文件很多的时候,打成个 jar 包怎么导入使用呢?

第一步:需要 export 你的项目,形成 ***.jar 这样的 jar 包。

第二步:引入 jar 包(这里介绍 3 种方式)

(1)将打好的 jar 包放到 JMeter 放置外部 jar 包的文件夹下:C:\Program Files\apache-jmeter-3.0\lib\ext,Beanshell 里 import 即可。(记得重启 JMeter)

(2)测试计划里面添加 jar 包地址

(3)jmeter.properties 文件里添加个外部 jar 包的存放地址(推荐)

修改属性 plugin_dependency_paths:在后面添加绝对地址/相对地址,分号分隔(重启 JMeter)

最后一步:Beanshell 里导入 jar 路径,使用

imgimg

备注

Beanshell 里使用 log 查看详细日志定位 bug

需要先勾选 选项 -> log viewer。

JMeter 中设置基本参数

1
2
3
4
5
6
7
8
// 响应代码
ResponseCode = 400;
// 设置响应信息
ResponseMessage = "qweqwe";
// 设置是否成功
IsSuccess = false;
// 设置响应数据
SampleResult.setResponseData("hello full");

imgimg

JMeter 内置的一些函数

下面简单介绍 JMeter 内置的一些函数,使用方法:

__javaScript

(1)随机数

随机 0 到 9 的整数:${__javaScript(Math.floor(Math.random()*(10)))}

(2)时间

当前时间:${__javaScript(new Date())}

(3)截取字符串

截取字符串,截取第 7 位至第 10 位之间的字符串:${__javaScript("123456789123".slice(7\,10))}

(4)截取字符串并赋值给另外一个变量 mystring${__javaScript("123456789123".slice(7\,10),mystring)}

(5)比较字符串是否相等,返回 true/false 赋给某个值

${__javaScript("${sp}"=="abcd",MYRESULT)} // 比较变量 sp 是否等于 abcd,把结果赋给 MYRESULT

__V 用法

场景:有 3 个变量(或者更多),假如想循环去取 A1、A2、A3 变量的值。