浅谈定时器之BeanShell 定时器

浅谈定时器之BeanShell 定时器

在进行性能测试和负载测试时,JMeter 提供了多种定时器来模拟用户操作间的延迟,以更贴近真实世界的场景。BeanShell 定时器是其中一种高级且灵活的定时机制,允许用户通过BeanShell脚本来自定义延时逻辑。BeanShell是一种轻量级的Java脚本引擎,可以直接在JMeter中执行Java代码片段,访问JMeter变量、函数、以及调用Java类库,从而实现复杂的延时策略。

使用场景

BeanShell定时器适用于需要动态调整延迟时间或者基于某些条件来决定延时时间的场景。例如,你可以根据前一个请求的响应数据来决定下一个请求的发送时间,或者基于变量的值来动态调整线程的等待时间。

配置步骤

  1. 添加定时器:
    ○ 打开JMeter,创建或打开一个测试计划。
    ○ 在需要添加定时器的地方(通常是某个线程组内),右键点击,选择“Add” -> “Timers” -> “BeanShell Timer”。
  2. 配置BeanShell脚本:
    ○ 在BeanShell Timer的配置界面,你可以在“Script”区域编写BeanShell脚本。
    ○ 脚本中可以使用__time()函数获取当前时间戳,或者访问JMeter变量(如${变量名})、上下文(ctx)、采样器结果(prev)等。
  3. 高级设置:
    ○ 重置解释器(Reset Interpreter):勾选此项意味着每个线程迭代都会重置BeanShell解释器,有助于内存管理但可能影响性能。
    ○ 参数(Parameters):在此处可以定义传递给脚本的参数,如果取值可以通过bsh.args[0]进行取值。

实例说明

我们编写如下脚本
在这里插入图片描述
线程组:循环次数设置为2
BeanShell 定时器:编写如下代码

long delay = 5000; // 默认延时5秒
// 假设有一个变量delayTime,根据其值动态调整延时
if (vars.get("delayTime") != null) {
    delay = Long.parseLong(vars.get("delayTime"));
}
Thread.sleep(delay); // 实现延时

此脚本首先设置了默认延时5秒,然后检查是否存在名为delayTime的变量,如果存在,则使用该变量的值作为延时时间。
运行脚本,查看JMeter日志

2024-07-01 18:43:55,808 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 2-1
2024-07-01 18:43:55,808 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 2-1
2024-07-01 18:44:00,814 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 18:44:05,820 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 18:44:05,820 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-07-01 18:44:05,821 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1

如果在BeanShell 定时器中参数一栏输入一行数据,如下
在这里插入图片描述
然后在BeanShell 定时器 Script中添加如下代码

log.info("bsh.args[0]数据为:" + bsh.args[0]);

运行脚本查看JMeter日志如下

2024-07-01 19:01:05,703 INFO o.a.j.u.BeanShellTestElement: bsh.args[0]数据为:1111,222

注意事项

● 性能影响:由于BeanShell是解释执行的,相比于预编译的Java代码,它的执行效率较低,可能影响测试的性能表现。在大规模测试中应谨慎使用。
● 资源管理:确保脚本高效且无内存泄漏,特别是在长时间运行的测试中。
● 调试:利用JMeter的日志功能可以帮助调试BeanShell脚本中的错误。

总结

BeanShell定时器为JMeter测试计划提供了高度定制化的延时选项,适合处理复杂逻辑和动态调整延迟时间的需求。然而,鉴于其潜在的性能影响,建议仅在标准定时器无法满足需求时采用,并且要确保脚本的优化以维持测试的效率与准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/762191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑录音软件哪个好?7款录制音频工具大盘点,赶快学起来!(2024)

也许你渴望提取你最喜欢的节目的背景音乐,或者你希望录制自己的声音制作教程。如果是这样,你就需要一款优秀的电脑录音软件,来帮助你捕捉任何你想要的声音,而且不会损失音质。目前市场上存在着大量的录制音频工具,面对…

nccl 04 nvidia 官方小程序

1,代码重新编辑 为了地毯式地检查结果的正确性,这里修改了代码 主要步骤为 step1: data_p指向的空间中,分别生成随机数; step2: 分别拷贝到gpu的sendbuff的显存中; step3: 通过nccl_all_reduce sum;…

什么是原始权益人?

摘要:每天学习一点金融小知识 原始权益人,在资产证券化(ABS)和公募REITs等金融产品中,指的是证券化基础资产的原始所有者,即金融产品的真正融资方。他们是按照相关规定及约定向资产支持专项计划转移其合法拥…

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…

【数据结构】计数排序等排序

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

企业软文投放为什么要选择包收录媒体?

如今这个信息时代企业想要有效的将品牌推广出去,那选择推广方式至关重要。软文投放作为一种常见的品牌推广方式,其效果往往取决于投放的媒体质量。而在众多媒体中,包收录媒体凭借其独特的优势,成为了企业软文投放的明智之选。 一…

Nuxt3 的生命周期和钩子函数(七)

title: Nuxt3 的生命周期和钩子函数(七) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:文章阐述了Nuxt3中Nitro生命周期钩子的使用,如nitro:config自定义配置、nitro:init注册构建钩子、nitro:build:be…

为什么企业应用开发,c++干不过java?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! C/C这种东西,根本…

15_软件程序设计基础

目录 嵌入式软件开发原理 宿主机和目标机 交叉编译 交叉调试 嵌入式软件开发特点和挑战 开发工具 程序设计语言基本概念 解释和编译 常见程序设计语言 程序设计语言的基本成分 编译程序基本原理 嵌入式软件开发原理 宿主机和目标机 嵌入式软件开发不同于传统软件开…

QT5:在窗口右上角显示图标

目录 一、环境与目标 二、实现逻辑(纯代码)与效果 三、参考代码 四、总结 一、环境与目标 qt版本:5.12.7 windows 11 下的 Qt Designer (已搭建) 目标:使用嵌套布局的方式将两个按钮显示在窗口右上角…

C++专业面试真题(1)学习

进程有多少种状态,如何转换 创建:一个进程启动,首先进入创建状态,需要获取系统资源创建进程管理科PCB完成资源分配。就绪态:在创建完成后,进程已经准备好,处于就绪状态,但是还未获得…

深度势能生成器(DP-GEN)入门讲解

文章目录 1.原子间相互作用1.为什么研究原子间相互作用2.研究原子间相互作用的传统方法 2.深度学习研究原子间相互作用1.深度势能平滑模型(DeepPot-se)2.Deep Potential 模型训练3.同步学习→充足采样&筛选样本 3.DP-GEN操作及运行1.DP-GEN主流程2.DP-GEN基本命令3.生成初始…

Sui创始团队在竞速环节中的快问快答

在Sui Basecamp活动期间,Sui区块链的最初贡献者在Oracle红牛赛车模拟器上展示了他们的技术能力,在驾驶圈时回答了有关Sui的问题。 Evan Cheng(又名Revvin’ Evan)在解释Mysticeti创下区块链最终性记录的同时保持着他的驾驶线路。…

【深度好文】LLMOps揭秘:AI工作流程的高效管理之道!

可以关注我的公众号:Halo咯咯 01。 概述 将大型语言模型(LLMs)的强大能力与机器学习运维(MLOps)的有序结构相结合,团队能够以更高效的方式工作,而非仅仅增加劳动强度。团队的焦点可以专注于开…

Redis分布式集群部署

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一: 实验二: 实验三: 实验四: 添加节点 自动分配槽位 提升节点为master: 实验…

Spring Security 认证流程

Spring Scurity是spring生态下用于认证和授权的框架,具有高度的灵活性和可扩展行,本节主要对Spring Security的认证过程中进行概括性的介绍,主要介绍在该过程中,会涉及到哪些组件以及每个组件所承担的职责,希望大家可以…

Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨ Java基础:方法引用 方法引用是Java 8中引入的一种新特性,它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的…

Open3D 点云的旋转与平移

目录 一、概述 1.1旋转 1.2平移 二、代码实现 2.1实现旋转 2.2实现平移 2.3组合变换 三、实现效果 3.1原始点云 3.2变换后点云 一、概述 在Open3D中,点云的旋转和平移是通过几何变换来实现的。几何变换可以应用于点云对象,使其在空间中移动或旋…

MobPush iOS端海外推送最佳实现

推送注册 在AppDelegate里进行SDK初始化&#xff08;也可以在Info.plist文件中进行AppKey&#xff0c;AppSecret的配置&#xff09;并对通知功能进行注册以及设置推送的环境和切换海外服务器等&#xff0c;参考如下步骤代码&#xff1a; <span style"background-colo…

叮!云原生虚拟数仓 PieCloudDB Database 动态包裹已送达

第一部分 PieCloudDB Database 最新动态 支持动态配置查询簇 PieCloudDB 最新内核版本 v2.14.0 新增动态配置查询簇功能。PieCloudDB 动态配置查询簇功能实现可伸缩的并行化查询&#xff0c;可提升单个查询并行使用底层资源的能力&#xff0c;同时加快查询响应速度。 动态配…