Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据显示,测试同步及测试的创建和执行。
Jmeter使用之脚本录制回放
最近一直在用LoadRunner做测试,同时也不忘用Jmeter来实现比较复杂的场景。今天就把我使用中的一些小小技巧做一说明,以备忘。
1、启动。
刚才在家里的机器上下载安装了Jmeter2.02版,启动时总是提示“Error occurred during initialization of VM Could not reserve enough space for object heap”,完了,128M的内存跑不起来一个小小的Jmeter :(。怎么办?修改Jmeter的启动参数“set HEAP=-Xms256m -Xmx256m”“
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m”,改256->56,128->28。这里只是一个小小的插曲,实际使用时不要这么改哦。好了,可以启动了:)2、下面说Jmeter中的脚本录制。
(1)选中Test Plan单击鼠标右键,在弹出菜单中选择Add->Thread Group;
(2)接下来选中WorkBench单击鼠标右键,在弹出菜单中选择Add->Non-Test Elements->HTTP Proxy Server;
(3)在“HTTP Proxy Server”窗口中Target Controller下拉框选择Test Plan > Thread Group(表示脚本生成在这个线程组下),Grouping下拉框选择Put each group in a new controller(表示把每组脚本放到一个新的组中,避免生成的脚本杂乱且无法组织);
(4)单击窗口最下方的Start;
(5)打开浏览器,设置代理服务器的设置为localhot,端口号为8080(在“HTTP Proxy Server”窗口中设置了使用8080端口进行侦听);
(6)在地址中键入要录制页面的URL对页面进行操作,Jmeter就会自动把所进行的操作录制成为脚本了,可以看到Thread Group节点下面多了许多的子节点就是录制生成的脚本;
(7)操作完毕后在Jmeter中单击Stop先停止录制,然后把浏览器的代理设置改为原来的设置即可。
3、运行及记录结果设置
(1)完成脚本的录制后还需要定义你所需的结果设置才算完成了Test Plan的设置,首先要设置Thread Group(相当于虚拟用户组)的属性,单击Thread Group,在右边的窗口中设置Number of Thread(相当于虚拟用户数)为5,Ramp-Up Period(in seconds)为1,Loop Cout选项取消选中Forever,在右边的框中输入2。以上设置表示共有5个虚拟用户,每隔1秒运行一个,迭代2次。
(2)要查看运行的结果还需要加入Listener,选中Thread Group单击鼠标右键选择Listener->View Results in Table,通过这个视图可以查看到每个链接的执行情况,包括执行时间和成功与否,再加入Aggregate Report,通过这个视图可以查看每个Thread Group组的最大、最小和平均响应时间。加入View Results Tree,通过这个视图可以查看每个链接的执行情况,包括发出的请求和服务器返回的详细内容。
(3)OK,所有的设置暂到此结束,接下载可以运行了。
4、运行及结果查看
(1)OK,运行看看吧,由于设置运行时间较短,所以先选择View Results in Table,然后按下Ctrl+r键开始运行脚本,就可以看到每个请求的运行结果了,还可以单击其他两个结果视图实时查看运行结果。
说了这么多相信读者已经对这个工具有些感性的认识了吧,简单、便捷、跨平台、随手拈来即可使用,是它最大的有点(占内存是Java无法避免的,出现最先一幕)。不过我的本意是想说说使用使用Jmeter进行查询内容参数化的,没想到就简单使用也花费了这么多篇幅,那只有下一节再叙了。总的感觉这个工具比较“爽”。中文站点:http://www.bonoy.com/jmeter/本文原在我的另一个blog上,因为已经不用那个了,所以再次贴到这里来。这里再附上我使用的一段脚本——设置浏览器代理服务器的脚本,功能是设置代理服务器为localhost,端口为8080,并打开一个浏览器实例,关闭该实例则取消代理服务器的设置。注意:此脚本在我的机器上运行通过的,如果您要使用请自己修改,由于是对注册表的操作,所以请不熟悉的朋友慎用,或者使用其他有类似功能的软件。‘*******************************************************************************
‘脚本说明:使用本脚本可以设置代理为localhost:8080,关闭浏览器后自动取消代理设置。
‘创 建 人:wyingquan at hotmail dot com
‘创建时间:2004-11-24 星期三
‘*******************************************************************************
‘保存当前设置
Set reg=WScript.CreateObject("WScript.Shell")
‘设置浏览器使用代理,服务器名localhost,端口号8080
reg.regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable",1,"REG_DWORD"
reg.regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer","localhost:8080","REG_SZ"
reg.regwrite "HKLM\SYSTEM\ControlSet001\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings",1,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\ControlSet001\Hardware Profiles\0001\Software\Microsoft\windows\CurrentVersion\Internet Settings",1,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\0001\Software\Microsoft\windows\CurrentVersion\Internet Settings\ProxyEnable",1,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings\ProxyEnable",1,"REG_DWORD"
‘获取浏览器执行文件的位置
RunMe=reg.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE\")
‘等待用户输入要打开的页面
sUrl=InputBox("请输入要打开的URL地址或者取消直接在浏览器地址栏中打开:","VBS For Jmeter","http://")
‘打开测试页面
Set oExec=Reg.Exec(RunMe & " " & sUrl)
‘一直等待关闭浏览器为止才继续运行脚本
Do While oExec.Status = 0
WScript.Sleep 100
Loop
‘撤销代理服务设置
reg.regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable",ProxyEnable,"REG_DWORD"
reg.regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer",ProxyServer,"REG_SZ"
reg.regwrite "HKLM\SYSTEM\ControlSet001\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings",0,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\ControlSet001\Hardware Profiles\0001\Software\Microsoft\windows\CurrentVersion\Internet Settings",0,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\0001\Software\Microsoft\windows\CurrentVersion\Internet Settings\ProxyEnable",0,"REG_DWORD"
reg.regwrite "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings\ProxyEnable",0,"REG_DWORD"
Set reg=nothing
MsgBox "OK",,"VBS For Jmeter"
JMeter 词汇表
1. Test Plan , 测试计划
测试计划在软件测试项目中是用于管理一个软件项目的测试资源配置,时间表
以及测试用例等。一般测试计划中也包括风险评估,计划开始和结束的条件等。
在JMeter中的测试计划,实际上是一个或一组测试用例。可以将线程组(Thread
Group)理解为一个测试用例,在一个测试计划中可以有多个测试线程组。
2. WorkBench , 工作台
在金山词霸中Workbench的解释是:
引用:
工作台:在上面做手工工作的坚固的桌子或长凳,如机械工人、木匠或珠宝匠的工作台
在JMeter中,可以在工作台中配置HTTP代理服务器,然后将录制的脚本存入工
作台中,进行初步编辑,然后将脚本复制/粘贴到测试计划中。
3. Thread Group , 线程组
在各种压力测试工具中都有虚拟用户的概念,在LoadRunner中叫做VUser。实际
上在这些压力测试工具实现虚拟用户的时候试用的技术就是线程,用一个线程来
模拟一个虚拟用户,在JMeter中线程组用于配置虚拟用户的数目,迭代次数等。
4. Sampler , 取样器; Sample, 样本
在JMeter中,请求时通过取样器发送的,每个请求就是一个样本,在测试运行
的时候每个虚拟用户(线程)通过取样器发送样本,样本会在运行的时候由
JMeter进行参数化。
5. Controller , 控制器
控制器分为逻辑控制器,和样本控制器也就是取样器。逻辑控制器用来模拟程序
语言的逻辑结构,如顺序,分支,循环等。
6. Listener , 监听器
7. Config Element , 配置元件
8. Pre Processor , 前置处理器
9. Post Processor , 后置处理器
Apache JMeter
Apache JMeter 是一个100%的纯Java桌面应用,用于压力测试和 性能测量。它最初被设计用于Web应用测试但后来扩展到其他测试领域。
我用它能做什么?
Apache JMeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,Java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器,网络 或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以 使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。
它能作什么?
Apache JMeter 的特性包括:
能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC)。
完全的可移植性和100% 纯Java。
完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。
完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。
精心的GUI设计允许快速操作和更精确的计时。
缓存和离线分析/回放测试结果。
高可扩展性:
可链接的取样器允许无限制的测试能力。
各种负载统计表和可链接的计时器可供选择。
数据分析和可视化插件提供了很好的可扩展性以及 以及个性化。
具有提供动态输入到测试的功能(包括JavaScript)。
支持脚本变成的取样器(在1.9.2及以上版本支持BeanShell)。
JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,最新的版本是1.9.1,大家可以到http://jakarta.apache.org/jmeter/index.html下载源代码和查看相关文档。
1 JMeter作用领域
JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。
2 使用JMeter测试Web应用
接下来的章节里,作者将详细的演示如何使用JMeter来测试Web应用的完整过程。
2.1 测试环境
作者使用了Tomcat作为Web服务器进行测试,被测试的内容是一个jsp文件和一个servlet,jsp文件调用 JavaBean、打印相关信息,servlet接受用户参数、调用javabean、输出相关信息。详细的内容请参考作者提供的JMeter.war的内容。
2.2 安装启动JMeter
大家可以到通过http: //apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip 下载JMeter的release版本,然后将下载的.zip文件解压缩到C:/JMeter(后面的文章中将使用%JMeter%来引用这个目录)目录下。现在,请使用%JMeter%/bin下面的jmeter.bat批处理文件来启动JMeter的可视化界面,下面的工作都将在这个可视化界面界面上进行操作。下面的图片是JMeter的可视化界面的屏幕截图。
图一: JMeter打开时的屏幕截图
2.3 建立测试计划(Test Plan)
测试计划描述了执行测试过程中JMeter的执行过程和步骤,一个完整的测试计划包括一个或者多个线程组(Thread Groups)、逻辑控制(Logic Controller)、实例产生控制器(Sample Generating Controllers)、侦听器(Listener)、定时器(Timer)、比较(Assertions)、配置元素(Config Elements)。打开JMeter时,它已经建立一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。现在我们开始填充一个测试计划的内容,这个测试计划向一个jsp文件和一个servlet发出请求,我们需要JMeter模拟五个请求者(也就是五个线程),每个请求者连续请求两次,下面的章节介绍了详细的操作步骤。
2.4 增加负载信息设置
这一步,我们将向测试计划中增加相关负载设置,是Jmeter知道我们需要模拟五个请求者,每个请求者在测试过程中连续请求两次。详细步骤如下:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add‘Thread Group,界面右边将会出现他的设置信息框。
2. Thread Group有三个和负载信息相关的参数:
Number of Threads: 设置发送请求的用户数目
Ramp-up period: 每个请求发生的总时间间隔,单位是秒。比如你的请求数目是5,而这个参数是10,那么每个请求之间的间隔就是10/5,也就是2秒
Loop Count: 请求发生的重复次数,如果选择后面的forever(默认),那么 请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复 指定的次数,如果输入0,那么请求将执行一次。
根据我们演示例子的设计,我们应该将Number of Threads设置为5,Ramp-up period设置为0(也就是同时并发请求),不选中forever,在Loop Count后面的输入框中输入2,设置后的屏幕截图如下:
图二:设置好参数的Thread Group。
2.5 增加默认Http属性(可选)
实际的测试工作往往是针对同一个服务器上Web应用展开的,所以Jmeter提供了这样一种设置, 在默认Http属性设置需要被测试服务器的相关属性,以后的http请求设置中就可以忽略这些相同参数的设置,减少设置参数录入的时间。我们这里将采用这种属性。你可以通过下面的步骤来设置默认http属性:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add‘config element‘http request defaults,界面右边将会出现他的设置信息框。
2. 默认http属性的主要参数说明如下:
protocal:发送测试请求时使用的协议
server name or ip:被测试服务器的ip地址或者名字
path: 默认的起始位置。比如将path设置为/jmeter,那么所有的http请求的url中都将增加/jmeter路径。
port number: 服务器提供服务的端口号
我们的测试计划将针对本机的Web服务器上的Web应用进行测试,所以protocal应该是http,ip使用localhost,因为这个web应用发布的context路径是/jmeter,所以这里的path设置为/jmeter,因为使用Tomcat服务器,所以port number是8080。设置后的屏幕截图如下:
图三: 测试计划中使用的默认Http参数
2.6 增加Http请求
现在我们需要增加http请求了,他也是我们测试的内容主体部分。你可以通过下面的步骤来增加性的http请求:
1. 选中可视化界面中左边树的Thread Group节点,单击右键,选择Add‘sampler‘http request,界面右边将会出现他的设置信息框。
2. 他的参数和2.5中介绍的http属性差不多,增加的属性中有发送http时方法的选择,你可以选择为get或者post。
我们现在增加两个http 请求,因为我们设置了默认的http属性,所以和默认http属性中相同的属性不再重复设置。设置后的屏幕截图如下:
图四:设置好的jsp测试请求
图五:设置好的Servlet测试请求(带参数)
2.7 增加Listener
增加listener是为了记录测试信息并且可以使用Jmeter提供的可视化界面查看测试结果,里面有好几种结果分析方式可供选择,你可以根据自己习惯的分析方式选择不同的结果显示方式,我们这里使用表格的形式来查看和分析测试结果。你可以通过下面的步骤来增加listener:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add‘listener‘view result in table,界面右边将会出现他的设置信息和结果显示框。
2. 你可以设置界面上面的filename属性设置将测试结果保存到某个文件中界面下面将使用表格显示测试结果,表格的第一列sampleno显示请求执行的顺序和编号,url显示请求发送的目标,sample-ms列显示这个请求完成耗费的时间,最后的success列显示改请求是否成功执行。界面的最下面你还可以看到一些统计信息,最关心的应该是Average吧,也就是相应的平均时间。
2.8 开始执行测试计划
现在你可以通过单击菜单栏run -> Start开始执行测试计划了。下面这两个图是作者第一次、第二次执行该测试计划的结果图:
图六:第一次执行后的结果显示
图七:第二次执行的结果显示
大家可以看到第一次执行时的几个大时间值均来自于jsp request,这可以通过下面的理由进行解释:jsp执行前都需要被编译成.class文件。所以第二次的结果才是正常的结果。
3 总结
JMeter用于进行供能或者性能测试,通过使用JMeter提供的供能,我们可以可视化的制定测试计划:包括规定使用什么样的负载、测试什么内容、传入的参数,同时,他提供了好多种图形化的测试结果显示方式,使我们能够简单的开始测试工作和分析测试结果。
本文中,作者根据自己的使用经验,详细演示了如何使用JMeter来进行Web测试的全部过程,简单的介绍了JMeter提供测试结果的图形化显示界面中相关参数的含义。希望能够帮助大家学会使用JMeter的基本知识,同时,大家可以参考这个过程和JMeter的帮助文档来实现对 java对象、数据库等的测试过程。
参考资料:2. JMeter http://jakarta.apache.org/jmeter/index.html
JMeter 的用户指南 : http://jakarta.apache.org/jmeter/usermanual/index.html
工具下载:1. tomcat http://jakarta.apache.org/tomcat/index.html
你可以先把你要的测试脚本录制下来。
具体方法:
1。在WorkBench里ADD--〉NON-TEST Elements-->http proxy server.
2。在Test Plan里Add-->Thread Group
3。点击WorkBench--->http proxy server,在Target Conctroler 里选择:
Test Plan>Thread Group
4。设置IE的代理为:locahost 端口:8080
5。点击http proxy server下面的Start按钮。
6。在IE里访问你要测试的网页,所有的动作会被记录在Jmeter里。
7。在录制完之后,可以把不需要的.css .jpg的行删掉
还可以添加一些变量控件,来增加脚本的灵活性。
在IE里设置为localhost,端口号和JMeter中的Proxy server的端口号一致,然后启动JMeter的Proxy server。打开IE,输入要测试的网站的网址,就可以了。
录制的时候线程组中不需要设置。默认情况下录制下来的测试计划(脚本)在HTTP Proxy Server中存放,你需要拷贝到线程组中编辑,然后才能使用。
patterns to include/exclude 是用来过滤请求的,比如你不想发送对图片的请求,你就可以过滤掉。
在文章 在 JMeter 压力测试工具中使用变量 中谈到了可以在 JMeter 中使用变量来方便进行压力测试, 此外, JMeter 还支持在测试计划中使用函数, 下图是 JMeter 提供的"函数助手对话框":
通过"函数助手对话框"中的"帮助"按钮可以查找到相关函数的帮助.
实现方式
下面使用一个例子来说明如何使用函数, 如下面的几张图所示, 例子使用了 JMeter 提供的 "Java请求" 这个 Sampler.
*
o <1>这里设置了一个 Label "JavaTest001", 以便在运行结果中区分当前请求
o <2>${_ _javaScript((new Date()).getTime(),timestamp)}就是 JMeter 中使用函数 "_ _javaScript" 的方法
o <3>这里演示了如何使用上一条中 "_ _javaScript" 函数中产生的结果 "timestamp"
o <4>这里使用了另外一个 JMeter 函数 "_ _threadNum", 用以获得运行是线程编号
*
o <1>这里设置了一个 Label "JavaTest002", 以便与"Java请求01"中的运行结果分开
o <2>这里演示了如何再次使用"Java请求01"中 "_ _javaScript" 函数中产生的结果 "timestamp"
结果分析 *
o 从这个结果可以看到 "_ _javaScript" 函数的测试结果, 以及如何使用这个函数执行时产生的结果 "timestamp"(=1120144567828)
*
o 从这个结果中可以看到另外一个函数 "_ _threadNum" 的使用效果
*
o 从这个结果中可以看到在"Java请求01"中 "_ _javaScript" 函数中产生的结果 "timestamp" 是如何被引用在 "Java请求02" 中的
其它
* 与本文相关的 JMeter 测试计划文件 "JMeter-func.jmx" 可以从这里下载: att:在 JMeter 压力测试工具中使用函数(Function).JMeter-func.jmx