一、Jmeter基础概念-Jmeter基本元素总解

                                                                                                                                                                                                                                  初识测试计划与线程组

前言:

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。


http请求取样器
JDBC请求取样器

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用于自定义发送请求的逻辑,可改变它的子元素的请求顺序,重复次数等.


Logic 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)引用,否则不会被执行


Test Fragments

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.


Timer定时器

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请求的的设置或更新非来字响应文本的变量.



Pre-Processor Elements

11. 后置处理器 (Post-Processor Elements )

比Sampler Request后执行。常用来处理响应数据或从中提取值



Post-Processor Elements 

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)


Scoping Rules说明


代表将要执行的一系列步骤。通常在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对于CPU和内存的消耗比较大,所以,当需...
    燕京博士阅读 4,086评论 0 16
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 我总是自命清高, 不愿为了那份口粮而折腰。 可生活就是这么残酷, 往往把那份顾虑都打消。 因为生存面前一切的借口都...
    琢玉书生阅读 200评论 4 5
  • 5月14日 参加上海行动派的#国际女性精英论坛# 5月14日 体验金茂大厦顶楼云中漫步 有别于自己远隔不同的城市飞...
    有IDEA阅读 181评论 0 1
  • UIAlertView * alertView = [[UIAlertView alloc] initWithTi...
    iCloudEnd阅读 415评论 0 2