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

Tester_谜城 · 2020年08月13日 · 最后由 Tester_谜城 回复于 2021年10月09日 · 8041 次阅读

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,这种自带的包是可以正常使用的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册