JMeter介绍
JMeter是Apache下一个类似LoadRunner的开源性能测试项目,可用用来对静态的和动态的资源(如:files, Servlets, Perl scripts, Java Objects, Data Bases and Queries, FTP Servers)的性能进行测试.
可对以下类型服务进行性能测试:
Web - HTTP, HTTPS
SOAP
Database via JDBC
LDAP
JMS
Mail - POP3(S) and IMAP(S)
官方网站http://jmeter.apache.org/
基本概念
测试计划:
使用JMeter进行测试的起点,是其它JMeter测试元件的容器
线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。
取样器(Sampler):模拟各种请求。所有实际的测试任务都由取样器承担,存在很多种请求。如:HTTP 、ftp请求等等.
监听器:负责收集测试结果,同时也被告知了结果显示的方式。功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。
断言: 用于来判断请求响应的结果是否如用户所期望,是否正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于测试的有效性非常有用.
定时器:
负责定义请求(线程)之间的延迟间隔,模拟对服务器的连续请求。
逻逻辑控控制器:
允许自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列.
配置元件:
维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容.
前置处理器/后置处理器:
负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
构建测试
QuickStart
下载解压后即可打开GUI界面,建立一个简单的JMeter测试计划
首先建立测试线程组,然后添加Sample,这里选择HTTP请求
配置服务器名称为www.meituan.com,方法设置为GET(其它如POST,PUT,DELETE均支持)
这里我们添加监听器-查看结果树方便查看发送的请求内容及返回结果,运行测试,通过查看结果树即可看到发送请求及响应数据,其它常用的处理结果的监听器有图形结果,聚合报告,Aggregate Graph等。
参数化
实际的测试场景往往不是上述这么简单,比如GET,POST,PUT,DELETE时往往会带有不少参数,而在进行性能测试时我们希望这些参数在指定的范围内或为我们指定的值,这时候就需要对请求进行参数化,下面是一些常用的参数化方法。
数据文件
通过添加配置元件-CSV Data Set Config从外部文件中导入参数
filename可直接只填名字,默认位置为测试计划配置文件(jmx)所在路径
Encoding:有中文时需要填,一般不用
Vaiable Names:文件中各列所表示的参数项;各参数项之间利用逗号分隔;参数项的名称应该与HTTP Request中的参数项一致
Delimiter:如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t
Recycle on EOF:True=当读取文件到结尾时,再重头读取文件 False=当读取文件到结尾时,停止读取文件
Stop thread on EOF: 当Recycle on EOF一项为False时起效;True=当读取文件到结尾时,停止进程
配置好上述csv之后即可在请求中直接引用
可配置多个csv文件,也可在一个csv文件中配置多项
利用函数
Jmeter中可以产生值的函数有:
Random( , , ),threadNum,CSVRead( , ),_StringFromFile( , , , ) 等,利用上述函数可用很方便的产生随机参数
【说明】关于Jmeter的函数使用,可以用Jmeter的函数助手对话框:点击Jmeter的“选项”,选择“函数助手对话框”(或者使用快捷键“Ctrl+F”),在“选择一个功能”的下拉框中选择你所要是有的函数,在函数参数列表的“值”这一栏,填写好相应的参数值,点击按钮【生成】,就可以拷贝生成的函数字符串进行使用了。
利用函数的使用方式与上述方式相同,将value替换为该生成的函数字符串即可,如图
关联
在需要获得数据的请求上右击添加一个后置处理器,并设置引用名称即可,如图现在有如下两个请求add,update,我们希望第二个请求能update刚才添加的数据,add请求执行成功后会返回id,则可以給add请求添加后置处理器获取该值然后在update请求中直接引用
{"data":{"id":2078585},"paging":null}
在之后的请求中直接通过${id}即可引用该值。
脚本录制
通过上述GUI配置方式得到的测试方案会以jmx文件的方式进行保存,实际测试时只需要该jmx文件即可,如果需要测试很多功能,采用手动配置方式就显得不太方便,通过利用Badboy进行脚本录制可以很方便的得到jmx文件,然后调整修改加入参数化内容即可得到我们最终需要的测试方案。
Badboy是用来录制操作过程的,它录制的结果是被jmeter做并发测试的素材使用。
Badboy官方网站
http://www.badboy.com.au
查看结果
如下图为通过Aggregate Graph看到的测试结果,可以根据情况选用多种监听器来获取测试结果
自动化
JMeter也可以用命令行的方式执行,并纪录执行结果到文件,然后再进行处理导出性能数据及图表。
JMETER_HOME=apache-jmeter-2.6
JMETER_JAR=$JMETER_HOME/bin/ApacheJMeter.jar
java -jar $JMETER_JAR -n -t poi.jmx -l poi.jtl
-n 制定JMeter运行在non-gui模式下
-t 包含测试计划的JMX文件的名称
-l 用于记录简单结果的JTL文件名称
预先设置好JMeter测试运行环境之后,可以方便的通过脚本自动执行性能测试,并将执行结果纪录到jtl文件,经过处理后得到性能数据及图表并进行展示。
运行测试,纪录结果到JTL_FILE.jtl文件
java -jar $JMETER_JAR -n -t $PLAN_JMX -l $JTL_FILE.jtl
利用perl脚本对结果进行处理并绘制性能数据图
perl $JMETER_GRAPH_PL -alllb $JTL_FILE.jtl
JMETER_GRAPH_PL日志处理脚本,来源于官网社区
http://dl.iteye.com/topics/download/58263d68-ea27-393c-b2e7-6dc595d44595
响应时间范围分布图,x轴为请求数量,颜色区分不同时间范围,比如小于20ms的显示为绿色
具体请求的响应时间及每分钟流量
其它
JMeter功能强大的前置,后置处理器,也许可以用来实现对接口/功能的白盒自动化测试,预先录制好脚本,同时根据测试需求添加好前置,后置处理器如正则表达式对响应结果进行验证,再通过脚本对测试结果进行分析,输出接口/功能的验证结果,集成到CruiseControl中进行展示。