超实用 JMeter BeanShell Sampler 教程
超实用 JMeter BeanShell Sampler 教程
宝子们,今天咱继续深挖 JMeter 里超厉害的 BeanShell Sampler,这次多来点实际工作中的例子,让你彻底搞懂它!

一、这是个啥玩意儿?
BeanShell Sampler 就像是 JMeter 的一个秘密武器,能让你用 Java 代码给测试计划 “开外挂”。当 JMeter 自带的功能没法满足那些奇奇怪怪的测试需求时,它就派上用场了。把它想象成一个万能的工具箱,你可以在里面自由发挥,编写代码让 JMeter 变得超级智能。
二、咋把它弄出来用呢?
在 JMeter 里找到你的线程组,然后右键点它,依次选 “添加”“取样器”“BeanShell Sampler”,这样它就出现在你的测试计划里啦。接着呢,在它的 “Script” 那块地方,就可以开始施展你的编程魔法了。
三、那些好用的内置宝贝
- log 小助手:这可是你的测试贴心小秘书。
log.info("宝子们,这里一切正常哦!")能把测试过程中的重要信息记录下来,比如某个步骤顺利完成啦。要是遇到问题,log.error("哎呀,出错啦!")会马上把错误详情记好,方便你追踪问题根源。像你测试一个文件上传功能,成功上传后就log.info("文件上传成功,撒花!"),要是上传失败,log.error("文件上传失败,原因可能是……"),后面详细写上你猜测的原因,这样排查问题就容易多了。 - vars 神奇口袋:用来存放各种测试要用的变量。
vars.get("用户名")就像是从口袋里掏出之前放进去的用户名。要是你想更新或新增变量,就用vars.put("新变量名", "变量的值")。比如说,你从数据库里查询到一个用户的积分是 100,就可以vars.put("用户积分", "100"),后续测试中涉及到积分相关的操作就能直接用这个变量了。 - prev 时光机:能让你看到之前发生的请求情况。
prev.getResponseDataAsString()就像是穿越回上一个请求,把那个请求的回复内容拿过来看个究竟。prev.getResponseCode()呢,就是查看上一个请求的状态码,是成功的 200,还是出错的 404 之类的。例如,你刚发了一个查询用户信息的请求,用prev.getResponseDataAsString()就能检查返回的用户信息是不是完整准确,如果返回的是乱码或者数据缺失,那就得找找问题了。 - Failure 和 FailureMessage 小警钟:当测试出现状况时,把
Failure设为true,就相当于拉响了警报。然后FailureMessage就是在警报响起时,详细说明哪里出问题了。比如你在验证一个支付接口,结果支付成功的提示没出现,你就可以Failure = true; FailureMessage = "支付成功提示未显示,可能支付流程有问题哦!"
四、实际工作中的应用场景
- 电商系统中的价格计算与验证
- 在电商平台的测试中,商品价格会根据不同的促销活动、用户等级、优惠券等因素而变化。假设我们有一个测试场景,要验证不同等级的用户在使用特定优惠券购买特定商品时,最终支付价格是否正确。
- 首先,通过其他组件(如 CSV Data Set Config)获取用户等级、商品原价、优惠券金额等数据。然后在 BeanShell Sampler 中,根据这些数据进行价格计算。例如:
// 获取用户等级
String userLevel = vars.get("userLevel");
// 获取商品原价
double originalPrice = Double.parseDouble(vars.get("originalPrice"));
// 获取优惠券金额
double couponAmount = Double.parseDouble(vars.get("couponAmount"));
double finalPrice = 0.0;
if ("vip".equals(userLevel)) {
// VIP 用户享受额外 8 折优惠
finalPrice = (originalPrice - couponAmount) * 0.8;
} else {
finalPrice = originalPrice - couponAmount;
}
// 将计算出的最终价格设置为变量,供后续请求使用
vars.put("finalPrice", Double.toString(finalPrice));
// 发送购买请求后,检查响应中的实际支付价格是否与计算出的最终价格一致
String responseData = prev.getResponseDataAsString();
if (responseData.contains("实际支付价格:" + finalPrice)) {
log.info("价格验证成功!");
} else {
Failure = true;
FailureMessage = "价格验证失败,实际支付价格与预期不符!";
log.error(FailureMessage);
}
- 金融系统中的风险评估与交易限制
- 在金融交易系统测试中,需要根据用户的信用评级、交易历史、账户余额等因素来评估风险,并对某些高风险交易进行限制或提示。例如,当用户的信用评级较低且交易金额超过其账户余额一定比例时,拒绝交易并返回相应提示。
// 获取用户信用评级
String creditRating = vars.get("creditRating");
// 获取账户余额
double accountBalance = Double.parseDouble(vars.get("accountBalance"));
// 获取交易金额
double transactionAmount = Double.parseDouble(vars.get("transactionAmount"));
if ("low".equals(creditRating) && transactionAmount > accountBalance * 0.8) {
// 拒绝交易,设置响应信息
vars.put("responseMessage", "交易被拒绝,由于信用评级低且交易金额过高。");
Failure = true;
FailureMessage = "高风险交易被拒绝,符合风险控制规则。";
log.error(FailureMessage);
} else {
// 交易正常,可继续进行其他操作
log.info("交易风险评估通过,可继续执行。");
}
- 社交平台中的动态发布与权限验证
- 在社交平台测试中,用户发布动态时,需要根据其账号状态(是否被封禁、是否实名认证等)以及动态内容是否符合平台规定(如是否包含敏感词)来决定动态是否能够成功发布。假设我们通过一个文本文件提供了敏感词列表,在 BeanShell Sampler 中检查动态内容是否包含敏感词。
// 获取用户动态内容
String postContent = vars.get("postContent");
// 假设从文件中读取敏感词列表并存储为数组(这里简化处理,实际可能需要更复杂的读取逻辑)
String[] sensitiveWords = {"敏感词 1", "敏感词 2", "敏感词 3"};
for (String word : sensitiveWords) {
if (postContent.contains(word)) {
// 动态包含敏感词,设置提示信息并阻止发布
vars.put("errorMessage", "动态包含敏感词,发布失败。");
Failure = true;
FailureMessage = "动态发布因敏感词被拦截。";
log.error(FailureMessage);
break;
}
}
if (!Failure) {
log.info("动态内容合规,可继续发布流程。");
}
五、咋调试它呢?
- 日志输出:就像我们前面说的
log.info和log.error,你可以在代码里到处写上这些,把变量的值、执行到哪一步了这些信息都记下来。这样就像你在测试的路上放了很多小标记,要是出问题了,顺着标记就能找到问题在哪。比如在计算价格的代码里,你可以在每个计算步骤后加上log.info("当前计算结果:" + 当前计算结果变量);,这样就能清楚地看到价格是怎么一步步算出来的。 - 启用调试模式:在代码里写上
debug();就像是给 JMeter 戴上了一个超级放大镜,它会把代码执行的每一个小细节都告诉你。不过这个放大镜太厉害,会让测试变慢,所以一般只有在你特别想知道代码到底咋跑的时候才用。 - 单步执行和变量值查看:用
debug("当前变量的值是:" + 变量名);这样的代码,就像是你在代码执行的时候,让它停一下,看看某个变量现在是啥情况。比如说你在验证社交平台动态发布的代码里,在检查敏感词的循环中,加上debug("当前检查的敏感词:" + word);,就能清楚地看到每个敏感词的检查情况。
宝子们,BeanShell Sampler 的潜力可大着呢!多在实际工作中用用这些例子,再根据自己的测试需求灵活修改代码,你就能轻松应对各种复杂的测试场景,让你的 JMeter 测试技能更上一层楼!
超实用 JMeter BeanShell Sampler 教程的更多相关文章
- Jmeter组件8. BeanShell Sampler
BeanShell是一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性,像JavaScript和perl那样 ...
- Jmeter常用脚本开发之Beanshell Sampler
Beanshell Sampler Beanshell介绍:是一种完全符合java语法规范的脚本语言,且又拥有自己的一些语法和方法:是一种松散类型的脚本语言:它执行标准java语句和表达式,另外它还包 ...
- [Jmeter]jmeter之BeanShell Sampler测试应用
前言: 在做接口测试的时候,有些接口做了签名校验,而签名是根据某算法进行加密,这时候,简单的接口测试工具无法完成该工作,所以想到了Jmeter,他是java编写,有强大的扩展性,足矣完成我们需要的操作 ...
- jmeter脚本开发-BeanShell Sampler与Debug Sampler
BeanShell支持java对象的调用,所以可直接通过BeanShell来调用java接口程序. BeanShell调用java接口例子 1.先编写两个简单的java类 创建java简单工程,并创建 ...
- Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密
[前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...
- jmeter使用BeanShell Sampler测试自己写的java接口(一)
上次直接使用jmeter里面的FTPsampler没有连接成功 现在想着自己写java代码,通过jmeter进行调用进行连接测试实现并发 代码引文: http://www.cnblogs.com/ch ...
- jmeter的BeanShell Sampler使用--导入第三方jar包
实现目的 测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据,此时我们就可以通过BeanShell来调用自己编写的工具类,来对jmeter的功能进行扩展,以满足测试需要. 脚本实现 在 ...
- Jmeter——BeanShell PreProcessor的用法
一.什么是BeanShell BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命 ...
- Testing Complex Logic with JMeter Beanshell
BeanShell是最先进的JMeter内置组件之一.JMeter具有丰富的内置插件,可满足性能测试的许多需求.例如,在编写一些复杂的测试时,您可能需要一些额外的脚本.在这种情况下,值得使用Beans ...
- JMeter BeanShell示例
翻译:https://blog.trigent.com/jmeter-blog-series-jmeter-beanshell-example 在这个例子中,我们将演示在Apache JMeter中使 ...
随机推荐
- 高效求解 n 个点之间的最大曼哈顿距离
平面上有 n 个点,如何求出任意两点的曼哈顿距离的最大值? 曼哈顿距离的公式为: \[d((x_1, y_1), (x_2, y_2)) = |x_1 - x_2| + |y_1 - y_2| \] ...
- Ubuntu 22.04 全局快捷键失效问题
安装完 Ubuntu 22.04 后,你有可能会发现系统的快捷键失效了.侧栏用 Win + x 选中程序不可用了.为各种应用程序设置的快捷键也不起作用了. 出现此现象的原因,是因为 Ubuntu 22 ...
- vue中事件总线bus的用法
./util/Bus.js import Bus from 'vue'; let install = function (Vue) { // 设置eventBus Vue.prototype.bus ...
- jarvisoj_level2_x64 1 writeup and blog
Here i finish the jarvisoj_level2_x64 1 challenge in buuctf and here is some writeup (i use English ...
- 0基础读顶会论文—流程即服务(PraaS):通过无服务器流程统一弹性云和有状态云
Abstract 细粒度的无服务器函数为许多新应用提供了动力,这些应用受益于弹性扩展和按需付费计费模型,同时将基础设施管理开销降至最低.为了实现这些特性,函数即服务(FaaS)平台将计算和状态分离,P ...
- Python之JSON用法解析
前景 Python编写HDFS服务安装的过程中,需要将构建好的JSON对象输出到文件,采用那种方式更便捷 方案1 open 函数 def writeExecCmdCheckActionsFile(se ...
- 揭秘!Vue3.5响应式重构如何让内存占用减少56%
前言 Vue3.5版本又将响应式给重构了,重构后的响应式系统主要有两部分组成: 双向链表和 版本计数.我们在前两篇文章中我们已经讲过了 双向链表和 版本计数,这篇文章我们来讲讲为什么这次重构能够让内存 ...
- Spring开闭原则的表现-BeanPostProcessor的扩展点-1
上接Spring事务处理时自我调用的解决方案及一些实现方式的风险继续分析,在分析上篇的问题之前,我们需要了解下BeanPostProcessor概念和Spring容器创建Bean的流程. 一.Bean ...
- java 中的Unsafe
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过.所以花了点时间google了一下. Unsafe的源码:http://www.docjar.com ...
- Linux之新增硬盘,分区,挂载
1.新增硬盘后, 查看当前磁盘信息 fdisk -l 可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令: fdisk /dev/sdb 给第二块硬盘进行分区 ...