【JMeter】Groovy和BeanShell脚本的性能比较(转)

本文通过实际测试对比了Groovy与BeanShell在JMeter中的性能表现,结果显示Groovy预编译特性使其在多次运行后性能显著优于BeanShell。

比较完常见后置处理器的性能之后,又顺便比较了下GroovyBeanShell

2者都是基于JVM的脚本语言,2者都能直接用Java的语法和类库

这些国外网站都推荐用Groovy:

http://jmeter.apache.org/usermanual/best-practices.html

http://www.ubik-ingenierie.com/blog/magento-performance-toolkit-and-jmeter-best-practices/

https://blazemeter.com/blog/beanshell-vs-jsr223-vs-java-jmeter-scripting-its-performance

因为JMeter支持的一堆脚本语言里,只有它有预编译

 

关于jmeter的中文网站里提到groovy的很少,不知有人比较过预编译带来的速度提升有多大没

正好闲着来试一下

 


环境:jmeter 2.13、JDK 1.8u73、JVM参数从来没动过、win 10 pro

 

在项目里我就是直接上Groovy的,可以用现成的脚本来测试 :)

生成随机手机号的脚本,注释就不截了

提取到另一个脚本的公用方法,无关的也不截了

为了效率,用了静态编译(性能比较见这里

每当这脚本有改动,要用groovyc重新编译(生成的class文件跟java一样,用jad反编译就能看到java代码)

其他脚本引用的就是这个class文件

scripts目录加入了jmeter的properties文件里,所以哪里都能引用到这文件

 

为了测试,创建个beanshell脚本文件,就是文本文档把后缀改为.bsh

不知道beanshell风格是怎样,直接套java语法

现在2边做的事是一样的,beanshell脚本还少几次调用

 


 

 

我们进JMeter,建好如下的测试计划:

暂时用不着的组件先ctrl + t禁用掉

 

先测试最简单的hello world,采样器配置如下:

* 要先下载安装groovy,安装目录下找到embeddable文件夹,把groovy-all-2.x.x.jar拷到jmeter安装目录下的lib文件夹下

然后重启jmeter才能在jsr223的菜单里看到groovy的选项

* cache key随便写点什么,保证唯一就行。直接在下面写脚本时需要写上cache key才有预编译

 

重启jmeter,运行测试1次,看到jmeter的命令行窗口里有了正确的输出

然而2边都慢得离谱,尤其是groovy慢得吓死人

清掉记录再来,预热之后好看点了

之后n次都差不多,groovy从来没低于10毫秒

 

一个hello world都比beanshell慢3~十几倍,这能用吗?

我们看看拿正经的脚本,跑足够多的次数会怎样


 

 

首先2个采样器的设置如下:

就是填脚本文件的路径和传个变量名给脚本,没啥特别

值得注意的是groovy只要使用了外部脚本文件就有预编译,这时不用填cache key

 

用1个线程循环1次调试通过

 

修改线程组设置为:10个线程,1秒集结(0.1秒来1个),持续60秒,无启动延迟

ctrl + t禁用无关的组件(变灰那些),注意关掉所有监听器,因为接下来要用命令行运行,留着它们会拖累吞吐率

 

关掉界面,用命令行跑测试,结果如下:

BeanShell

 

再进界面改成用jsr223采样器,等爆表的cpu内存占用率回落后再跑,结果如下:

Groovy

留意summary + 的那几行,groovy一开始特别慢,请求耗时的最大值吓死人,之后减少了10倍,最终结果就是

3倍速!

没什么好说的,选Groovy就对了(而且Gradle和Jenkins也用得到它)

 

 


 

PS:

上述测试保存报告文件为csv格式,使用如下设置

大部分数据在这里都用不上,关到剩下最精简的几个

如果用通常的设置,报告文件估计要大5倍不止

就剩4列,似乎没法再少了

留意耗时最长的一般都是前几次,之后就快了,统计时忽略开头某段时间的数据就好

 

又PS:

上面的生成手机号的脚本是给接口测试用的,性能测试就别当场生成了

先搞好几十万个塞进数据库或csv文件慢慢用吧

转载于:https://www.cnblogs.com/hellomandy/p/8179895.html

<think>我们正在讨论JMeter中调试BeanShell脚本的方法。根据引用[3]提到的“六、脚本调试技巧”,以及引用[1][2]中关于BeanShellJMeter中使用的信息,我们可以总结出以下调试方法: 引用[1]提到:BeanShell由于内置了一些特有的变量,没法在一些集成代码工具上去调试。但是我们可以利用JMeter自身提供的调试功能。 引用[3]提到:脚本调试技巧(虽然具体内容省略了,但我们可以结合常见的调试方法) 常见的调试方法包括: 1. 使用`log`或`print`输出变量值 2. 使用`SampleResult`记录额外信息 3. 利用JMeter的调试取样器(Debug Sampler) 4. 使用BeanShell脚本中的内置对象(如`log`)记录日志 5. 设置断言来验证逻辑 6. 利用JMeter的查看结果树(View Results Tree)查看脚本输出 具体步骤: ### 1. **使用日志输出调试信息** BeanShell内置了`log`对象(对应JMeter的Logger)`out`对象(System.out,输出到控制台)。我们可以在脚本中插入日志语句: ```java log.info("Debug message: " + someVariable); // 输出到JMeter日志(jmeter.log) print("Debug message: " + someVariable); // 输出到控制台(如果JMeter从控制台启动) ``` ### 2. **使用调试取样器(Debug Sampler)** 在测试计划中添加一个 **Debug Sampler**,它可以显示JMeter变量、属性系统属性。将其放置在BeanShell组件之后,可以查看BeanShell脚本执行后设置的变量。 ### 3. **查看结果树(View Results Tree)** 在测试计划中启用 **View Results Tree**,选择对应的取样器,可以查看BeanShell脚本的输出。如果BeanShell脚本中有错误,也会在结果树中显示错误信息。 ### 4. **在BeanShell脚本中捕获异常** 使用try-catch块捕获异常并记录: ```java try { // 可能出错的代码 } catch (Exception e) { log.error("Error occurred: ", e); // 记录错误日志 } ``` ### 5. **使用BeanShell断言(BeanShell Assertion)验证** 在BeanShell断言中编写验证逻辑,如果条件不满足则标记失败(如引用[3]所示): ```java if (!expected.equals(actual)) { Failure = true; FailureMessage = "Expected " + expected + " but got " + actual; } ``` ### 6. **分步调试(逐步注释)** 对于复杂的脚本,可以逐步注释掉部分代码,逐步验证每一部分的功能。 ### 7. **使用外部工具辅助** 虽然引用[1]提到BeanShell内置变量无法在外部工具调试,但我们可以将BeanShell脚本独立出来,在外部Java环境中测试(需要模拟JMeter环境变量)。或者将关键逻辑提取为Java类,然后在BeanShell中调用(如引用[4]所述,将jar包放在`lib/ext`目录下)。 > 注意:在调试完成后,应移除或禁用调试代码,以免影响性能。 ### 示例:调试一个BeanShell取样器 假设我们有一个BeanShell取样器,用于处理动态参数: ```java // 获取变量 String param1 = vars.get("param1"); log.info("param1: " + param1); // 调试输出 // 处理逻辑 String result = param1.toUpperCase(); // 存储结果 vars.put("processedParam", result); ``` 在查看结果树中,我们可以查看日志输出(在响应数据或jmeter.log中),并检查`processedParam`的值。 ### 总结: 在JMeter中调试BeanShell脚本主要依赖日志输出、调试取样器查看结果树。同时,合理使用异常捕获逐步调试也能有效定位问题[^1][^2][^3]。 --- ### §§相关问题§§ 1. 如何查看JMeter的日志文件(jmeter.log)? 2. JMeter的Debug Sampler具体能显示哪些信息? 3. 如何将BeanShell脚本迁移到更高效的Groovy脚本? 4. 在BeanShell脚本中如何模拟JMeter变量进行本地调试? [^1]: JMeter BeanShell内置变量与调试限制 : BeanShell组件使用指南 [^3]: BeanShell断言与调试技巧 </think> ### JMeter 中调试 BeanShell 脚本的方法 在 JMeter 中调试 BeanShell 脚本主要通过以下方法实现,结合引用内容中的关键技巧[^1][^3]: #### 1. **日志输出调试法** [^1][^3] ```java // 使用内置 log 对象输出变量值 log.info("==== 调试开始 ===="); log.info("参数值: " + vars.get("userID")); // 使用 print 输出到控制台 System.out.println("响应数据: " + prev.getResponseDataAsString()); // 输出特殊变量值 log.info("线程号: " + ctx.getThreadNum()); ``` > **作用**:在 JMeter 日志(`jmeter.log`)控制台实时查看变量值,适合追踪执行流程。 #### 2. **响应数据写入文件** [^3] ```java // 将关键数据写入文件 import java.io.*; try (FileWriter fw = new FileWriter("debug.txt", true)) { fw.write("响应码: " + prev.getResponseCode() + "\n"); fw.write("结果: " + SampleResult.getResponseData() + "\n"); } vars.put("debugPath", "文件路径: debug.txt"); // 存储路径到变量 ``` > **优势**:保存完整响应数据,适合分析复杂数据结构。 #### 3. **断言强制中断** ```java // 在 BeanShell Assertion 中设置中断点 if (vars.get("debugFlag").equals("true")) { Failure = true; // 强制标记为失败 FailureMessage = "调试中断点 | 变量值: " + vars.get("targetVar"); Response.setStopThread(true); // 停止当前线程 } ``` > **技巧**:通过变量控制调试开关,触发后可在「查看结果树」中检查现场状态。 #### 4. **变量注入检查** [^2][^4] ```java // 1. 添加调试变量 vars.put("DEBUG_step1", intermediateValue); // 2. 使用 Debug Sampler 组件 // 添加 → 取样器 → Debug Sampler ``` > **操作**:在脚本关键节点注入临时变量,通过 **Debug Sampler** 组件查看所有变量快照。 #### 5. **外部库断点调试** [^4] 1. 将 `bsh-debug.jar` 放入 `jmeter/lib/ext` 目录 2. 在脚本中加入断点: ```java import bsh.debug.Debug; Debug.setDebugMode(true); // 启用调试模式 Debug.breakPoint(); // 设置断点(执行暂停) ``` > **限制**:需重启 JMeter,且可能影响性能,仅适用于复杂问题。 #### 调试流程建议 1. **简化脚本**:先注释复杂逻辑,逐步启用代码块 2. **隔离测试**:使用 **Test Fragment** 单独调试脚本 3. **结果分析**: - 使用 **View Results Tree** 查看请求/响应 - 在 **Response Data** 标签页检查脚本输出 - 筛选 **Log Viewer** 中的 `DEBUG` 级别日志 > 关键点:优先使用内置日志变量注入,复杂场景结合文件记录外部调试库[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值