JMeter中BeanShell和Java扩展性能之比较

本文版权归xmeter.net 所有。欢迎转载,转载请注明出处。

摘要##

JMeter提供了多种方式来自定义脚本来实现JMeter不支持的功能,常见的方式有插入BeanShell脚本和通过扩展JMeter提供的Java接口,本文通过实现一个简单的功能来比较两种不同的实现方式下对JMeter的性能影响,并对这两种不同的实现方式的使用场景提供推荐。

测试场景##

假设测试脚本需要产生一个长度为1024的随机字符串,字符串产生后将其赋值给一个名为“data”的变量,供后面的Sampler来使用,在本文中使用的是“Dummy Sampler”,该Sampler能让用户手工输入“Request Data”和“Response Data”,使用过程中易于调试和测试。BeanShell版的JMeter测试脚本结构如下。需要注意的是Dummy Sampler不是JMeter标准提供的Sampler,读者如果有兴趣,参见https://jmeter-plugins.org 安装步骤将其安装到你的JMeter中。

完成的测试计划

BeanShell Preprocessor中的代码如下,生成了随机字符串后将值赋值给变量“data”。
BeanShell代码

在Dummy Sampler里的“Response Data”输入框中传入变量“data”,如下图所示。

在Dummy Sampler中使用BeanShell中生成的变量

Java扩展JMeter的实现方式下,测试脚本的基本结构与上类似,如下图所示,不一样的地方是把“BeanShell Preprocessor”替换成了“User Parameters”。

使用扩展function方式生成的测试计划

“User Parameters”下加入一个变量,该变量的值是自定义扩展的一个函数 - “${__MyRandomFunc()}”。

调用自定义的function

该自定义函数MyRandomFunc的实现方式如下所示,具体请参见这篇文章来学习如何扩展自定义函数。

自定义function代码的实现

测试配置##

测试运行之前,将两个测试用例的ThreadGroup的数目设置成100,每个Thread运行100次。
测试机器是在青云上申请的标准虚机:
1)2核CPU*2GB内存
2)20GB硬盘
3)操作系统CentOS 7,64位
4)Java版本是Open JDK 8
5)JMeter版本是3.0

JMeter测试采用非UI方式运行。

测试结果##

BeanShell执行完测试约用了1分18秒左右,控制台打印出的测试结果如下。JMeter进程CPU使用率为137%,内存使用率为14%.

summary + 2802 in 00:00:23 = 120.6/s Avg: 276 Min: 50 Max: 516 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary + 4138 in 00:00:30 = 138.1/s Avg: 275 Min: 50 Max: 506 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 6940 in 00:00:53 = 130.5/s Avg: 275 Min: 50 Max: 516 Err: 0 (0.00%)
summary + 3060 in 00:00:24 = 125.9/s Avg: 276 Min: 50 Max: 502 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 10000 in 00:01:18 = 129.0/s Avg: 276 Min: 50 Max: 516 Err: 0 (0.00%)

Java扩展JMeter的实现方式执行完测试约用了32秒,控制台打印出的测试结果如下。JMeter进程CPU使用率为50%,内存使用率为5%.

summary + 6544 in 00:00:19 = 348.5/s Avg: 273 Min: 50 Max: 501 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary + 3456 in 00:00:14 = 252.6/s Avg: 277 Min: 50 Max: 501 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 10000 in 00:00:32 = 308.1/s Avg: 274 Min: 50 Max: 501 Err: 0 (0.00%)

由测试结果可以看到Java扩展JMeter方式下执行时间,CPU、内存占用率比BeanShell方式下占明显的优势。读者需要注意的是Avg,Min和Max指的是“Dummy Sampler”的统计数据,两种使用方式下Dummy Sampler的执行时间都是一样的,而吞吐量后者比前者多了将近1倍,原因就在于测试步骤中的第一步的不同实现方式下,后者比前者快了很多。

使用建议##

BeanShell是JMeter内置的功能,但是由于它是脚本语言,动态加载执行的,因此效率不是很高,不太适合于在经常执行的场景下,比如将BeanShell放在循环内部,不断地被执行。比较适合的应用场景是放在执行一次、或者少数几次的地方,比如在循环外部读取配置文件内容等。

而Java扩展JMeter的实现方式的效率比较高,适合于放在经常执行的测试步骤中,但是由于它不是JMeter内置的功能,扩展起来需要有些工作量,而且部署的时候也比较麻烦(分布式运行的时候需要将自定义的JAR拷贝至所有的机器上)。读者根据自己的使用场景来选择适合自己的自定义脚本的方式。

关于我们##

XMeter成立于2016年,核心团队都来自于IBM,是一家领先技术的性能测试持续集成咨询与服务提供商。我们致力于提供给客户可靠,简单,低成本的性能测试解决方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文版权归xmeter.net所有。欢迎转载,转载请注明出处。原文请参见这里。 摘要 在利用JMeter实施性能测...
    XMeter性能测试云服务阅读 11,672评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,399评论 19 139
  • 一、基本概念 1.测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。 2.线程...
    Leo_0626阅读 6,848评论 0 10
  • 在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对于CPU和内存的消耗比较大,所以,当需...
    燕京博士阅读 9,642评论 0 16
  • 【手写爱情绘本6.0】一个人总是仰望和羡慕着别人的幸福,一回头,却发现自己正被仰望和羡慕着,其实每个人都是幸福的。...
    主播亚东阅读 1,618评论 0 0