初识测试计划与线程组
前言:
Jmeter是一项非常优秀的,开源的性能测试工具。他的工作原理与其他工具的工作原理是一样的,模拟用户操作场景,通过负载发生器,以
多线程的方式进行运行脚本,最后收集测试过程中的数据,生成报表数据,分析系统性能。
一、性能工具的工作原理:
Jmeter工具和其他性能工具在原理上完全一致,工具包含以下四个部分:
(1)负载发生器:用于产生负载,通常以多线程或是多进程的方式模拟用户行为。
(2)用户运行器:通常是一个脚本运行引擎,用户运行器附加在线程或进程上,根据脚本要求模拟指定的用户行为。
(3)资源生成器:用于生成测试过程中服务器、负载机的资源数据。
(4)报表生成器:根据测试采集的数据生成报表,提供可视化的数据显示方式。
在了解了Jmeter的工作原理后,我们来认识一下,如何使用Jmeter工具来完成一次完整的性能测试,通过情况下,一次完整的性能测试要通过测试分析、测试准备,测试执行、测试总结四个步骤。
二、Jmeter 测试计划 的元素
2.1、测试计划
任何测试计划(test plan)的第一个元素,所有控制器(Controller)和取样器(Sampler)必须作为线程组的子元素,其它元素,如监听器(Listener),可直接作为测试计划的子元素,这种情况下,子元素将作用于所有线程组,如图,图形结果监听器作用于所有线程组
2.2 线程Threads(Users)
线程组主要用于控制执行测试的线程数量,如图,允许:
1) 设置线程数量
2) 设置ramp-up period
3) 设置执行测试的次数
(1) 取样错误后要执行的动作
a.继续:默认选项,出错后后续的线程继续运行
b.Start Next Thread Loop:出错后启动下一组线程运行
c.停止线程:后续的线程停止运行,但是会返回出错前的结果
d.停止测试:与停止线程的差异在于不返回出错前的结果
(2)线程数:虚拟用户数,代表发送请求的用户数,一个线程数占用一个进程或线程。
(3)Ramp-Up Period(in seconds)-准备时长
-所有线程在多少时间内启动,单位是秒,为0时代表一次请求即并发。如果线程数为30,Ramp-Up Period为2,由表示30个用户线程在2s内全部启动,这个设置,让用户并发广义上的并发,也就是说是在2s内,这30个虚拟用户,每个用户以2/30s的间隔登录系统,达到多用户并发在线的状态。
TIPS:ramp-up period时间设置要适当,不能太短,防止测试开始时会产生过大的工作负载,也不能太长,必须保证最后一个线程在第一个线程结束之前开始运行(除非故意要那样做).一般情况下,可设置Ramp-up period = 线程数,在此基础上,根据需要上下调整
2. 控制器(Controllers )
Jmeter拥有两种类型的控制器:取样器(Sampler)和逻辑控制器(Logical Controller),它们
(4)循环次数
-每个线程发送请求的次数。如果线程数为30,循环次数为8,那么每个线程发送100次请求,那么此次的性能测试计划共向应用系统发送业务请求次数是30*100*8=24000次,以达到业务高请求。
(5)Delay Thread Creation until needed:直到需要时延迟线程的创建
(6)调度器:设定测试运行时间:比如,我们在要设置此线程组的执行时长为30分钟,我们可以设置脚本运行的开始时间及结束时间,在工具栏点击启动按钮,此测试计划便可按指定的时间执行测试。
2.3 控制器(Controllers )
Jmeter 拥有两种类型的控制器:取样器(Sampler)和逻辑控制器(Logical Controller)
Sampler:用于发送请求给服务器.例如,如果你想发送一个HTTP请求,添加一个“HTTP请求”Sampler,按它们出现在测试计划tree视图中的顺序执行Sampler。
Sampler包含:
FTP Request
HTTP Request
JDBC Request
Java object request
LDAP Request
SOAP/XML-RPC Request
WebService (SOAP) Request
……
如果要发送多个相同类型的请求(比如,HTTP请求)到相同服务器,可考虑使用一个默认配置元件.
一个控制器有一个或多个缺省的默认元件。
记得添加一个监听器到测试计划以便查看或存储请求结果到磁盘.
添加Asertion到Sampler,查看Jmeter对请求响应的基本验证.例如,在web应用压测中,服务器
可能返回一个成功的"HTTP Response"的代码,但是页面可能有错误,或者缺失.你可以添加一
个assertion来检查某些html标签(tag),符串等.(可用正则表达式)
Logical Controller:用于自定义发送请求的逻辑.例如,可以添加一个交替逻辑控制器(Interleave Logic Controller)来交替使用两个“HTTP请求”Sampler
2.4. 逻辑控制器(Logic Controller )
Logical Controller用于自定义发送请求的逻辑,可改变它的子元素的请求顺序,重复次数等.
首先,仅一次控制器(Once Only Controller)控制登录请求仅被执行一次,后续的迭代将跳过登录请求的执行
登录后,下一个Sampler将加载搜索页面(设想用户登录web应用后,转到搜索页面进行搜索),
加载搜索页面后,我们进行搜索,实际上,我们想进行两次不同的搜索。然而,每次搜索完成我
们都想重新加载搜索页面,本可通过4个简单的HTTP请求Sampler(加载搜索页面,搜索“A”,
加载搜索页面,搜索“B”)来做这件事,取而代之,我们使用交替控制器(InterleaveController),它元素顺序,每次执行一个请求
注意:交替控制器的子元素--HTTP请求默认值.设想搜索"A"和搜索"B"共享统一的PATH信息(一个HTTP请求规格包含domain, port, method, protocol, path, and arguments, 加其它可选项).两个都是搜索请求,访问相同的后台搜索引擎.与其在两个”HTTP请求”Sampler的PATH
输入域中配置相同的信息,不如抽取那些相同的信息到单一配置元件中。当交替控制器执行搜索“A”或搜索“B”请求Smapler时,它将”HTTP请求默认值”Sampler中PATH输入域的值填写到
搜索请求Sampler中对应输入域。所以,我们保留PATH输入域为空,并把信息放到HTTP请求默认值配置元件中。
下一个元素为另一个”HTTP默认请求值”,添加到线程组,作为其子元素.线程组有个内置的逻辑
控制器,保证它可以正确使用配置元件。它可填补任意请求Sampler的PATH空白.在web测试中
保留所有HTTPqi Sampler元素的DOMAIN输入域为空白,取而代之,把那些信息放入添加到线程
组的“HTTP默认请求值”元件,这样做,仅改变一个输入域,就可以在不同服务器上测试你的应用程序,否则,你每次都必须编辑每个取样器.
最后的元素为HTTP Cookie Manager.Cookie Manager必须添加到所有web测试中,否则,Jmeter将忽略cookie.在线程组中添加cookie管理器,确保所有HTTP请求取样器共享相同的cookie逻辑控制器可以混用来实现不同的结果。查看内置逻辑控制器列表
2.5. 测试片段(Test Fragments)
Test Fragment为一种特殊类型的控制器,和tree视图中和线程组处在同一层次。和线程组不同的是,除非被模块控制器(Module Controller)或者包含控制器(Include_Controller)引用,否则不会被执行
2.6. 监听器(Listeners)
Listeners提供对Jmeter在运行测试案例时采集的信息访问.图形结果树(Graph Results)监听器在图形上绘制响应时间;“查看结果树(View Results Tree)”监听器显示request和response取样器的详细信息,且可展示基于HTML和XML的响应表现形式.其它监听器提供,摘要或汇总信——此外,监听器可指示保存数据到一个文件,供后续使用。每个监听器提供一个输入域来填写,保存数据的文件
2.7 定时器(Timers )
Jmeter不间断的线程发送每个请求。建议添加一个定时器到线程组,来设置一个延迟。如果你不添加延迟,Jmeter可能在一段很短的时间内制造大量请求压倒服务器.定时器将导致Jmeter在发送定时器作用范围内的每个sampler前等待一段时间。如果添加多于一个定时器到线程组,Jmeter采用定时器的设置的延迟时间的总和,执行每个请求取样器前等待一段时间,该时间为前面的时间总合。定时器可以添加到sampler或controller以约束他们要影响的sampler.
为了在测试计划中的某个单一位置,提供一个等待,可用Test Action Sampler.
2.8. 断言(Assertions )
断言允许你预测从被测服务器接收的真实结果.使用断言,可测试你的应用程序是否返回你要的结果.
例如,你可以预测查询返回包含一些特定文本.用于检测的文本可以是Perl类型的正则表达式,
你可以指示返回包含这些文本,或者是设置的文本匹配整个响应.
可添加断言到任意Sampler,例如,可添加检测文本“”的断言到HTTP请求。Jmeter将
检测文本是否在HTTP响应中。如果Jmeter找不到文本,将标记请求失败。
注意:断言作用于它的作用范围内的所有取样器.可把断言作为子元素添加到单个Sampler来限制断言仅作用于某个单一Sampler
为了查看断言结果,添加一个Assertion监听器到线程组。失败的断言也会显示在Tree视图(Tree View)和Table Listener中,例如,在汇总和摘要报告中,将统计错误%age
9. 配置元件(Configuration Elements )
配置元件和Sampler紧密合作。它不发送请求[HTTP(S) Test Script Recorder除外],一个配置元件可被它所处的tree分支下的元素访问.
例如,如果你把一个HTTP Cookie Manager放在一个简单逻辑控制器下,该HTTP Cookie Manager仅能被该简单逻辑控制器的HTTP请求访
问(见figure 1)--可被HTTP请求"Web Page 1" 和"Web Page 2"访问,但不能被"Web Page 3"访问.
此外,在一个tree分支内的元素比位于“父”分支的相同元素的优先级高.例如,我们定义了两个HTTP请求默认值元件,"Web Defaults 1"和"Web Defaults 2". 由于我们把 "Web Defaults1"放在一个循环控制器内(loop controller),仅"Web Page 2"可访问它.其它HTTP requests
将使用"Web Defaults 2", 因为它放在线程组(所有tree分支的“父”分支)User Defined Variables元件则不一样,不管它在哪个地方,测试开始时被执行,为了简单起见,建议把它放在线程组开头.
10. 前置处理器(Pre-Processor Elements )
一个Pre-Processor优先于Sampler Request.如果一个Pre-Processor关联到一个Sampler,那么它优先于sampler运行. Pre-Processor最经常用来修改Sampler请求的的设置或更新非来字响应文本的变量.
11. 后置处理器 (Post-Processor Elements )
比Sampler Request后执行。常用来处理响应数据或从中提取值
12. 执行顺序 (Execution order )
0 配置元件
2 前置处理器
3 定时器
4 Sampler
5 后置处理器(除非取样器请求结果为空)
6 断言(除非取样器请求结果为空)
7 监听器(除非取样器请求结果为空)
注意:定时器,断言,前、后置处理器仅在有Sampler的情况下才被执行,Logic Controllers 和
Samplers按tree视图中的顺序执行。其它元素依据他们的所处的作用域范围和类型进行处理,
同种类型的元素按他们出现在tree视图的顺序进行处理
例如
Controller
Post-Processor 1
Sampler 1
Sampler 2
Timer 1
Assertion 1
Pre-Processor 1
Timer 2
Post-Processor 2
执行顺序为:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1
Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1
13. (作用范围 Scoping Rules )
JMeter测试树包含的元素是分层次和有序的。一些元素有严格的层次之分(Listeners, ConfigElements, Post-Procesors, Pre-Processors, Assertions, Timers),一些有顺序之分 (controllers, samplers).当创建测试计划时,创建有序取样器请求列表 (通过 Sampler)
代表将要执行的一系列步骤。通常在controller内按顺序组织这些请求: 执行顺序为:One,Two, Three, Four
一些controller影响他们子元素的顺序,可以查看具体controller说明 the component reference .其它元素是分层的。
比如,Assertion.如果它的父元素是个请求,那么它作用于那个请求,如果是个控制器,那么它作用于控制器下的所有子请求元素
Assertion #1作用于One,而Assertion作用域Two,Three
另一个例子,定时器
请求根据他们将被执行的顺序进行命名. Timer #1作用于Two, Three和Four . Assertion #1
仅作用于Three. Timer #2影响所有请求.
14. 属性和变量 (Properties and Variables )
JMeter properties定义在jmeter.properties (see Configuring JMeter for more
details).
属性对Jmeter来说是全局的,主要用于定义一些缺省的Jmeter使用设置.例如,属性
remote_hosts定义Jmeter将远程运行的服务器.属性可以被定义在测试计划中--见Functions
- read a property - 但不是用于指定线程的值.
Jmeter为针对每个线程来说是局部的.对每个线程来说可能是相同的,也可能是不同的。如果某
个变量被线程更新,仅该线程变量的拷贝被更改。例如,正在表达式提取器后置处理器(Regular Expression Extractor Post-Processor)根据它的线程读取的sample设置变量值,这些变量值可供后续的其它线程使用。关于怎么引用变量和函数的更详细信息查看Functions and Variables
注意:测试计划中定义的变量和User Defined Variables配置元件,在启动时就对提供给整个测试计划. 如果多个UDV元素定义了相同变量,那么最后一个起作用。一旦启动线程,变量的初始设置被拷贝到每个线程.其它元素例如用户参数前置处理器(User Parameters Pre-Processor)或正则表达式后置处理器,可用来重定义变量或创建新的变量.这些重定义仅作用于当前线程.
setProperty函数可用于定义一个Jmeter属性。对测试计划来说是全局的,在不同线程之间传
递信息.
变量和属性都是大小写敏感的。
15. 使用变量进行参数化测试 (Using Variables to parameterise tests )
例如,在测试中定义如下变量
HOST www.example.com
THREADS 10
LOOPS 20
可在测试计划中以${HOST} ${THREADS}等方式引用它们。如果你稍后想改变host,仅改变HOST
变量对应的值即可。变量值的少时,这很有效,当数量多时则需要用属性来定义变量的值,例如
HOST ${__P(host,www.example.com)}
THREADS ${__P(threads,10)}
LOOPS ${__P(loops,20)}
可命令行方式改变一些变量或所有变量的值,如下:
jmeter ... -Jhost=www3.example.org -Jloops=13
参考连接:
http://jmeter.apache.org/usermanual/test_plan