超实用 JMeter BeanShell Sampler 教程

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

一、这是个啥玩意儿?

BeanShell Sampler 就像是 JMeter 的一个秘密武器,能让你用 Java 代码给测试计划 “开外挂”。当 JMeter 自带的功能没法满足那些奇奇怪怪的测试需求时,它就派上用场了。把它想象成一个万能的工具箱,你可以在里面自由发挥,编写代码让 JMeter 变得超级智能。

二、咋把它弄出来用呢?

在 JMeter 里找到你的线程组,然后右键点它,依次选 “添加”“取样器”“BeanShell Sampler”,这样它就出现在你的测试计划里啦。接着呢,在它的 “Script” 那块地方,就可以开始施展你的编程魔法了。

三、那些好用的内置宝贝

  1. log 小助手:这可是你的测试贴心小秘书。log.info("宝子们,这里一切正常哦!") 能把测试过程中的重要信息记录下来,比如某个步骤顺利完成啦。要是遇到问题,log.error("哎呀,出错啦!") 会马上把错误详情记好,方便你追踪问题根源。像你测试一个文件上传功能,成功上传后就 log.info("文件上传成功,撒花!"),要是上传失败,log.error("文件上传失败,原因可能是……"),后面详细写上你猜测的原因,这样排查问题就容易多了。
  2. vars 神奇口袋:用来存放各种测试要用的变量。vars.get("用户名") 就像是从口袋里掏出之前放进去的用户名。要是你想更新或新增变量,就用 vars.put("新变量名", "变量的值")。比如说,你从数据库里查询到一个用户的积分是 100,就可以 vars.put("用户积分", "100"),后续测试中涉及到积分相关的操作就能直接用这个变量了。
  3. prev 时光机:能让你看到之前发生的请求情况。prev.getResponseDataAsString() 就像是穿越回上一个请求,把那个请求的回复内容拿过来看个究竟。prev.getResponseCode() 呢,就是查看上一个请求的状态码,是成功的 200,还是出错的 404 之类的。例如,你刚发了一个查询用户信息的请求,用 prev.getResponseDataAsString() 就能检查返回的用户信息是不是完整准确,如果返回的是乱码或者数据缺失,那就得找找问题了。
  4. Failure 和 FailureMessage 小警钟:当测试出现状况时,把 Failure 设为 true,就相当于拉响了警报。然后 FailureMessage 就是在警报响起时,详细说明哪里出问题了。比如你在验证一个支付接口,结果支付成功的提示没出现,你就可以 Failure = true; FailureMessage = "支付成功提示未显示,可能支付流程有问题哦!"

四、实际工作中的应用场景

  1. 电商系统中的价格计算与验证

    • 在电商平台的测试中,商品价格会根据不同的促销活动、用户等级、优惠券等因素而变化。假设我们有一个测试场景,要验证不同等级的用户在使用特定优惠券购买特定商品时,最终支付价格是否正确。
    • 首先,通过其他组件(如 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);
}
  1. 金融系统中的风险评估与交易限制

    • 在金融交易系统测试中,需要根据用户的信用评级、交易历史、账户余额等因素来评估风险,并对某些高风险交易进行限制或提示。例如,当用户的信用评级较低且交易金额超过其账户余额一定比例时,拒绝交易并返回相应提示。
// 获取用户信用评级
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("交易风险评估通过,可继续执行。");
}
  1. 社交平台中的动态发布与权限验证

    • 在社交平台测试中,用户发布动态时,需要根据其账号状态(是否被封禁、是否实名认证等)以及动态内容是否符合平台规定(如是否包含敏感词)来决定动态是否能够成功发布。假设我们通过一个文本文件提供了敏感词列表,在 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("动态内容合规,可继续发布流程。");
}

五、咋调试它呢?

  1. 日志输出:就像我们前面说的 log.infolog.error,你可以在代码里到处写上这些,把变量的值、执行到哪一步了这些信息都记下来。这样就像你在测试的路上放了很多小标记,要是出问题了,顺着标记就能找到问题在哪。比如在计算价格的代码里,你可以在每个计算步骤后加上 log.info("当前计算结果:" + 当前计算结果变量);,这样就能清楚地看到价格是怎么一步步算出来的。
  2. 启用调试模式:在代码里写上 debug(); 就像是给 JMeter 戴上了一个超级放大镜,它会把代码执行的每一个小细节都告诉你。不过这个放大镜太厉害,会让测试变慢,所以一般只有在你特别想知道代码到底咋跑的时候才用。
  3. 单步执行和变量值查看:用 debug("当前变量的值是:" + 变量名); 这样的代码,就像是你在代码执行的时候,让它停一下,看看某个变量现在是啥情况。比如说你在验证社交平台动态发布的代码里,在检查敏感词的循环中,加上 debug("当前检查的敏感词:" + word);,就能清楚地看到每个敏感词的检查情况。

宝子们,BeanShell Sampler 的潜力可大着呢!多在实际工作中用用这些例子,再根据自己的测试需求灵活修改代码,你就能轻松应对各种复杂的测试场景,让你的 JMeter 测试技能更上一层楼!

超实用 JMeter BeanShell Sampler 教程的更多相关文章

  1. Jmeter组件8. BeanShell Sampler

    BeanShell是一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性,像JavaScript和perl那样 ...

  2. Jmeter常用脚本开发之Beanshell Sampler

    Beanshell Sampler Beanshell介绍:是一种完全符合java语法规范的脚本语言,且又拥有自己的一些语法和方法:是一种松散类型的脚本语言:它执行标准java语句和表达式,另外它还包 ...

  3. [Jmeter]jmeter之BeanShell Sampler测试应用

    前言: 在做接口测试的时候,有些接口做了签名校验,而签名是根据某算法进行加密,这时候,简单的接口测试工具无法完成该工作,所以想到了Jmeter,他是java编写,有强大的扩展性,足矣完成我们需要的操作 ...

  4. jmeter脚本开发-BeanShell Sampler与Debug Sampler

    BeanShell支持java对象的调用,所以可直接通过BeanShell来调用java接口程序. BeanShell调用java接口例子 1.先编写两个简单的java类 创建java简单工程,并创建 ...

  5. Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密

    [前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...

  6. jmeter使用BeanShell Sampler测试自己写的java接口(一)

    上次直接使用jmeter里面的FTPsampler没有连接成功 现在想着自己写java代码,通过jmeter进行调用进行连接测试实现并发 代码引文: http://www.cnblogs.com/ch ...

  7. jmeter的BeanShell Sampler使用--导入第三方jar包

    实现目的 测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据,此时我们就可以通过BeanShell来调用自己编写的工具类,来对jmeter的功能进行扩展,以满足测试需要. 脚本实现 在 ...

  8. Jmeter——BeanShell PreProcessor的用法

    一.什么是BeanShell BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命 ...

  9. Testing Complex Logic with JMeter Beanshell

    BeanShell是最先进的JMeter内置组件之一.JMeter具有丰富的内置插件,可满足性能测试的许多需求.例如,在编写一些复杂的测试时,您可能需要一些额外的脚本.在这种情况下,值得使用Beans ...

  10. JMeter BeanShell示例

    翻译:https://blog.trigent.com/jmeter-blog-series-jmeter-beanshell-example 在这个例子中,我们将演示在Apache JMeter中使 ...

随机推荐

  1. RocketMQ 在小米的多场景灾备实践案例

    本文作者:邓志文.王帆 01为什么要容灾? 在小米内部,我们使用 RocketMQ 来为各种在线业务提供消息队列服务,比如商城订单.短信通知甚至用来收集 IoT 设备的上报数据,可以说 RocketM ...

  2. Paths和Files

    Paths 类 Paths 类主要用于操作文件和目录路径.它提供了一些静态方法,用于创建java.nio.file.Path实例,代表文件系统中的路径. // 创建一个Path实例,表示当前目录下的一 ...

  3. 常用css列表

    常用css列表 color 设置文字的颜色,如: color:red; font-size 设置文字的大小,如:font-size:12px; font-family 设置文字的字体,如:font-f ...

  4. 多个modal遮罩层覆盖不全的问题

    多个modal遮罩层覆盖不全的问题 如下有两个 modal的情况,要解决的是 在delete操作时弹出的modal 周围没有遮罩层环绕使得 确认 modal 辨识度不高 的问题 这里是修改好了的效果 ...

  5. [异常笔记] zookeeper集群启动异常:Error contacting service. It is probably not running.

    報錯信息 zookeeper服務已經啓動,但是狀態是Error contacting service. It is probably not running. 2021-02-23 21:00:41, ...

  6. 爱科微AIC8800D80P Wi-Fi6模块驱动移植

    1. 简介 开发环境Ubuntu20.04 目标平台:瑞芯微RK356X 目标平台内核版本:4.19.234 wifi模块型号:AIC8800D80P Wi-Fi6/BT5.0 2. 硬件 wifi模 ...

  7. 3张大图剖析HttpClient和IHttpClientFactory在解决DNS解析问题上的殊途同归

    在开发者便利度角度,我们很轻松地使用HttpClient对象发出HTTP请求,只需要关注应用层协议的BaseAddr.Url.ReqHeader.timeout. 实际在HttpClient在源码级别 ...

  8. ubuntu 下做反向代理给hyperf使用

    使用hyperf的时候发现它监听9501端口,然后这样需要ip+port方式去访问,但是这样对用户而言有点不太友好,如果我们还有域名,可以做一个反向代理避免端口直接写出来. 找了找网上别人写的例子,感 ...

  9. 设置 crossdomain.xml 文件实施 HTTP 流式传输

    本文概括介绍了跨域策略文件,以及如何在 Adobe Media Server 中为 HTTP 流式传输配置该文件. 为什么需要采用 crossdomain.xml 文件? 跨域策略文件 跨域策略文件是 ...

  10. jetty嵌入式配置总结

    Jetty配置到项目 拷贝lib/jsp和lib下的所有jar包到项目中. 在工程中创建文件夹jetty/etc.jetty/contexts 拷贝jetty包中的jetty.xml和webdefau ...