Jmeter BeanShell 的用法大全(JSR223通用)

JMeter JSR223后置处理器:JSON数据处理与格式转换实战指南 本文介绍了在JMeter性能测试中使用JSR223后置处理器处理JSON数据格式转换的解决方案。针对二维数组凭证数据需要转换为特定格式的需求,详细阐述了数据获取、解析、转换的完整流程,重点解决了中文字符被自动转义为Unicode编码的问题。通过Groovy脚本实现了数据结构重组,并采用正则表达式匹配转换Unicode字符。文章还提供了性能优化建议、错误处理方法和调试技巧,包含完整的优化脚本示例,为JMeter测试中的复杂JSON数据处理提供了实用模板。 阅读详情

Bean shell 内置函数

1. 什么是Bean Shell?

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

2. Jmeter有哪些Bean Shell?

  • 定时器:  BeanShell Timer
  • 前置处理器:BeanShell PreProcessor
  • 采样器:  BeanShell Sampler
  • 后置处理器:BeanShell PostProcessor
  • 断言:   BeanShell 断言
  • 监听器:  BeanShell Listener

3. Bean Shell 内置变量

1. log

简述: 打印日志,并写入信息到 jmeber.log 文件

使用方法:

  • log.info(“这是我想要输出的日志内容”)
  • log.error(“这是一个错误日志”)

GUI 界面开始日志查看:
在这里插入图片描述

2. ctx

简述:

  • 该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext
  • ctx 变量是JMeter JSR223功能最强大的内置变量之一
  • 通过它可以轻松的访问当前线程的上下文
  • 在 JMeter 内部,ctx 映射为 org.apache.jmeter.threads 的 JMeterContext 类
  • 由于JMeterContext 不具有线程安全性,故仅适用于在单线程中使用
  • 官方文档: https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html

使用方法:

  1. 获取当前jmeter线程的所有变量 【getVariables】

    vars.put("name", "bingtang");
    ctx.getVariables().get("name");
    
  2. 获取jmeter的内置属性值(jmeter的内置属性可在jmeter.properties中了解详情) 【getProperties】

    p = ctx.getProperties().getProperty("sampleresult.default.encoding");
    log.info("sampleresult.default.encoding is " + pv)
    

    在这里插入图片描述
    在这里插入图片描述

  3. 获取前一个取样器的结果 【getPreviousResult】

    import org.apache.jmeter.samplers.SampleResult;
    SampleResult rsp = ctx.getPreviousResult();
    String rh = rsp.getResponseDataAsString();
    log.info('\n' + rh);
    

    在这里插入图片描述

  4. 获取取样器的对象 【getCurrentSampler】

    cname = ctx.getCurrentSampler().getName();
    log.info("当前的cname是: " + cname)
    

    在这里插入图片描述

  5. 获取当前线程组下的线程编号(编号从0开始) 【getThreadNum】

    tn = ctx.getThreadNum();
    log.info("线程号: " + tn)
    

    在这里插入图片描述

3. vars

简述:

  • 操作 JMeter 变量,这个变量实际引用了 JMeter 线程中的局部变量容器(本质上是Map),它是测试用例与 BeanShell 交互的桥梁,更多方法可参考:org.apache.jmeter.threads.JMeterVariables

  • vars 是最常用的JMeter变量之一

  • 在 JMeter 内部,映射 org.apache.jmeter.threads 的 JMeterVariables 类

  • vars 提供了对当前线程变量的读写能力

  • 所有的 JMeter 变量都是 java字符串

  • 如果你需要把数据存放到一个 JMeter 变量中,需要先将它转换成字符串

  • 官方文档:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html

使用方法:

  1. 获取线程名 【getThreadName】

  2. 获取迭代号 【getIteration】

  3. 创建/更新变量 【put】

    // 赋值
    vars.put("name","bingtang");
    vars.put("age","18");  // 传字符串
    // 获取
    name = vars.get("name");
    age = vars.get("age");
    // 打印
    log.info("name is : " + name);
    log.info("age is : " + age);
    
    // 修改
    vars.put("name", "qingtian");
    name = vars.get("name")
    log.info("name is :" + name);
    
  4. 获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null 【get】

    vars.put(“name”, “bingtang”)
    name = vars.get(“name”)  // 取出name的值转为字符串存在name变量中
    
  5. 创建或更新一个非字符串变量。key变量名,value变量值 【putObject】

    推荐使用JSR233,不知道是beanshell不支持语法还是,beanshell会报错

    	vars.putObject("number",3.14);
    	vars.putObject("list1",[1,2,3,4]);
    	vars.putObject("array1",[4,3,2,1] as int[]);
    	vars.putObject("map1",["name":"bingtang", "age": 18]);
    	log.info("数字是: " + vars.getObject("number").toString());
    	log.info("列表是: " + vars.getObject("list1"));
    	log.info("数组是: " + vars.getObject("array1"));
    	log.info("字典是: " + vars.getObject("map1").get("name"))
    

    在这里插入图片描述

  6. 获取变量的值(不转换为字符串)。若变量不存在则返回null 【getObject】

  7. 删除一个变量,并返回变量的值,若变量不存在则返回 null 【remove】

    vars.remove(‘name’)

4. props

简述:

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

  • props 映射 java.util 的 Properties 类
  • 与 vars 作用大致相同,区别的是 vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作
  • vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行
  • vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object
  • java.util.Properties 这个类是线程安全的;多个线程可以共享一个 Properties 对象,而不需要外部同步
  • 官方文档: https://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Properties.html

使用方法:

  1. 设置属性值和获取属性值 【setProperty】 【getProperty】

    用指定的键在此属性列表中搜索属性,如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null
    操作文件指向:jmeter.properties

    props.setProperty("test", "csinfo")
    vtest = props.getProperty("test")
    log.info("vtest的值是: " + vtest)
    

    在这里插入图片描述

  2. 返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键 【propertyNames】
    在这里插入图片描述

5. prev(SampleResult)

简述:
获取前面的 Sampler 返回的信息,更多方法可参考:org.apache.jmeter.samplers.SampleResult

使用方法:

  1. 获取响应状态码 【 getResponseCode】
    sc = prev.getResponseCode();

  2. 判断响应状态码是否为OK对应的状态码(200) 【isResponseCodeOK()】
    yn = prev.isResponseCodeOK()
    返回True或者False

  3. 获取线程名 【getThreadName()】
    tname = prev.getThreadName()

  4. 获取取样器响应Content-Type首部字段的值域(包含参数) 【getContentType()】
    ct = prev.getContentType()

  5. 请求报文大小 【getSentBytes()】
    sb = prev.getSentBytes()

  6. 响应报文大小 【getBytesAsLong()】
    rb = prev.getBytesAsLong()

  7. 获取延迟时间 【getLatency()】

  8. 获取连接时间 【getConnectTime()】

  9. 获取取样器URL 【getURL()】

  10. 响应正文大小 【getBodySizeAsLong()】

    sc = prev.getResponseCode();  // 响应状态码
    yn = prev.isResponseCodeOK();  // 响应状态码是否为200 返回True或者False
    tname = prev.getThreadName();  // 当前的线程名
    ct = prev.getContentType();  // 连接类型
    sb = prev.getSentBytes();  // 请求报文大小
    rb = prev.getBytesAsLong();  // 响应报文大小
    db = prev.getLatency();  // 延迟时间
    cont = prev.getConnectTime();  // 连接时间
    url = prev.getURL();  // 取样器的URL
    rsb = prev.getBodySizeAsLong();  // 响应正文大小
    
    log.info("响应状态码:" + sc)
    log.info("响应状态码是否为200: " + yn)
    log.info("线程名: " + tname)
    log.info("连接类型:" + ct)
    log.info("请求报文大小: " + sb)
    log.info("响应报文大小: " +rb)
    log.info("延迟时间: " + db)
    log.info("连接时间: "+ cont)
    log.info("取样器的URL: " + url)
    log.info("响应正文大小: " + rsb)
    	```
    

在这里插入图片描述

总结:

  1. 按需使用,常用的一般使用到的是log、vars、prev等相应功能
  2. 推荐使用JSR233 ,原因是更好的性能,还有些java的语法解析似乎beanshell没有带导致运行可能会报错
灵活应对高并发:JMeter 中的 BeanShell 与 JSR223 预处理器多线程安全递增操作指南 在JMeter进行性能测试时,使用BeanShell预处理器来增加测试的灵活性和动态性是一种常见的做法。本文介绍其中的一个场景:如何在多线程环境下安全地对一个全局变量进行递减操作,并将每个线程对应的值记录下来,用于后续的请求。 阅读详情

相关推荐

2.3 Jmeter应用进阶二--实际应用 后置处理器JSR223 PreProcessor获取json数据参数

Jmeter应用时会遇到一些请求的参数来源于上一个请求,这里就需要从上一个请求读取数据并储存成参数,赋值到下一个请求中 这种做法叫做:动态数据关联 下面是使用JSR223 PreProcessor从请求响应中读取数据存储参数。 请求的响应代码: { "msg":"操作成功", "currentTime":1576649179627, ...

fen_fen的专栏 4263

Jmeter之Bean shell使用

转载地址:http://www.cnblogs.com/puresoul/p/4915350.html 一、什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java

可口可乐的博客 1万+

Jmeter中的BeanShell如何使用?

在JMeter中,BeanShell 是一种基于Java语法的脚本工具,可以通过编写脚本实现动态逻辑处理、变量操作、条件判断等功能。对于高性能需求,建议迁移到 JSR223 Sampler + Groovy(语法类似Java,但编译执行,效率更高)。(2) 编写脚本:在脚本编辑区直接编写Java语法代码,支持操作JMeter变量、属性和响应数据。场景3:条件断言(BeanShell Assertion)场景2:提取响应数据(PostProcessor)场景1:动态生成变量(PreProcessor)

hellen_cuicui的博客 1725

JMeter接口自动化测试实例—JMeter引用javaScript

但在这里我就简单的应用javaScript生成当前时间来做为例子,看如何在JMeter中使用JavaScript脚本的。整个实例就是为了演示在JSR223 PreProcessor中生成HTTP请求的一个入参,然后得到响应后,可以通过JSON Extractor取出指定想到的信息,再通过BeanShell Assertion进行简单的校验断言,如果一直没有问题,再发起一个HTTP请求,其中的一个参数就是上一个HTTP请求响应解析入来的值。接下来的HTTP请求,有用来前面设置的变量和响应解析出来的变量。

2301_76643199的博客 1406

JMeter:BeanShell到JSR223迁移中的注意事项

在JSR223中推荐使用vars.get(“key”)的方式使用变量,而非${key}的方式。

l_q_l的专栏 1807

JMeter:BeanShell向JSR223迁移过程遭遇的java标准库不可用问题-如何切换JDK版本

JSR223全称为Java Specification Request 223。其中JSR(Java Specification Request)是Java规范提案中的缩写,而JSR223是其中的一个提案,旨在将脚本语言集成到Java平台之上。所以,相比于BeanShell解释器,它支持更多的脚本语言:groovy、beanshell(java)、javascript、jexl和jexl2等。JSR223 PreProcessor:在执行取样器之前运行JSR223脚本代码的前置处理器。

l_q_l的专栏 1296

JMeter 中 BeanShell Sampler 和 JSR223 Sampler 大揭秘

总的来说呢,JSR223 Sampler(特别是和 Groovy 一起用)在大多数情况下都比 BeanShell Sampler 厉害。所以啊,宝子们要是开始一个新的性能测试项目,或者要处理复杂的脚本,那就选 JSR223 Sampler(Groovy),准没错。当然啦,如果是一些老系统,之前一直用 BeanShell Sampler,而且也没啥大问题,那暂时继续用也可以。但要是想让测试效果更好,还是建议慢慢迁移到 JSR223 Sampler(Groovy)上来哦。

测试指南 1576

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习等领域。本文将介绍OpenCV中的一些基础功能,包括如何绘制图形、创建图像金字塔以及如何处理感兴趣区域(ROI)。

吾家有猫名探花的博客 1962

Jmeter取样器之JSR223取样器详解-7

JSR223取样器允许执行JSR223脚本代码用于创建/更新所需的某些变量。 相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译),同时支持更多的脚本语言,其中包括BeanShell脚本,所以在编写脚本时不建议使用BeanShell 取样器,也不再对BeanShell 取样器进行讲述,如果需要,使用JSR223取样器编写脚本是更好的选择。 属性描述 名称:显示的此取样器的描述性名称,可自定义 语言:要使用的JSR223脚本语言的类型 参数:要传递到脚本文件或脚本的参数列表

谜城的博客 1万+

施耐德EcoStruxure平台深度体验:IEC 61499在智慧物流中心的真实应用案例解析

本文深度解析施耐德EcoStruxure平台在智慧物流中心的应用,重点探讨IEC 61499标准如何通过分布式控制和功能块技术重构自动化逻辑。通过上海某物流中心的真实案例,展示了该平台在提升系统弹性、降低停机成本方面的显著成效,为工业自动化转型提供实践参考。

weixin_30576827的博客 66

从芯片原厂到BSP工程师:技术转型与核心能力解析

嵌入式系统开发中,BSP(板级支持包)作为连接硬件与操作系统的关键层,其开发能力直接影响设备稳定性与性能。理解Linux内核架构(如内存管理、进程调度)和基础接口协议(I2C/SPI/USB)是BSP工程师的核心技能。在芯片验证与驱动开发场景中,多核异构系统调试与稳定性问题排查(如死机分析)展现了工程师的实战能力。随着物联网与智能设备发展,掌握从硬件适配到系统优化的全链路技术栈,成为职业发展的关键突破点。

weixin_36012152的博客 599

jsr223 java_Jmeter 组件 JSR223 使用详解

JSR223 控件简介JSR223 控件允许执行 JSR223 脚本代码用于创建/更新所需的某些变量。包括 JSR223 取样器、JSR223 前置处理器、JSR223 后置处理器、JSR223 断言、JSR223 定时器以及 JSR223 监听器相比于 BeanShell 取样器,JSR223 取样器 +groovy 脚本具有可大大提高性能的功能(编译),同时支持更多的脚本语言,其中包括 Bea...

weixin_33711795的博客 4268

C语言—for循环打印矩形,正三角形,倒三角形,九九乘法,等腰三角形,倒着的等腰三角形(简易版代码)(重点考察for循环嵌套)

本章节教大家如何利用for循环打印正三角形,倒三角形,九九乘法表及等腰三角形(简易版代码)说明:1、循环语句的循环体内又包含另一个完整的循环结构,称为循环结构的嵌套。内嵌的循环语句中还可以再嵌套循环结构,这样就形成多重循环结构的嵌套。2、for 语句、while 语句和 do-while 语句都允许嵌套。三种循环语句可以相互嵌套。3、内层的循环语句必须完全被包含在外层的循环体中,不能发生交叉。

m0_63501145的博客 1695

一文告诉您JMeter中的JSR223究竟是个什么东东

‌JSR223(Java Specification Request 223)是Java提供的一种统一的API,允许开发者在Java应用程序中嵌入多种脚本语言。这一标准为在Java平台上嵌入和执行脚本语言提供了一个框架,使得Java应用程序能够灵活地与各种脚本语言进行交互,从而实现动态编程。JSR223支持的脚本语言包括JavaScript、Groovy、Ruby、Python等。

liwenxiang629的博客 1490

实战篇【2】-H3C防火墙开局基础配置

本篇文章为“H3C防火墙开局基础配置”,主要涵盖配置管理地址、聚合端口、安全区域、安全策略、静态路由、ACL,WEB和SSH远程管理、Console、SNMP、NTP时钟、日志主机等内容,对比交换机配置开局,增加两处配置,安全区域和安全策略。方便调试人员远程管理、调试。

weixin_47402139的博客 1万+

YOLO11改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】

yolo11,yolo11改进,yolo11创新,yolo11添加注意力机制

kay_545 1229

JMeter脚本的Beanshell和JSR223和Java原生请求的对比

前言 结合之前一篇介绍JMeter测试Kafka的文章,遇到了JSR223,Beanshell等概念,这篇文章有讲解,转帖出来。 正文 Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! There are several options to perform ...

IT老兵的驿站 3528

【推荐100个unity插件之24】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

【推荐100个unity插件之23】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1683

JSR223 PostProcessor和BeanShell PostProcessor

一、使用JSR223 PostProcessor在一个线程组中的参数传递 接口的响应直接返回一个字符串,并且别的接口需要依赖这个字符串。试了好几种方法都不行,正则表达式的提取全部试了一遍没有将响应值提取出来,最后终于通过使用JSR223 PostProcessor处理好了,记录一下过程。 getuuid接口的返回信息直接返回了uuid的字符串信息;正则表达式的提取不知道怎么提取...

grily5的博客 2718

使用再生龙备份还原liunx系统(精确每一步)

再生龙镜像可自行到官网下载(ISO/ZIP格式均可),然后使用tuxboot烧录工具制作启动盘,另外准备一个U盘用来存储备份的镜像文件,即再生龙盘和存储盘是两个分开的。当然也可以用分区工具把同一个硬盘分区来使用,比较方便,先学会基本的吧,只是告诉有个捷径,省个U盘。

米可的博客! 8366

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jmeter-13-使用JSR223断言(推荐)

之前都在使用 BeanShell 前后置、断言等,但是查看官方文档时发现推荐使用 JSR223 其实 BeanShell 是 JSR223 里面的一种,下面我们继续了解下。翻译:强烈建议迁移到JSR223 Assertion+Groovy,以提高性能,支持新的Java功能以及对BeanShell库的有限维护。通过了解 JSR223 是 Jmeter 可提供多种脚本语言实现你想实现的功能,如下图可选择的脚本语言之多,当然还有其它例如python等上述写法虽看似简单,但是够用就好!

有话好好说vx:GoGsxl 2747

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jsr223 java_JMeter脚本的Beanshell和JSR223和Java原生请求的对比

前言结合之前一篇介绍JMeter测试Kafka的文章,遇到了JSR223,Beanshell等概念,这篇文章有讲解,转帖出来。正文Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!There are several options to perform custom J...

weixin_35531735的博客 463

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JMeter(十三)-JMeter前置处理器

前置处理器是在发出“取样器请求”之前执行一些操作。如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行。前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取的变量。前置处理器主要是用来处理请求前的一些准备工作,比如参数设置、环境变量设置等等。

weixin_62883488的博客 3739

jsr223 java_Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!

有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能。查看最流行的扩展机制,比较性能并分析哪一个是最好的。这是乐队之战,JMeter风格。Beanshell V. JSR223 V. Java Request Sampler在我们之前的帖子中,JMeter Performance和Tuning Tips(由fantastik Philipe Mouwad编写)我们建议使用JSR ...

weixin_42312133的博客 475
上一篇: jmeter获取响应体内容并正则匹配所需内容
下一篇: 使用 stress 和 sysstat 分析平均负载过高的场景
晴时初遇雨
博客等级 码龄7年 1253粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值