JMeter实现load distribution

简介:
JMeter是一个优秀的负载测试软件,作为一款开源测试工具,从功能上来说,JMeter并不比昂贵的LoadRunner工具缺少太多功能。只是JMeter在UI方面的粗糙和过于灵活的扩展性,导致很多人对其失去信心。
        LoadRunner和其他的商业负载测试工具都有一个“设置用户场景”的功能,该功能允许用户指定一个场景,在该场景中,让指定的用户负载按照一定比例进行分配,例如,我们可以设置一个场景,该场景包括三个测试脚本A,B,C,在场景中可以指定场景的总虚拟用户数为100,其中30个用户(30%)运行A脚本,20个用户(20%)运行B脚本,而50个用户(50%)运行C脚本,这种场景的方式可以很好的模拟真实用户的负载,起到较好的测试效果。
        而JMeter采用的是和大部分商业负载测试工具不同的树状结构来组织负载测试,通过线程组(thread group)、Sampler,以及控制器(Controller)来控制负载测试的进行,于是很多初次使用JMeter的朋友就会认为,JMeter无法支持上文提到的“用户场景”,转而放弃使用该工具。
        其实,JMeter虽然只提供了线程组、sampler、控制器等看似简单的元件(element),但通过这些元件的组合,JMeter可以实现相当强大的功能。接下来,我们就来看看如何通过这些元件,在JMeter中实现和LoadRunner等商业负载测试工具相同的“用户场景”功能。
        说明:以下内容建立在对JMeter的一定了解的基础上,如果不熟悉JMeter的话,不妨先google一下JMeter相关的内容,当然,最好的了解JMeter的方法是通过JMeter自己网站上的手册(英文内容)。
        在JMeter中实现“用户场景”的最主要的元件是“SwitchController”和“Beanshell Sampler”。“Beanshell Sampler”是JMeter中比较灵活的一个Sampler,和普通的Sampler不同,该Sampler并不是简单的发送一个指定协议的数据包,而是可以通过beanshell脚本语言来控制该Sampler的行为(请至 http://www。beanshell。org/查看beanshell相关的信息,简单来说,Beanshell是一个基于Java的交互式脚本语言,可以很好的内嵌在其他软件中。Beanshell的语法很类似Java,但比Java更简单和简洁)。需要注意的是,由于license问题,JMeter的binary并没有包含Beanshell解释器的binary,用户需要自行从 http://www。beanshell。org/上下载beanshell的解释器(一个jar包)并拷贝到JMeter安装目录的lib目录下。
        而“Switch Controller”则是JMeter中的一个简单的控制器,该控制器的作用仅仅是根据给定的参数的值决定执行该控制器下的哪一个分支。


        注意Switch Controller的“Switch Value”的取值,当该值为0时,线程组在执行到SwitchController之后,接下去执行该节点下的第一个子项,也就是Google。cn这个Sampler;如果该值为1,显然被执行的就是Sina。com。cn这个子项。假设在线程组执行的过程中,每次执行到Switch Controller的时候,我们可以控制SwitchValue的值,则自然就可以控制该Controller下的Sampler的执行次数,也就可以实现我们前文描述的“用户场景”了。
        那么,究竟如何来控制Switch Value呢?JMeter本身是支持变量的,因此,我们可以将Switch Value指定为一个变量,然后使用一段脚本代码来修改该变量的值即可。
         前文我们已经讲到了Beanshell Sampler,我们可以使用该Sampler来产生不同的Switch Value。例如,以下的这段Beanshell代码就可以以一定的概率分别产生0-2之间的整数值:
  1. int rd = Math.random() * 10;

  2. if (rd < 6) 
  3.    vars.put("RAND", "0");
  4. else if(rd < 8)
  5.    vars.put("RAND", "1");
复制代码
        从代码中可以看到,该段代码使用了Java的random函数产生一个[0, 10)之间的整数,当产生的整数位于[0, 6)时给变量$RAND赋值为0;当产生的整数位于[6, 8)时给变量$RAND赋值为1;否则赋值为2。因为random函数本身的随机性可以得到保证,因此很容易计算得出,这段代码将变量$RAND设置为0的概率是60%,设置为1的概率是20%,设置为2的概率也是20%。




        接下来我们在该Switch Controller下给定三个JavaRequest Sampler来测试一下,看看这个测试计划是否能够按照我们的预期方式执行(三个Java Request Sampler的Label分别是“0”,“1”,“2”)。


        从结果中可以看出,$RAND函数被置为0,1,2的次数的确是60%,20%和20%(肯定会有一定的误差,不可能100%精确)。
后记
        JMeter作为当前应用最广泛的负载测试工具之一,其灵活性和可扩充性是最大的优势,商业负载测试工具能够实现的功能,90%以上JMeter都可以实现。而且,JMeter还可以通过简单的方式扩充Sampler来支持各种不同的协议。








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
Apache JMeter 中的 Latency 和 Load Time
Apache JMeter 中的 Latency 和 Load Time
Apache JMeter 中的 Latency 和 Load Time
EMQ
|
消息中间件 自然语言处理 Java
JMeter 扩展插件实现对自定义协议的支持
本文作为JMeter拓展开发的第四期内容,将以扩展一个简单的Apache Kafaka Producer Sampler为例,介绍如何使用JMeter扩展插件实现更完善的新协议插件。
EMQ
266 0
JMeter 扩展插件实现对自定义协议的支持
EMQ
|
Java 测试技术 Linux
JMeter 扩展开发:BeanShell 数据模拟实现及性能探讨
本文是开源测试工具JMeter扩展性开发教程第三期,讲解如何采用JMeter内置功能BeanShell实现动态生成测试数据,并探讨其与Java扩展JMeter的实现方式对比。
EMQ
206 0
JMeter 扩展开发:BeanShell 数据模拟实现及性能探讨
|
数据可视化 Java 测试技术
Jmeter快速实现接口测试
Jmeter快速实现接口测试
221 0
|
网络协议 Java 测试技术
又一次对Jmeter TCP Sampler实现的小改动
经历对“动态报文长度”处理后,又一次对JMeter的TCP Sampler作了一次小改
9070 0
|
监控 Java 测试技术
基于Jmeter的性能压测平台实现
很早就想要一套属于自己的性能压测平台,原因是使用了阿里云的性能测试PTS,就挺羡慕能有一个这样的性能测试平台,但毕竟人家的东西我们高攀不起(要钱的),而且阿里云的性能测试平台是不支持多种协议的(比如我有一个项目要用websocket测试,结果人家就支持http压测)。
4483 0
jmeter参数化随机取值实现
jmeter能用来做参数化的组件有几个,但是都没有随机取值的功能,遇到随机取值的需求怎么办呢? 突发奇想,可以用函数__CSVRead()来实现: __CSVRead() CSV file to get values from | *alias:表示要读取的文件路径 CSV文件列号| next| *alias:表示当前变量读取第几列数据,注意第一列是0; 由此可见我们只需将参数化数据在csv中横向排列,然后用随机函数__Random()指定文件序列号即可。
2182 0
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
110 3
|
2月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
101 2