性能测试工具 Jmeter 组件 JSR223 使用详解

Tester_谜城 · August 13, 2020 · Last by Tester_谜城 replied at October 09, 2021 · 6188 hits

JSR223 控件简介

JSR223 控件允许执行 JSR223 脚本代码用于创建/更新所需的某些变量。
包括 JSR223 取样器、JSR223 前置处理器、JSR223 后置处理器、JSR223 断言、JSR223 定时器以及 JSR223 监听器

相比于 BeanShell 取样器,JSR223 取样器 +groovy 脚本具有可大大提高性能的功能(编译),同时支持更多的脚本语言,其中包括 BeanShell 脚本,所以在编写脚本时不建议使用 BeanShell 取样器,如果需要,使用 JSR223 取样器编写脚本是更好的选择。

由于本人只了解 JAVA,所以以下脚本说明,均基于 JSR223+groovy 的 java 语法编写进行,其他语言脚本我也不懂,请自行参阅。

在这里插入图片描述
属性描述
名称:显示的此取样器的描述性名称,可自定义
语言:要使用的 JSR223 脚本语言的类型
参数:要传递到脚本文件或脚本的参数列表
脚本文件:用于执行的脚本文件,若没有脚本文件,将执行脚本
脚本:传递给 JSR223 执行的脚本

如果提供了脚本文件,则执行脚本文件,否则执行脚本。

JSR223 用法详解

1、调用内置函数

在这里插入图片描述

获取返回数据并转换为 String 字符串
String Responsedata = prev.getResponseDataAsString();
if(Responsedata.contains("百度一下,你就知道")){
//如果参数为 true,则样本执行判断为成功,为 false,则设置样本失败
prev.setSuccessful(true);
}else{
prev.setSuccessful(false);
}

获取返回数据并保存为字节数组对象,适用于保存返回数据至本地(如下载文件等操作)
import java.io.*;
byte[] bytes = prev.getResponseData();
String file_path = "F:/download/test.html";
File file = new File(file_path);
FileOutputStream out = new FileOutputStream(file);
out.write(bytes);
out.close();

prev.getResponseDataAsString() 与 prev.getResponseData() 都是获取 Response Body 的内容,只是返回的数据类型不同,prev.getResponseDataAsString() 返回 String 字符串,prev.getResponseData() 返回 byte[] 字节数组,使用时可根据实际需要对返回数据进行处理。
在这里插入图片描述

获取请求头信息
String headers = prev.getRequestHeaders() ;
在这里插入图片描述

获取请求返回的 code
String code = prev.getResponseCode() ;
获取响应信息
String responsesmessage = prev.getResponseMessage() ;
在这里插入图片描述

获取响应头信息
String responsesheader= prev.getResponseHeaders() ;
在这里插入图片描述

//获取请求 URL
URL url = prev.getURL() ;
String url1 = prev.getUrlAsString();
在这里插入图片描述

设置响应信息 Response message
prev.setResponseMessage("这是响应信息");
设置响应代码 Response code
prev.setResponseCode("404");

注意:在 beanshell 脚本中可直接使用
ResponseMessage="这是响应信息";
ResponseCode="404";
IsSuccess="false";
但是在 JSR223 中不能用,而只能使用 prev.set 的方法
在这里插入图片描述

打印日志 ,日志会保存在 bin 目录下的 jmeter.log 文件中
默认支持级别为 info 及以上,debug 级别日志由于太多,默认不支持
log.error("This is error message");

OUT 功能等同于 System.out,将在 Jmeter 工作台输出信息
OUT.println("此消息将被输出到 Jmeter 控制台");
在这里插入图片描述

设置属性与调用属性
${__setProperty(test1,property1,)};
props.put("test2","property2");
String test1 =props.get("test1");
String test2 = props.get("test2");

属性是所有线程公有的,需要注意的是,在 JSR223 或 BeanShell 中使用 props.put(” name”,” value”)创建的属性,不能直接在当前 JSR223 或 BeanShell 中使用 ${__P(name,)}或 ${__property(name,,)}进行调用,如果需要在当前 JSR223 或 BeanShell 中调用,需要使用 props.get("name") 方法。此处的 name 是属性名称,而不是随机的字符串。

定义变量与调用变量
此处的 name 是在用户定义的变量中定义的变量,已赋值为 lucy
String test5 = vars.get("name");
//定义变量值,并获取
vars.put("name2","jack");
String test6 = vars.get("name2");

通过 vars.put(“name”,” value”) 方式定义的变量作用域限制为当前线程组,如果要跨线程调用,请使用属性定义,与 props.put(” name”,” value”)同样的,vars.put(“name”,” value”) 创建的变量,也不能直接在当前 JSR223 或 BeanShell 中使用 ${name}进行调用,而是使用 vars.get("name") 方法。

2、执行外部 java 文件

新建一个 Java 文件,添加如下代码

public class AddTest {
public int add(int a ,int b){
return a+b ;
}
}

然后在 JSR223 中引入源文件并执行,执行方法与 JAVA 本身的方法一致
//引入源文件
source("F:/apache-jmeter-5.3/TestPlan/AddTest.java");
AddTest add = new AddTest();
int sum = add.add(15,20);
log.info("sum is : " + sum);
执行结果如下:
在这里插入图片描述

3、执行 jar 包

JSR223 可调用外部 jar 包,也可以调用 Jmeter 提供的内部 jar 包,通常将我们写的代码打包成 jar 包后,有两种方法可以引入 jar 包,Jar 包方法调用与 JAVA 语法一致。
1、将 jar 包放到 Jmeter 安装目录的\lib\ext 目录下
2、在测试计划中导入
在这里插入图片描述

调用 Jmeter 内置 MD5 加密
import org.apache.commons.codec.digest.DigestUtils;
String password = DigestUtils.md5Hex("password");
vars.put("password",password.toUpperCase());

调用外部 jar
AddTest add = new AddTest();
int sum = add.add(15,10);
log.info("sum is : " + sum);
在这里插入图片描述

共收到 4 条回复 时间 点赞

请问 props.put 与 vars.put 一样的吗 平时只有用到了 vars.put

KillerJiang 回复

props.put 设置属性,vars.put 设置变量
两者作用域不同,属性设置后可以跨线程组调用,变量设置后只能在本线程组调用
属性与变量的调用方式也不一样,文章里有写

如何在 jsr223 中使用正则相关的包呢,我直接 import java.util.regex.Matcher 好像不行

mzy 回复

引入 java.util.regex.Pattern 了吗,Jmeter 依赖 JDK,这种自带的包是可以正常使用的

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up