Jmeter书中不会教你的(1)——beanshell用来获取变量和设置变量的vars

本文详细讲解了如何在JMeter 5.3的Beanshell sampler中正确引用用户自定义变量,包括${}

       这几年Jmeter用的相对比较多,自己每次在做项目时也常会去翻看以前遇到的问题,记录的一些技巧,解决方案,也一直考虑把它整理出来,一来方便自己查找,二来也希望同行可以互相切磋。我写的这些文章不是针对Jmeter小白用户,可能叙述某些步骤时会直接跳过一些解释,不明白的或者表达错误的欢迎提出。目前所用的Jmeter版本是5.3。

        通常我们在编写场景类脚本时需要引用之前提取或设置的变量,如先在线程组下右击创建一个配置元素,选择用户自定义变量,设置一个参数名为name,值为junjun。什么情况下需要用到这种配置元素?一般每次需要执行相同脚本不同参数时,如线程数量等

  1.         接下来要实现beanshell中引用这个变量并打印。可能刚接触Jmeter的同学很少会用到beanshell,在面试时被问到Jmeter相关问题时也只会最基本的知道怎么建线程组,创建http请求,参数化了解一些,后置处理器也只用过正则表达式、查看结果树等等。涉及怎么调试、查看日志、函数、脚本语言十有八九是回答不出来的,这里基本组件会讲的少一点,主要是讲我实际做项目时会用到的一些知识点,beanshell会涉及较多。

        新增一个beanshell sampler,

按如下第一种方法${}来引用,打开右上角日志,执行。查看日志中报错信息,因为log.info只能打印字符串,而在引用name时未指定字符串类型

//提取name变量值
//方法1:${}
name1=${name};
log.info(name1);

 修改如下,增加双引号,再执行,可以看到junjun已经打印在下方。

//提取name变量值
//方法1:${}
name1="${name}";
log.info(name1);

 

第二种方法,使用vars.get()方法,括号里直接填写变量名,可以看到报错信息Undefined argument: name,意思是name这个参数么有定义,就是识别不了这个参数,原因是vars.get在获取变量时也需要打双引号

//方法2:vars
name2=vars.get(name);
log.info(name2);

 修改如下,再次执行结果已打印,由于vars.get()获取的变量值为字符串类型,所以在log.info()打印时可以直接输出了。

//方法2:vars
name2=vars.get("name");
log.info(name2);

2. 获取了变量后,如果要执行过程中需要修改变量后引用怎么做呢?新建一个2,输入如下再执行,又看到了熟悉的错误,分析下,name3做了一个字符串连接打印输出,再将name3的值存入一个新的变量name4并打印,报错的原因是vars.put()中指定新的变量时必须打双引号,字符串类型

name2=vars.get("name");
log.info(name2);

name3=name2+"001";
log.info(name3);
//将name3变量的值存入name4变量
vars.put(name4,name3);
log.info(vars.get("name4"));

 修改

name2=vars.get("name");
log.info(name2);

name3=name2+"001";
log.info(name3);
//将name3变量的值存入name4变量
vars.put("name4",name3);
log.info(vars.get("name4"));

总结下本文主要讲的就是2点

1.在beashell中引用变量时可以用${} 也可以用vars.get(String key),需要注意的是双引号使用,获取的数据类型,本篇例子都是字符串类型

2.在beashell中设置新变量时可以用vars.put(String key,String value)

-------------------------------------------------------------------------------

如果觉得我的文章对您有用,请收藏+关注,您的支持是我坚持的动力!

        

<think>好的,用户想了解如何在JMeter中通过BeanShell获取变量。首先,我需要回忆一下JMeterBeanShell相关知识,特别是关于变量操作的部分。记得JMeterBeanShell可以使用vars对象来操作变量varsJMeterVariables类的实例,提供读取写入变量的方法。 首先,用户的问题主要涉及获取变量,所以重点在vars.get()方法。根据引用[1],vars.get(String key)是从JMeter获取变量值的常用方法。需要注意的是,参数应该用变量名的字符串,而不是直接使用${变量}的形式,比如vars.get("key")是正确的,而vars.get("${key}")是错误的。这一点需要明确告诉用户,避免常见错误。 然后,用户可能需要示例代码,所以得准备一个简单的BeanShell Sampler脚本示例,展示如何获取变量。例如,用户可能在测试计划中定义了一个名为"username"的变量,然后在BeanShell中通过vars.get("username")获取它的值,再通过log.info输出或者进行其他处理。 另外,引用[3]提到,在非BeanShell元件中,可以使用${变量名}来引用变量,但在BeanShell内部必须使用vars.get()方法。这一点需要区分清楚,避免混淆。例如,在HTTP请求中可以使用${username},但在BeanShell脚本里必须用vars.get("username")。 还需要考虑变量作用域的问题,引用[3]指出,Http请求BeanShell Sampler需要在同一个线程组内才能共享变量,这一点要提醒用户注意变量的作用域,避免跨线程组或测试计划导致变量无法获取的情况。 另外,用户可能需要了解如何将获取变量用于后续操作,比如断言、参数传递等。这时候可以举例说明,比如将获取变量值存入另一个变量中,或者进行字符串处理后再使用。 可能还需要提到props.get()props.put(),但用户的问题主要围绕变量vars),所以暂时不需要深入props,除非用户有跨线程组或全局变量的需求,但根据问题描述,暂时先集中在vars上。 总结一下,回答的结构应该是先介绍vars对象及其方法,然后给出具体步骤示例代码,强调正确的使用方式(如避免使用${}),并提醒作用域常见错误。最后,生成相关问题,帮助用户进一步学习,比如如何设置变量、优化脚本或处理复杂数据。</think>### JMeter BeanShell 获取变量方法及示例 在JMeter中,BeanShell通过`vars`对象操作变量,以下是具体方法及注意事项: #### 1. **获取变量方法** - **语法**:`vars.get("变量名")` - 直接使用变量名字符串,而非`${变量名}`格式,例如: ```java String username = vars.get("username"); // 正确方式 // String username = vars.get("${username}"); // 错误方式 ``` - 适用于所有通过JMeter定义的变量(如用户定义变量、正则表达式提取器等)[^1][^3]。 #### 2. **操作示例** **场景**:从HTTP请求中提取响应数据并存入变量,再通过BeanShell读取。 - **步骤**: 1. 使用正则表达式提取器提取响应中的`token`值,存入变量`token`。 2. 添加BeanShell Sampler,编写以下脚本: ```java // 读取变量 String tokenValue = vars.get("token"); // 打印到控制台(调试用) log.info("Token值为:" + tokenValue); // 修改变量并传递到后续请求 String newToken = tokenValue + "_modified"; vars.put("modified_token", newToken); ``` #### 3. **关键注意事项** - **变量作用域**:变量仅在**同一线程组**内共享。若跨线程组需使用`props`对象(全局属性)[^3]。 - **数据类型**:JMeter变量均为字符串类型,数值计算需转换类型,例如: ```java String countStr = vars.get("count"); int count = Integer.parseInt(countStr) + 1; vars.put("count", String.valueOf(count)); ``` #### 4. **调试技巧** - 使用`log.info()`输出变量值到JMeter日志。 - 结合`Debug Sampler`验证变量是否正确传递。 ```java // BeanShell调试示例 String user = vars.get("username"); log.info("当前用户:" + user); ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

agrapea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值