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之间的整数值:
- int rd = Math.random() * 10;
- if (rd < 6)
- vars.put("RAND", "0");
- else if(rd < 8)
- 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/