2024年3月14日发(作者:)
Jmeter性能测试方法
By 杨会会 2011-11-15
目前进行性能测试的工具有很多,LoadRunner,就是常用的性能测试工作,它功能强
大,有强大的分析工具,但是安装起来却费事又费力。而jmeter是一个轻量级的代理LR
的性能测试工具。
与LR区别
Jmeter
都是通过中间代理,监控&
收集并发客户端发现的指
令,把他们生成脚本,再发
送到应用服务器,再监控服
务器反馈的结果的一个过
程.
有
简单
无
Proxy Server(代理服务
器)来录制生成测试脚本
的功能,但是这个功能并
不好用,测试对象的个别参
数却要手工增加上去,还得
附带装个IE代理,来捕捉
参数,或者使用badybody
工具
比较少,需要借助其他工
具监控服务器资源
可以
开源,免费
不依赖编程,简单
LoadRunner
同Jmeter原理
分布式中间代理功能
安装
IP欺骗
录制
有
1G+大小,安装麻烦
有
比较强大
报表
web程序的功能测试
版本
脚本修改
比较强大
只能做性能测试
商业软件,付费
除了复杂的场景设置外,
还需要掌握函数,修改脚
本
简介
Apache Jmeter是一个100%的纯java桌面应用,用于压力测试和性能测试。Jmeter最
早是为了测试Tomcat的前身JServ的执行效率而诞生的,主要是针对web的压力和性能测
试,但后来扩展到其他测试领域。从下面的图中我们可以看到:Jmeter可以用于测试
FTP、HTTP、RPC、JUNIT、JMS、LDAP、WebService(Soap) Request以及Mail和JDBC(数据
库压力测试)。
同时, JMeter可以帮助你对你的应用程序进行回归测试. 通过你创建的测试脚本和
assertions来验证你的程序返回了所期待的值. 为了更高的适应性, JMeter允许你使用常
规表达式来创建这些assertions.
3.性能测试的流程
性能测试的流程都差不多,搭建环境,设计场景,找到适合的工具,录制编写脚本,
进行测试,最后对结果进行分析。下面就针对整个流程进行讲述。
3.1.搭性能测试环境。
性能测试的环境要在合适的机器上搭建,首先机器不能配置太差,比如虚拟机之类的
就最好不要是用了。其次机器不要运行的程序太多,空机器就最好了。如果是为了测试线
上机器的使用,最好在线下配置与线上的环境有相近的CPU核数,内存大小等。
3.2.确定测试场景
根据项目的特定,跟PM与RD,最好叫上OP确定需要测试的场景。需要多少人并发,
并发多长时间。以及可以接受的数据,比如50人并发,登录按钮反应时间在3s内可接受
等,这些数据是我们进行性能测试的参考。根据这些数据,可以确定压力的极限,并推测
机器的负载。
3.3.录制脚本
搭建好环境,确定场景之后,就是录制脚本的阶段了。这里选择jmeter作为性能测试
工具。下文会详细介绍如何使用jmeter进行性能测试。
3.4.编辑脚本
录制好的脚本中,经常会有一些我们测试不需要的数据和流程,这就需要对这些进行
删除,比如图片,css或者js文件的反应等。如果需要用户cookie的,在线程组中增加
cookie管理器。增加当时的用户cookie。
3.5.性能测试
编辑好脚本之后,根据确定的场景,就可以进行性能测试了。
性能测试除了要得到工具给我们的分析结果(平均反应时间,吞吐量,错误率等)之
外,我们还需要监控一些机器的性能。常见的需要监控的机器性能指标有:
CPU_IDEL,MEM_USED,磁盘读写IO,网络传包速率。如果项目还使用了数据库,还可以监
控主从数据库的磁盘读写IO,网络传包速度等。这些数据对我们下面进行的结果分析有很
大的用处。
3.6.结果分析
进行性能测试的结果分析并不是一件简单的事情。首先要根据已有的标准,查看平均
反映时间,吞吐率等是否符合标准。如果不符合标准,就要查看问题出在哪里,这就需要
上面我们提到的指标来综合分析了。 比如CPU_IDEL,MEM_USED的变化情况反映了压力期
间cpu和内存的使用情况,而磁盘IO则反映了项目是否进行了频繁的数据读写操作。网络
传包率而是查看压力期间网络传包的变化。再综合数据库机器的变化,判断问题的瓶颈所
在。如果自己分析不了,最好和rd,op一起进行分析。
进行web性能测试方法
了解了性能测试的方法,再选择一个合适的工具,就可以开展性能测试了。
安装和启动
4.1.1Jmeter安装
Jmeter官网:/jmeter/。从官网下载下来之后,直接
解压即可。
4.1.2Jmeter启动:
Jmeter启动有两种方式,GUI类型和命令行类型。
1)GUI类型,只要双击%JMETER_HOME%/bin下的即可。
2)命令行类型:这种方式是jmeter经常使用的启动方式。由于使用GUI类型容易发生日
志过大导致java内存溢出的错误,通过命令行启动,可以等到运行完毕之后,再查
看日志,就避免了滚动的庞大日志记录。
命令行启动jmeter,需要调用jmeter命令,且给出jmx所在位置和日志所在位置。
Jmeter的命令行参数如下所示:
-n This specifies JMeter is to run in non-gui mode
-t [name of JMX file that contains the Test Plan].
-l [name of JTL file to log sample results to].
-r Run all remote servers specified in ties (or remote
servers specified on command line by overriding properties)
The script also lets you specify the optional firewall/proxy server
information:
-H [proxy server hostname or ip address]
-P [proxy server port]
例如常用的命令行启动如下:jmeter -n -t E:项目support机器服用压力测试2011-
-l E:项目support机器服用压力测试2011-10-
脚本录制
4.2.1BadBody录制
网络上很多文章推荐使用badbody进行录制,但是badbody录制的脚本转到Jmeter之
后,会出现不能兼容的情况,发生很多错误。对于一般页面的录制,笔者还是希望通过
jmeter自带的录制工具进行录制。如果出现jmeter不能录制的情况,可以参考badbody录
制,badbody录制网络上资料很多,这里不作详细介绍。
4.2.2Jmeter脚本录制
1、新建一个测试计划,并在线程组中添加逻辑控制器-录制管理器。
2、在工作台中添加非测试单元-http代理服务器。
3、端口:即代理服务器的设置端口,一般设为8080.
目标控制器:测试计划->线程组
分组:每个组放入一个新的控制器。
4、取样器之间还可以设置一定的延迟,也可以不设置。设置延迟的方法:
在HTTP代理服务器中添加定时器-高斯随机定时器(用于告知Jmeter来在其生成的
HTTP请求中自动的增加一个定时器)。定时器将会使相应的的取样器被延迟。 延时的规
则是,在上一个访问请求被响应并延时了指定的时间后,下一个被定时器影响的取样访问
请求才会被发送出去。
如果在代理服务器元件里使用了高斯随机定时器,就应该在其中的固定延迟偏移
(Constant Delay Offset)设置项里添上${T}(用于自动引用纪录的延迟时间)。
5、代理服务器设置:打开浏览器,打开Internet选项,将局域网(LAN)设置中的代理
服务器设为localhost,端口为在代理服务器中的端口:
6、启动代理服务器,进行录制。
点击jmeter中代理服务器的启动即可。然后再代理浏览器中操作,jmeter会录
制下操作的过程。
4.3.脚本的编辑
录制下来的包括很多文件,比如js,css,jpg等都包含在内。这就需要我们手动对录
制的脚本进行编辑,删除这些不用的文件。针对特定的ajax请求或者do请求进行测试。
如下即为笔者对脚本编辑后的结果。
4.4.增加cookie管理器
某些测试的方法,需要使用用户cookie才能进行。此时就要增加cookie管理器。
Cookie Manager有两个功能。第一个功能是:它存储和发送cookies。如果你有一个请求,
同时返回的信息中包含cookie,这个cookie Mnager会自动保存下来并且用在未来与这个
网站相关的请求中。第二个功能是:你可以手工在上述页面显示的地方添加一个cookie,
手工添加的这个cookie会被Jmeter 所有的线程共享。
4.5.压力测试
Jmeter通过启动多个线程来模拟虚拟用户,实现并发。当录制编辑好脚本之后,就可
以设置并发用户量,以及压力的时间了。
这里几个重要参数的意义如下:
线程数:并发的用户数。
RampUpPeriod (in seconds):即全部启动线程的时间。比如线程数为20,RampUpPeriod
为50,即50/20=2.5,每2.5s增加一个线程。
循环次数:当前线程组下脚本运行循环次数;“ 永远”选项,无限次循环。
调度器:设置了压力测试的启动时间,结束时间,和持续时间,以及启动延迟。
4.6.增加断言判断
Jmeter进行测试的时候,有时候,我们需要确定jmeter究竟有没有正确的工作。因
为有时候,我们利用监听器查看的时候,监听器返回的结果是正确的,但是,实际上,我
们发送的请求中的有些参数可能是错误的,系统并没有按照我们预期的方式进行相应,这
个时候,就需要利用断言进行判断返回的请求是否正确。
添加断言的步骤如下:
(1)添加断言首先要知道正确的请求反应结果是什么,可以先添加监听器—查看结果树,
运行一次,没有出错误的情况下,查看“响应数据”,再根据这个确定监听结果。
(2)在对应的方法上添加断言:我们可以根据自己的需要选择要测试的响应字段,文本,
还是代码,一般选择响应文本,然后,我们选择匹配规则,一般选择“包含”,如果要精
确匹配,则可以选择“匹配”,但是选择“匹配”,因为响应的内容一般还包含其他的信
息,比如html语言标签,所以很难准确匹配。
(3)添加断言结果。
添加好断言后,要添加一个监听器,以监听响应断言,选择添加——监听器——断言
结果,则,如果在执行的时候,http请求返回的数据符合添加的断言内容,断言结果则为
运行成功的灰色,否则,则为运行失败的红色。
4.7.结果分析图表
4.7.1.聚合报告
聚合报告是常用的结果分析图表。此图表记录了我们经常用到的指标:压力测试的平
均响应时间,90%响应时间,吞吐量以及错误率等。
Label:取样器名称
Samples:运行时得到的取样器响应结果个数
Average:所有取样器结果的响应时间平均值
Median:所有取样器结果的响应时间中间值
90%Line:所有取样器结果的响应时间 90%线
Min:所有取样器结果的响应时间最小值
Max:所有取样器结果的响应时间平均值
Error%:出错的取样器结果占所有取样器结果的比例
Throughput:每秒钟响应的取样器结果个数
KB/sec:每分钟响应的数据流量
4.7.2.查看结果树
结果树显示了请求的取样器,请求和响应结果。可以通过错误的响应结果来定位
错误。
的其他功能
Jmeter还具有一些其他的功能,测试的时候根据需要,可以随时添加,这里简单做以
介绍。
参数化设置
jmeter支持参数化设置。尤其是当进行web性能测试的时候,对http请求的参数进行
设置,能通过csv文件对参数赋值。
用户参数处可添加各种变量。添加的变量可以在后续的请求中使用,比如请求所带的
参数等。比如名称处可添加为:userId,那么在用户_1处可添加函数:$
{_StringFromFile()。为Jmeter的bin目录下存放的一个文件。此
时在请求中我们就可用这个变量userId了。用法为${userId}。
4.8.2.数据库服务器的性能测试
数据库服务器在大多数企业项目中是不可缺少的,对于它进行压力测试是为了找出:
数据库对象是否可以有效地承受来自多个用户的访问。这些对象主要是:索引、触发器、
存储过程和锁。通过对于SQL语句和存储过程的测试,JMeter 可以间接的反应数据库对象
是否需要优化。
JMeter 使用 JDBC 发送请求,完成对于数据库的测试。一个数据库测试计划,建立如
下结构即可:
其中:
JDBC连接配置,负责配置数据库连接相关的信息。如:数据库url、数据库驱动类
名、用户名和密码等等。在这些配置中,"绑定到池的变量名"(Variable Name
Bound to Pool)是一个非常重要的属性,这个属性会在JDBC请求中被引用。通过
它, JDBC请求和JDBC连接配置建立关联。(测试前,请将所需要的数据库驱动放
到JMeter的classpath中)。
JDBC请求,负责发送请求进行测试。
图形结果,收集显示测试结果。
在实际的项目中,至少有2种类型的JDBC请求需要关注:select语句和存储过程。前者反
应了select语句是否高效,以及表的索引等是否需要优化;后者则是反应存储过程的算法
是否高效。它们如果效率低下,必然会带来响应上的不尽如人意。对于这两种请求,JDBC
请求的配置略有区别:
Select语句
存储过程
如果对于Oracle,如果测试的是函数,那么也可以使用select语句来进行配置,此
时可以使用:select 函数(入参) from dual形式的语句来测试,其中dual是oracle的关
键字,表示哑表。对于其它厂商的数据库产品,请查找手册。
服务器的性能测试
支持对JMS服务器进行性能测试。这部分笔者没有尝试过,故不详细介绍。如有需要,
请查阅相关文档。
4.8.4.逻辑控制器
Jmeter有很多逻辑控制器,控制请求的发送顺序。比较常用的逻辑控制器有:
1)ForEach控制器
图17
ForEach控制器通过一系列相关变量的值来完成循环。当你为ForEach控制器添加一
个采样器时,每个采样器会在变量有新的值的时候进行循环一次或多次。输入需要包含好
几个变量,每个变量会用下划线(_)或数字来扩展。每个这样的变量必须有值。比如输入变
量的名字为inputVar,那么下边的变量就需要被定义了:
inputVar_1=wendy
inputVar_2=Charles
inputVar_3=peter
注意:下划线是可选的。
当输出变量名称为“returnVAr“时,在ForEach控制器下的采样器会执行三次,如果各自
会返回如上述所定义的能够在采样器中使用的变量的话。
名称,注释:定义了控制器的名字并可添加注释。
输入变量名称:可被用作输入的变量名称的前缀。
输出变量名称:可用于在采样器的循环中做替换的变量名称。
2)If控制器
图18
If控制器用利器用来控制子元素(它的子孩子)是否会运行。
在2.3版本以前,这个条件会对每个元素进行检测,但由于某些时候会导致一些非预期的
行为,因此在2.3RC3版本后改为只检测进入时候的条件了。
名称,注释:if控制器的描述和注释。
条件:默认是java,并且返回true或false。
Evaluaete for all children:是否作用于所有的子元素。
3)Incluede控制器
图19
该控制器用于引用一个外部的jmx文件。如果要使用它,可选在一个简单控制器里增
加采样器,然后保存这个简单控制器为一个jmx文件。然后这个文件就可以使用在另一个
测试计划里了。这个测试计划不能包含线程组,它只能包含一些简单的控制器和采样器。
4)交替控制器
图20
交替控制器的作用就是让控制器里面的子采样器交替实现。比如交替控制器外有个采样器
A,交替控制器有子采样器B和C。那么交替控制器会执行A,B,然后A,C。
5)简单控制器
图21
简单控制器的作用在于让你能够把采样器管理起来,方便与其它的控制器进行交互。它除
了提供一个存储的功能之外,没有其它的功能。
6)循环控制器
图22
如果你添加了循环控制器,循环控制器里面的子元素将会按照循环控制器里面设定的
次数进行循环请求。
7)Runtime Controller
该控制器控制在该子控制器下的元素执行的时间。有两个配置。
Name:该控制器的名称。
Runtime:运行时长,单位为秒。
8)While Controller
图23
该控制器当且仅当他的条件部分为false的时候才运行其子元素。
4.8.5.定时器
定时器的作用在于请求的过程中,提供请求与请求之间的时间间隔,或者到了一定的
吞吐量之后如何发送请求之类的。总之,它的作用在于在多个请求之间提供一些时间控制。
5.总结
Jmeter使用简单,方便上手,对于一般的性能测试通过上述流程就可以很快实现。但
是它不能对服务器资源进行监控,在测试过程中,需要借助于linux top命令或者noah对
服务器资源进行监控。
有资料查阅说也可以通过编写xml脚本使用jmeter线程组的方法对服务器资源进行监
控,具体的实现方法有待进一步研究。


发布评论