JMETER
二、使用JMeter新建测试计划
1. 添加线程组:打开JMeter后右键单击“测试计划”,选择“添加”-“Threads(Users)”-“线程组”。添加线程组后单击线程组,即可设置线程组的线程数、Ramp-Up Period(in seconds)、线程循环次数这些属性。线程数代表同时向服务器发起请求的并发数;全部线程启动时间是所有的线程全部处于启动状态的时间。如:线程数为200,启动时间为250,那么每秒启动的线程数就是:250/200=1.25;循环次数为每个线程循环的次数。每个线程循环该次数之后就停止。
2. 添加计数器:右键单击线程组,选择“添加”-“配置元件”-“计数器”。单击计数器即可设置计数器的属性。“启动”代表计数器的初始值。“最大值”代表计数器最大能达到的值。“引用名称”为其他功能模块引用此计数器的名称。
3. 添加用户定义的变量:右键单击线程组,选择“添加”-“配置元件”-“用户定义的变量”。单击新添加定义的变量,在此界面可以添加自己定义的变量并赋值,其他功能便可以引用。引用格式为
4. 添加HTTP信息头管理器:右键单击线程组,选择“添加”-“配置元件”-“添加HTTP信息头管理器”。单击新添加的管理器,在此界面可以添加Content-type,即发送报文类型。值我们设置为:text/xml。
5. 再添加两个自定义的变量,一个是Server Configuration,即服务器地址参数。里面的变量分别是:HOST= 192.168.1.235、PORT= 8028、URL= mlet/mlet。另外一个是请求编号,所有的请求编号都添加到里面,以方便其他功能的引用。
6. 添加BeanShell PreProcessor:右键单击线程组,选择“添加”-“前置处理器”-“BeanShell PreProcessor”。在Script中写:[vars.put("USER_NAME","user"+vars.get("counter")+"@163.com");](中括号内部分)。此即为每次调用之前将USER_NAME的值设置为user+计数器数+@163.com。以达到模拟多用户的效果。
7. 添加固定定时器:右键单击线程组,选择“添加”-“定时器”-“固定定时器”。其中唯一的属性:线程延迟为每个线程的连续请求间隔时间,即线程的“思考时间”。
8. 添加简单控制器:右键单击线程组,选择“添加”-“逻辑控制器”-“简单控制器”。
9. 添加SOAP/XML-RPC Request:右键单击简单控制器,选择“添加”-“Sampler”-“SOAP/XML-RPC Request”。在URL中写:http://${HOST}:${PORT}/${URL}?protocol=${REQUEST_CODE}。即为之前定义的变量名。所有的变量名在引用时均需加${}。
- 添加“正则表达式提取器”:右键单击简单控制器,选择“添加”-“后置处理器”-“正则表达式提取器”。本例中此功能用于提取每个线程的每次循环的sessionID。故在正则表达式中写:[JSESSIONID=([a-zA-Z0-9]+);] (中括号内部分)。模板中写:$1$。此正则表达式仅在初始化报文中存在,其他功能引用提取的sessionID即可。
- 添加“断言持续时间”:右键单击简单控制器,选择“添加”-“断言”-“断言持续时间”。本例中持续时间设置为2000毫秒,即请求发送后需要在2秒内收到服务器的回复,否则报错。
- 添加“聚合报告”:右键单击线程组,选择“添加”-“监听器”-“聚合报告”。聚合报告中的每列解释如下:
Label |
说明是请求类型,如Http,FTP等请求。 |
#Samples |
也就是图形报表中的样本数目,总共发送到服务器的样本数目。 |
Average |
也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。 |
Median |
也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。 |
90%line |
是指90%请求的响应时间比所得数值还要小。 |
Min |
是代表时间的数字,是服务器响应的最短时间。 |
Max |
是代表时间的数字,是服务器响应的最长时间。 |
Error% |
请求的错误百分比。 |
Throughput |
也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。 |
KB/sec: |
是每秒钟请求的字节数。 |
- 添加“查看结果树”:右键单击线程组,选择“添加”-“监听器”-“查看结果树”。结果树左侧为所有已经发送的请求,绿色为正常,红色为有错误。单击红色的请求即可看到错误原因,在右侧显示具体返回值。
- 添加“图形结果”:右键单击线程组,选择“添加”-“监听器”-“图形结果”(本例中选择第二个,第一个图形结果没有认识显示)。图形结果图释如下:
样本数目 |
是总共发送到服务器的请求数。 |
最新样本 |
是代表时间的数字,是服务器响应最后一个请求的时间。 |
吞吐量 |
是服务器每分钟处理的请求数。 |
平均值 |
是总运行时间除以发送到服务器的请求数。 |
中间值 |
是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。 |
偏离 |
表示服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。 |
三、运行JMeter
全部配置好之后单击“运行”-“启动”。JMeter右上角的数字代表已启动线程数/所有线程数。绿色块代表还有线程在运行。当所有线程都循环完毕后,绿色变为灰色。此时查看各结果即是最终值。
四、经验心得
线程组的启动时间:一般数据量不大的时候可以设置为1秒启动一个线程或1秒启动多个线程。实际应用中发现若样本总数超过10万条,当发送样本超过10万左右时JMeter测试端发送的样本速度变得极慢(每秒2-6个),同时服务器返回响应正常,并无错误。将线程启动时间调大可缓解此情况(设置为1.5秒或更长时间启动一个线程)。怀疑此为JMeter本身内存调用问题。
简单控制器:添加简单控制器是按照实际的操作顺序来添加的,JMeter测试时也会按从上到下的顺序依次发送请求。
错误:因受业务逻辑影响,某功能点可能基于之前的功能点,若之前的出现错误则此功能点依旧会错误。在查看错误率时应注意。
五、分布式测试方法
利用JMeter进行负载测试的时候,使用单台机器模拟测试超过1000个行程的并发就有些力不从心,在执行的过程中,JMeter自身会自动关闭,要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 Agent 来分担 JMeter自身的压力,并借此来获取更大的并发用户数,但是需要进行相关的一些修改,具体如下:
1、在所有期望运行 JMeter 作为 Load Generator 的机器上安装 JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。然后运行所有 Agent 机器上的JMeter-server.bat文件——假定我们使用两台机器 192.168.0.1 和 192.168.0.2 作为 Agent;
2、在Controller 机器的 JMeter 安装目录下找到 bin 目录,再找到 JMeter.properties 这个文件,使用记事本或者其他文字编辑工具打开它;
3、在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示运行 JMeter Agent 的机器,这里需要修改为“remote_hosts=192.168.0.1:1099,192.168.0.2:1099”——其中的 1099 为 JMeter 的 Controller 和 Agent 之间进行通讯的默认 RMI 端口号;
4、保存文件,并重新启动 Controller 机器上的 JMeter.bat,并进入 Run -> Remote Start 菜单项,在这里可以看到远程启动菜单下面有192.168.0.1 ,192.168.0.1两个IP地址
5、如果要让某个电脑执行,可以点击改电脑的IP地址就可以,如果两个都要执行,可以点击Run 菜单下的“远程运行全部”菜单
6、有时候用作代理的机器太少,仍不能满足需要,则需要将作为Controller的电脑也当作Agent,则同样需要修改 JMeter.properties文件,将Controller的IP地址写入。同时,这个时候,需要打先打开Controller 电脑中JMeter下bin目录下的jmeter-server.bat,然后再打开JMeter.bat,此时,进入Run -> Remote Start菜单,可以看到Controller也作为远程机器进行运行。
在连接时报:connection refused to host:10.10.90.69 nested exception is...错误,后来发现是启动JMeter-server.bat时就报错了,分析原因是jmeter安装文件放到桌面上有中文字符引起的:解决办法把jmeter挪到其他没有中文字符的地方就ok了。