From:http://bdql.iteye.com/blog/291987
出于学习热情,翻译总结Emily H. Halili的《Apache JMeter》一书的部分内容。
JMeter的简介
可以肯定的是,JMeter至少符合以下几条自动测试标准:
- 零购置成本--直接从http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi下载得到。
- 学习曲线平滑--只需要基本的html和正则表达式知识。
- 功能全面--不仅只能测试web应用。
- 架构可伸缩--其组件被设计为可通过合并完成大规模测试。测试可以在多台主机上同时运行。
- API可扩展--API开放,并可由用户扩展编程。
- 技术支持良好--在线用户指南、用户论坛、网络文章也包括这本书。
本章引导您开始第一次的JMeter试用。将向您介绍JMeterm同时使您对它的能力有一个整体的认识。除此之外,还会带您认识JMeter的操作界面,让你亲身感受到几个重要的JMeter组件。
让我们开始...
JMeter是一个桌面应用,被设计为用于测试c/s结构的应用程序,如web应用或FTP应用。是到目前为止,一个使用得最广泛的开源测试工具。它是由纯java编写的,通过其API可以对它进行扩展。JMeter位于c/s中的客户端工作,它可以测试服务器的响应时间,CPU负载,内存占用和资源的使用。
绝大多数的JMeter测试脚本或测试计划都涉及到创建一个循环,按照预先定义的时间间隔和线程组来模拟向服务器发出请求。这些测试脚本可以定制和扩展。一个基本的JMeter测试计划应该至少包括三个部分:线程组,监听器,采样器。
线程组用来模拟一组用户(用户数至少一个)。
采样器使请求发往目标服务器。
监听器捕获每个请求后收到的响应数据。
通过界面认识它
一个典型的测试计划由一个或多个线程组,逻辑控制器,监听器,定时器,断言和配置等元素组成。
线程组:一个线程模拟一个用户。所有的测试计划的元素都必须放在一个线程组元素下。
监听器:监视JMeter运行测试用例时接收到的数据。
控制器:其逻辑可以自定义,如让检验员告诉JMeter向服务器发出请求。
定时器:设定一个线程发出的两次请求间的间隔时长。
断言:测试返回的结果是否是期望的值。
配置:与检验员相关,可以增加和修改请求。
以下为界面截屏图。
JMeter界面上有两个面板,一旦JMeter投入运行,你可以看到它们。测试计划和工作区面板,如下图所示。一个测试计划描述了JMeter投入运行后的测试步骤。工作区提供临时的数据存放空间。工作区数据与测试计划分开存放。
左边的面板以树形显示了我们测试计划,其中节点的添加和删除可以通过右击节点进行。右边的面板显示了每个节点的详细配置。
下面是由一个线程组和其它一些元素组成的一个测试计划例子。
在我们使用JMeter进行性能测试时,线程组是必选元素。这个元素可以通过模拟多个用户对服务器进行压力测试。你甚至可以对测试进行的时间进行预设,下图是线程组的详细显示。
另一方面,同样一个测试计划可以扩展成为包括功能或回归测试。如下图所示添加Assertion(断言)元素。
正式开始使用...
安装JMeter
你需要首先从以下网址下载最新发布的版本http://jakarta.apache.org/site/downloads/index.html,下载完成后,解压缩到你想要的目录就完成了安装。
提醒:为了进行远程测试请避免在压缩时使用带空格的目录名。
设置环境变量
首先机器上建议安装jdk1.4或更高版本。并设置JAVA_HOME环境变量。
运行JMeter
在你的JMeter的安装目录下有bin目录。在windows系统中,运行jmeter.bat。如果你运行在unix系统中,你需要运行jmeter。
在这个过程中,JMeter会自动在它的lib目录或lib/ext目录中找所需要的jar包。因此,如果将来您自己开发了JMeter的组件,你也需要把它们拷贝到JMeter的lib/exit目录中。
如果你运行JMeter在代理或防火墙的后面,你需要提供服务器名和端口号,用命令行的参数指定。
例如
jmeter -H 129.198.1.1 -P 8000 -u someusername -a someuserpassword -N localhost
测试计划
JMeter的测试计划封装了你需要手动编写的测试脚本。
什么是测试计划?
测试计划定义了如何进行测试的框架。最简单的测试计划包括以下元素:
线程组:用于指定运行线程的个数和坡道期,循环次数。每个线程模拟一个用户,坡道期指定创建所有线程的时间。例如指定5个线程和10秒的坡道期,表示每个线程的创建时间为2秒。循环次数定义了测试重复的次数。而且可以指定开始和结束的具体时间。
采样器:用于发出http/ftp/soap/xml/jdbc/ldap请求到服务器。
监听器:用于后处理请求数据。例如你可以保存数据到文件或者以图表显示。
开始运行JMeter,测试计划就会出现工作区左边的面板窗口中。
具体描述如下:
User Defined Variables:你可以定义静态变量,它们是允许你在测试中重复提取的值,如服务器名,端口号等。例如你要测试一个www.example-jmeter.net的应用,你可以定义一个"server"变量,那么测试脚本中的"${server}"就会该值替代。
Functional Test Mode:它会记录下从服务器返回的数据。如果你要进行压力测试,请不要选择它因为它会影响结果。
Run each Thread Group separately:单独运行每个线程组。如果您有二个或更多的线程组在你的测试计划中。选中该项,表示JMeter会顺序地运行它们,否则会并发运行它们。
Add directory or jar to classpath:如果你自己扩展了JMeter组件,可以使用该项添加jar包。记住需要重启后才能生效。另外,你也可以直接把jar包拷贝到JMeter/lib目录下。或者通过编辑JMeter.properties文件来包含额外的jar,如"#user.classpath=../classes;../jars/jar1.jar,这样可以避免出现路径中包含空格引发的问题。
测试计划的组成
测试计划必须由至少一个线程组组成。每个线程组中都可以包含一个或多个以下组合:
采样器,逻辑控制器,配置,监听器和定时器。每个采样器能够关联一个或多个预处理元素,后处理元素和断言元素。让我们更进一步了解它们。
线程组
线程组是测试计划的入口,它包含所有其它的JMeter元素,一个线程组控制所有由JMeter创建的仿真线程,它们模拟多用户请求。
线程组代表着一组执行特定测试用例的用户,在线程组的控制面板里,显示在下图。如果有多个线程组那么它们会彼此独立地执行。
详细描述如下:
Action to be taken after a Sampler error:一旦采样器在测试过程中报错,你可以作出以下的选择:Continue继续进行下测试,stop Thread停止当前测试的线程,Stop Test完成停止测试,便于进行错误原因的查看。
Number of Threads:模拟用户的人数或者是web应用的连接数。
Ramp-Up Period:定义JMeter创 建所有测试线程的时长。例如设定线程数为10,坡道期为60秒,那么每个线程会以6秒/个的速度连续创建。在60秒以后,所有的线程将会投入运行。比较好 的策略是将你的坡道期设置得足够长以避免在测试一开始就造成很大的工作负载,但不要过长,你可以一开始将坡道期设置为等于要创建的线程数,稍后根据情况进行调整。
Loop Count:定义测试执行的次数,默认情况下,测试仅执行一次。点击Forever选项框那么测试会一直重复执行直到你手动停止它。
Scheduler Configuration:1.9之后的版本具有该项,允许你设定测试的开始和结束时间。只有时间到达开始时间,测试才会真正开始。在每个测试循环之 后,除非结束时间到了,测试将会继续下去一直到达loop count的上限。startup delay用于设定JMeter在第一个测试线程启动前的开始等待时间,duration用于设定整个测试的进行时间。前者用于覆盖start time的设定,后者覆盖end time的设定。
控制器
JMeter有两类控制器:
1.Samplers:允许发送特定类型的请求给服务器。稍后我们会发送http请求给服务器,所以我们会选用Http Rquest采集器。可以通过Configuration元素给采集器进行设定。
2.Logic Controllers:允许自定义何时发出请求的逻辑。例如你可以用Random Controllers来向服务器随机发出http请求。
采集器
JMeter采集器允许你定义发往服务器的请求,模拟一个用户通过网页向服务器发出的请求。每个采集器生成结果包含以下一些,如性能、延迟时间、呑吐量等。默认情况下,JMeter会按照采样器出现在测试计划树中的顺序发送请求命令。当然,为了处理的采样的顺序可以使用逻辑控制器进一步定制。这将在后面的“逻辑控制器”中进一步解释 。
您可以自定义每个采样器通过设置其属性,或者您也可以添加配置元素。在这本书中,因为我们将发出许多HTTP请求到相同的服务器,我们可以使用默认配置元素,它预先定义了发送的http请求。
一个http请求的采样器面板显示如下:
如果你希望JMeter进行验证,你可以添加Assertion元素,关于Assertion的更多内容,后面再详细介绍。
在一个Http请求采样器面板中的响应Assertion显示如下:
以下是JMeter提供的所有采样器列表:
HTTP Request
FTP Request
JDBC Request
Java Request
SOAP/XML-RPC Request
WebService (SOAP) Request
LDAP Request
LDAP Extended Request
Access Log Sampler
BeanShell Sampler
BSF Sampler
TCP Sampler
JMS Publisher
JMS Subscriber
JMS Point-to-Point
JUnit Request
Mail Reader Sampler
Test Action
逻辑控制器:用于定义采样器的执行顺序。一个逻辑控制器的子元素有:采样器、配置,其它逻辑控制器。JMeter可能会随机选取(使用随机控制器) ,重复(使用回路控制器) ,交换(使用交错控制器)等。
几个逻辑控制器可以结合起来,实现不同的结果。
一个循环控制器的面板显示如下:
以下列出JMeter提供的所有的逻辑控制器:
Simple Controller
Loop Controller
Once Only Controller
Interleave Controller
Random Controller
Random Order Controller
Throughput Controller
Runtime Controller
If Controller
While Controller
Switch Controller
ForEach Controller
Module Controller
Include Controller
Transaction Controller
Recording Controller
监听器
显示采集器的结果为表、图、树或者日志文本。仅显示定义在监听器下的元素的数据。
每种监听器以自己的方式来显示数据,例如为了显示图,可以使用"Aggregate Report"监听器。"Aggregate Report"或"Summary Report"监听器显示表。所有的监听器都会把数据写到输出文件,扩展名为jtl。
一个Aggregate Graph监听器的面板显示如下:
所有监听器的公共属性:
Configure button:用于选择写到文件中的信息,保存为xml或cvs格式,扩展名为jtl,其中cvs格式使得文件较小。一旦选择,Save Configuration Window将会出现。
Browser button:如果你想读或者显示以前保存的结果。
一个监听器会耗费相当多的内存,如果它关联多少个采集器。JMeter会变慢,如果你选择激活多个监听器。因此尽量选择合适的监听器来使用。
一个减少内存占用的方法是用CSV默认的格式来保存数据,并且使用Simple data Writer监听器。
你可以改变默认的格式为xml,通过编辑jmeter.properties。将jmeter.save.saveservice.output_format=csv,改为xml即可。
以下为所有的监听器列表:
Sample Result Save Configuration
Graph Full Results
Graph Results
Spline Visualizer
Assertion Results
View Results Tree
Aggregate Report
View Results in Table
Simple Data Writer
Monitor Results
Distribution Graph (alpha)
Aggregate Graph
Mailer Visualizer
BeanShell Listener
Summary Report
定时器
定时器组件是可选组件,它会引起JMeter暂停,因为默认情况下JMeter会在一个请求结束后马上发出下一个请求,这样能会造成服务器过载。通过添加定时器会降低服务器崩溃的危险。这项功能在进行功能性测试时非常有用。
不管怎样,你需要小心在一个测试计划中添加了过多的定时器。JMeter会在两次请求间暂停可使用的所有定时器指定时间的总和。
Constant Timer控制面板如下:
以下是所有JMeter提供的定时器列表:
Constant Timer
Gaussian Random Timer
Uniform Random Timer
Constant Throughput Timer
Synchronizing Timer
BeanShell Timer
Assertions断言:允许你针对响应添加验证条件。它们被添加为采集器的子元素。在进行功能性测试时特别有用。在性能测试中可以用它来保证你收到了响应数据。不包含内容的错误或遗失的部分,因为这可能会影响有效性的测试。
你可以利用类似Perl的正则表达式来创建断言。用这来判断应用返回的值是否是你所期望的。
让我们来看一下这样的场景,在一个Http请求的采样器中,你请求一个页面,如果返回"Login Successful"字符串表示访问成功,你可使用Response Assertion来判断响应中是否具有该字符串。如下图所示:
与Assertions相关的监听器有"View Result in Table", "View Result Tree", "Aggregate Report","Summary Report"监听器,前三种监听器将会详细显示Assertions结果,而后者只是简要显示失败的比例。
以下是一个Assertion Results面板显示:
以下是所有JMeter提供的Assertion的列表:
Response Assertion
Duration Assertion
Size Assertion
XML Assertion
BeanShell Assertion
MD5Hex Assertion
HTML Assertion
XPath Assertion
XML Schema Assertion
配置元素
配置元素允许你创建默认的变量在采样器中使用。用于修改采样器发出的请求内容。
它们只能被同一范围内的采样器访问,并且先于采样器被执行。
以下是HTTP Request Defaults 面板,如图:
Request Default 1可以被Request1和Request3采样器访问,因为它是父节点,而Request Default2只能被Request1访问,Request Default3只能被Request3访问。
以下是JMeter提供的所有配置元素列表:
CSV Data Set Config
FTP Request Defaults
HTTP Authorization Manager
HTTP Cookie Manager
HTTP Proxy Server
HTTP Request Defaults
HTTP Header Manager
Java Request Defaults
JDBC Connection Configuration
Login Config Element
LDAP Request Defaults
LDAP Extended Request Defaults
TCP Sampler Config
User Defined Variables
Simple Config Element
Pre-Processor Elements
预先处理允许你修改范围内的采样器。他们经常用于在运行之前修改请求的设置,或者更新不能从响应文本中获取的变量。
以下是JMeter提供的预先处理元素。
HTML Link Parser
HTTP URL Re-writing Modifier
HTML Parameter Mask
HTTP User Parameter Modifier
User Parameters
Counter
BeanShell PreProcessor
Post-Processor Elements
后处理元素在采样器发出请求后执行。一种好的做法是将其做为采样器的子元素,以保证它只在特定的采样器运行后执行,而不是全部的采样器。该元素一般用于处理响应数据,例如,提取稍后要用到的变量值。
以下是JMeter提供的全部后处理元素。
Regular Expression Extractor
XPath Extractor
Result Status Action Handler
Save Responses to a file
Generate Summary Results
BeanShell PostProcessor
构建一个用于测试web站点的测试计划
本节描述如何创建一个基本的网站测试计划。我们稍后会对该计划进行扩展以进行性能测试(第5章)和功能测试(第6章)。
以下是基本的测试计划所需要的元素:
Thread Group
HTTP Request (Sampler)
HTTP Request Default (Configuration Element)
Summary Report (Listener)
我们可以按照以下的步骤来进行:
- 添加用户
- 添加和配置默认的HTTP Request
- 添加HTTP Request
- 添加监听器显示、存放测试结果
- 保存和运行测试计划
首先,运行JMeter(双击JMeter.bat在jmeter/bin目录中),你可以看到默认的界面,包括测试计划和工作区。
添加用户
1.右击Test Plan图标在左边窗格,然后选择add|Thread Group。
右边的将显示Thread Group的控制面板。
2.将Thread Group更名为My Users.
3.设定为一次连接和一个用户。
4.更变Ramp-Up Period(坡道期)为0,意味着用户将会马上开始测试。如果还有其他的用户,那就意味着所有的用户立即开始测试。
设定之后图如下:
接下来做其它的步骤。
添加默认的HTTP Request
1.右击My Users元素,选择Add | Config Element | HTTP Request Defaults。
2.选择后显示它的控制台界面。
3.重命名为My URL。
4.在服务器名或IP地址栏中输入www.mocksite.net或其它你想用的网址。其余不动。设置HTTP Request Default Element会引起在My Users中的所有请求采样器访问同一个服务器。
显示如下:
添加HTTP Requests
在这一步,我们将向服务做两个模拟的请求:默认的页面和另一个页面。JMeter会以它们在测试计划树中出现的次序来执行,我们首先添加默认页面的请求。
1.右击My Users线程元素,选择Add | Sampler | HTTP Request.
2.选择HTTP Request从左边窗格,并做以下修改:
a. Name栏:Home Page
b. Web Server:这个信息已经在HTTP Request Defaults中设置。在这里不需要修改,除非你需要重定向到另一个不同的路径。
c. Path栏:/
因为我们已经在HTTP Request Default元素中指定Server name,我们就不必再指定其它内容。
完成后如图:
3.添加其它HTTP Request元素在Home Page元素之下。
a. Name栏:Sample Page
b. Path栏:/sample.html(或你自己知道的url)
因为我们已经在HTTP Request Default element指定了服务器名www.mocksite.com,该path就会添加在其后形成完整路径。
以下为完成图:
添加监听器
最后,我们添加一个简单的监听器,Aggregate Report。这个元素将存放所有http请求的结果,并以表格形式输出。
1.选择My Users元素并Add | Listener | Aggregate Report。
2.在Write All Data to a File:在Filename栏中输出目录名或用browse按钮选择,并输入输出文件名。
以下为完成图:
保存和运行测试计划
JMeter要求我们在运行之前保存测试计划。
1.选择Save Test Plan从File菜单。JMeter允许你只保存一部分,通过选择分支。
2.在Save as中输入文件名,例如输入My Users。扩展名为.jmx。
3.从run 菜单选择运行。
以下为Aggregate Report Element和Control Panel运行结果。注意右上角有小的方框,旁边的数字显示激活的线程数和总线程数。
以下为运行测试计划之后的界面。右上角方框为灰色,只显示总线程数,你也可以手动停止测试,通过选择Stop从Run菜单。
报表列解释如下:
Label—例子的标签
# Samples—URL的样本数量
Average—平均时间
Median—The time in the middle of a set of results
90% Line—The maximum time taken for the fastest 90% of the samples
Min—The lowest time for the samples
Max—The longest time for the samples
Error %—Percent of requests with errors or failures
Throughput—Throughput measured in requests per unit of time
Kb/sec—The throughput measured in Kilobytes per second