当前位置: 首页 > news >正文

jmeter 获取唯一全局变量及多线程读写的问题

一、jmeter 获取唯一ID号全局变量

在JMeter中获取唯一ID号并设置为全局变量,可以通过以下几种方法实现:

  1. 使用JMeter内置的UUID函数: JMeter提供了一个内置的函数__UUID,可以生成一个随机的UUID,这个UUID是全局唯一的。你可以在需要的地方直接使用${__UUID}来获取一个唯一的ID号。

  2. 使用BeanShell Sampler生成UUID: 如果你需要更多的自定义或者想要在生成UUID后进行一些额外的操作,可以使用BeanShell Sampler来编写Java代码生成UUID。例如:

     

    java

    import java.util.UUID;
    UUID uuid1 = UUID.randomUUID();
    vars.put("uniqueID", (uuid1.toString()).replaceAll("-",""));

    这段代码会生成一个UUID,并去除其中的破折号,然后将这个值存储在名为uniqueID的变量中。你可以在其他地方通过${uniqueID}来引用这个唯一ID号。

  3. 使用计数器和用户定义的变量: 如果你需要一个简单的递增唯一ID,可以使用JMeter的计数器。在线程组中添加一个计数器配置元件(Counter),并设置一个引用名称。然后在用户定义的变量中使用这个计数器的引用名称,例如${__counter(myCounter,1,1)}。这样每次迭代都会递增这个计数器的值,从而保证唯一性。

  4. 使用正则表达式提取器和BeanShell PostProcessor: 如果你的唯一ID是从某个响应中提取的,你可以使用正则表达式提取器来提取这个ID,然后在BeanShell PostProcessor中使用__setProperty函数将其设置为全局变量。例如:

     

    java

    String uniqueID = vars.get("extractedID");
    vars.put("globalUniqueID", uniqueID);

    这样你就可以在其他地方通过${globalUniqueID}来引用这个全局唯一的ID号。

选择以上任何一种方法,都可以在JMeter中获取并使用唯一ID号作为全局变量。根据你的具体需求和测试场景,选择最适合你的方法。

二、如何确保JMeter中的全局变量在不同线程组中保持一致?

在JMeter中,确保全局变量在不同线程组中保持一致,可以通过以下步骤实现:

  1. 设置全局变量: 在一个线程组中,使用BeanShell或JSR223元件来设置全局变量。例如,使用JSR223 PreProcessor,可以通过以下Groovy代码将一个局部变量的值设置为全局变量(Property):

     

    groovy

    // 获取局部变量值
    String localVar = vars.get("localVarName");
    log.info("Local variable value: " + localVar);
    // 在第一个线程组中设置全局变量
    props.put("globalVarName", localVar);
    log.info("Global variable set to: " + props.get("globalVarName"));

    这里,localVarName是线程组内的局部变量,globalVarName是设置的全局变量名。

  2. 获取全局变量: 在另一个线程组中,可以通过类似的代码来获取之前设置的全局变量(Property):

     

    groovy

    // 在第二个线程组中获取全局变量
    String globalVar = props.get("globalVarName");
    log.info("Global variable value: " + globalVar);
    // 将全局变量的值赋给本线程组的局部变量
    vars.put("localVarName", globalVar);

    这样,第二个线程组就可以使用第一个线程组设置的全局变量值。

  3. 使用__setProperty函数: 你还可以使用JMeter的函数__setProperty来设置全局变量,并在其他线程组中通过${__property(变量名)}来引用这个全局变量。例如,在第一个线程组中设置全局变量:

     

    java

    ${__setProperty(globalVarName, localVarValue,)}

    然后在其他线程组中引用这个全局变量:

     

    java

    ${__property(globalVarName,)}
  4. 使用BeanShell PostProcessorBeanShell Sampler: 在第一个线程组中,使用BeanShell PostProcessorBeanShell Sampler来将局部变量提升为全局变量。例如:

     

    java

    props.put("globalVarName", vars.get("localVarName"));

    然后在其他线程组中,使用BeanShell PreProcessorBeanShell Sampler来获取这个全局变量:

     

    java

    String globalVar = props.get("globalVarName");
    vars.put("localVarName", globalVar);

通过上述方法,你可以确保在JMeter的不同线程组之间共享和保持全局变量的一致性。这样,无论在哪个线程组中,都可以访问和使用这些全局变量。

三、除了全局变量,JMeter还有其他共享数据的方法吗?

在JMeter中,除了使用全局变量来共享数据之外,还可以采用以下几种方法来实现不同线程组之间的数据共享:

  1. 使用JMeter属性(Properties): JMeter的属性是全局的,可以在所有线程之间共享。可以使用__setProperty函数来设置属性,然后在其他线程组中使用${__P(propName)}来引用这个属性。这种方法适合传递静态值,如API密钥或配置参数。

  2. 使用文件转接法: 在一个线程组中将数据写入文件,然后在另一个线程组中通过CSV Data Set Config读取文件中的数据。这种方法适用于数据量较大且变化不频繁的情况。

  3. 使用JMeter的函数: JMeter提供了一些内置函数,如__groovy,可以在不同线程组之间传递数据。例如,可以在一个线程组中使用__groovy{...}函数将数据写入共享变量,然后在另一个线程组中使用相同的函数来读取这个共享变量。

  4. 使用JSR223 PostProcessors或PreProcessors: 使用Groovy或其他语言编写脚本,在脚本中使用共享的变量或属性。这种方法提供了更大的灵活性,可以在脚本中执行更复杂的逻辑来处理数据共享。

  5. 使用HTTP Cookie Manager: 如果需要在多个线程组之间共享cookie,可以使用HTTP Cookie Manager。在第一个线程组中设置cookie后,其他线程组可以引用同一个HTTP Cookie Manager来共享这些cookie。

  6. 使用JMeter的监听器(Listeners): 例如,使用View Results Tree监听器查看一个请求的响应数据,然后在另一个线程组中使用BeanShell Sampler或JSR223 Sampler来提取并使用这些数据。

  7. 使用数据库: 如果数据共享需要跨多个测试计划或长时间保持,可以考虑使用数据库来存储和读取数据。在一个测试计划中将数据写入数据库,然后在另一个测试计划中从数据库读取数据。

每种方法都有其适用场景和限制,你可以根据实际的测试需求和环境选择最合适的方法来实现数据共享。

四、 在JMeter中,我该如何处理大量共享数据的读写性能问题?

在JMeter中处理大量共享数据的读写性能问题时,可以采取以下策略来优化性能:

  1. 使用分布式集群: 当单台机器无法承载更多线程时,可以采用分布式集群的方式。通过多台机器共同承担压测任务,可以显著提高性能和数据处理能力。

  2. 优化JVM参数: 调整JMeter的JVM参数,增加堆内存和新生代内存的大小,可以提高JMeter处理大量数据的能力。例如,可以修改jmeter.bat文件中的set HEAP=-Xms2048m -Xmx2048m来增加内存分配。

  3. 使用CSV Data Set Config的共享模式: 在处理大量数据时,合理设置CSV Data Set Config的共享模式可以提高性能。例如,使用“Current thread group”模式可以让同一线程组内的线程共享数据集,减少文件的读写次数。

  4. 减少文件I/O操作: 频繁的文件读写会严重影响性能。可以通过减少文件打开次数、使用内存中的数据结构来传递数据,或者将数据存储在数据库中,通过JDBC请求来读取,以减少文件I/O操作。

  5. 使用数据库: 对于需要大量读写操作的数据,可以考虑使用数据库来存储和读取数据。JMeter可以通过JDBC Request直接与数据库交互,这样可以更有效地处理大量数据。

  6. 优化数据结构和算法: 在BeanShell或JSR223脚本中,优化数据结构和算法可以减少数据处理的时间。例如,使用更高效的数据结构来存储和检索数据。

  7. 使用缓存: 如果数据不经常变化,可以考虑使用缓存来存储热点数据,减少对后端数据源的访问压力。

  8. 监控和调优: 使用JMeter自带的监听器或更高级的工具(如Grafana与InfluxDB)进行实时监控,根据监控结果对性能进行调优。

  9. 避免使用非线程安全的元件: 在设计测试计划时,确保使用的元件是线程安全的,避免因为线程安全问题导致的性能瓶颈。

通过上述方法,可以有效提高JMeter在处理大量共享数据时的读写性能,从而更高效地进行性能测试。

相关文章:

jmeter 获取唯一全局变量及多线程读写的问题

一、jmeter 获取唯一ID号全局变量 在JMeter中获取唯一ID号并设置为全局变量,可以通过以下几种方法实现: 使用JMeter内置的UUID函数: JMeter提供了一个内置的函数__UUID,可以生成一个随机的UUID,这个UUID是全局唯一的。…...

掌握 Spring Boot 中的缓存:技术和最佳实践

缓存是一种用于将经常访问的数据临时存储在更快的存储层(通常在内存中)中的技术,以便可以更快地满足未来对该数据的请求,从而提高应用程序的性能和效率。在 Spring Boot 中,缓存是一种简单而强大的方法,可以…...

动手学深度学习10.5. 多头注意力-笔记练习(PyTorch)

本节课程地址:多头注意力代码_哔哩哔哩_bilibili 本节教材地址:10.5. 多头注意力 — 动手学深度学习 2.0.0 documentation 本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>multihead-attention.ipynb 多头注…...

13 设计模式之外观模式(家庭影院案例)

一、什么是外观模式? 1.定义 在日常生活中,许多人喜欢通过遥控器来控制家中的电视、音响、DVD 播放器等设备。虽然这些设备各自独立工作,但遥控器提供了一个简洁的界面,让用户可以轻松地操作多个设备。而这一设计理念正是 外观模…...

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

Web安全基础实践

实践目标 (1)理解常用网络攻击技术的基本原理。(2)Webgoat实践下相关实验。 WebGoat WebGoat是由著名的OWASP负责维护的一个漏洞百出的J2EE Web应用程序,这些漏洞并非程序中的bug,而是故意设计用来讲授We…...

Zookeeper集群数据是如何同步的?

大家好,我是锋哥。今天分享关于【Zookeeper集群数据是如何同步的?】面试题。希望对大家有帮助; Zookeeper集群数据是如何同步的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper集群中的数据同步是通过一种称为ZAB(Zo…...

SpringCloud框架学习(第六部分:Sentinel实现熔断与限流)

目录 十四、SpringCloud Alibaba Sentinel实现熔断与限流 1.简介 2.作用 3.下载安装 4.微服务 8401 整合 Sentinel 入门案例 5.流控规则 (1)基本介绍 (2)流控模式 Ⅰ. 直接 Ⅱ. 关联 Ⅲ. 链路 (3&#xff0…...

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1:状态表示2:状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结: 下降最小路径和 1:状态表示 假设:用dp[i][j]表示:到达[i,j]的最小路径 2:状态转…...

Rust循环引用与多线程并发

循环引用与自引用 循环引用的概念 循环引用指的是两个或多个对象之间相互持有对方的引用。在 Rust 中&#xff0c;由于所有权和生命周期的严格约束&#xff0c;直接创建循环引用通常会导致编译失败。例如&#xff1a; // 错误的循环引用示例 struct Node {next: Option<B…...

东方隐侠网安瞭望台第8期

谷歌应用商店贷款应用中的 SpyLoan 恶意软件影响 800 万安卓用户 迈克菲实验室的新研究发现&#xff0c;谷歌应用商店中有十多个恶意安卓应用被下载量总计超过 800 万次&#xff0c;这些应用包含名为 SpyLoan 的恶意软件。安全研究员费尔南多・鲁伊斯上周发布的分析报告称&…...

底部导航栏新增功能按键

场景需求&#xff1a; 在底部导航栏添加power案件&#xff0c;单击息屏&#xff0c;长按 关机 如下实现图 借此需求&#xff0c;需要掌握技能&#xff1a; 底部导航栏如何实现新增、修改、删除底部导航栏流程对底部导航栏部分样式如何修改。 比如放不下、顺序排列、坑点如…...

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…...

centos8:Could not resolve host: mirrorlist.centos.org

【1】错误消息&#xff1a; [rootcentos211 redis-7.0.15]# yum update CentOS Stream 8 - AppStream …...

Linux 定时任务 命令解释 定时任务格式详解

目录 时间命令 修改时间和日期 定时任务格式 定时任务执行 查看定时任务进程 重启定时任务 时间命令 #查看时间 [rootlocalhost ~]# date 2021年 07月 23日 星期五 14:38:19 CST --------------------------------------- [rootlocalhost ~]# date %F 2021-07-23 -----…...

aws(学习笔记第十五课) 如何从灾难中恢复(recover)

aws(学习笔记第十五课) 如何从灾难中恢复 学习内容&#xff1a; 使用CloudWatch对服务器进行监视与恢复区域(region)&#xff0c;可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式&#xff0c;当GitHub上发生特定事…...

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中&#xff0c;递归的实现会占用内存栈&#xff08;Call Stack&#xff09;&#xff0c;每次递归调用都会在栈上分配一个新的 “栈帧&#xff08;Stack Frame&#xff09;”&#xff0c;用于存储本次调用的函数局部变量、返回地…...

365天深度学习训练营-第P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文为「365天深度学习训练营」内部文章 参考本文所写记录性文章&#xff0c;请在文章开头带上「&#x1f449;声明」 &#x1f37a;要求&#xff1a; 保存训练过…...

企业AI助理在数据分析与决策中扮演的角色

在当今这个数据驱动的时代&#xff0c;企业每天都需要处理和分析大量的数据&#xff0c;以支持其业务决策。然而&#xff0c;面对如此庞大的数据量&#xff0c;传统的数据分析方法已经显得力不从心。幸运的是&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的不断发展…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...