《jmeter:菜鸟入门到进阶》系列

jmeter是我从事软件测试工作以来接触的第一个性能测试工具,也是耗费时间精力最多的一个工具,当然,学习jmeter过程中,由于知识储备不够,也顺带学习了很多其他相关的一些知识。

一直有个想法,就是把jmeter写成一个完整的系列,包括元件构成、用法、不同组合能实现什么功能,以及利用jmeter来实现接口自动化、性能自动化测试等功能。

当然,工具只是辅助测试提高效率的手段,博采众长,选择合适的解决问题的方案才是我们学习的目的,工具只是手段,仅此而已。

这篇博客,将关于jmeter的一些使用技巧,遇到的错误整理成一个目录索引吧,方便自己查阅的同时也方便其他同行参考。

目前是持续更新状态,如果哪天断更了会提前说的,就这样吧。。。

1、基础介绍

简单介绍jmeter的元件组成,作用等基础知识;

2、录制脚本

简述了jmeter录制脚本的2种方式;

3、元件的作用域及执行顺序

jmeter各元件的作用域及执行的顺序;

4、Sampler之SOAP/XML-RPC Request

取样器中关于SOAP/XML-RPC Request的用法;

5、Sampler之HTTP请求

取样器中关于HTTP请求的用法;

6、http请求之content-type

取样器中关于HTTP请求的补充说明;

7、Sample之JDBC Request

取样器中关于JDBC请求的用法;

8、JDBC Request之Query Type

取样器中关于JDBC请求的补充说明;

9、目录结构

jmeter目录结构等简单介绍;

10、参数化

jmeter参数化的4种方式;

11、关联之正则表达式提取器

jmeter关联之正则表达式提取器的用法;

12、关联之XPath Extractor

jmeter关联之XPath Extractor的用法;

13、配置元件之计数器

jmeter配置元件中关于计数器的用法;

14、配置元件之HTTP属性管理器

jmeter配置元件中关于http属性管理器的用法;

15、函数助手

jmeter内置函数助手的简单介绍;

16、定时器

jmeter八大元件之定时器的介绍;

17、断言

jemter八大元件之断言的介绍;

18、逻辑控制器

jmeter八大元件之逻辑控制器的介绍;

19、常见问题及解决方法

jmeter使用过程中常见问题及解决方案的说明;

20、阶梯式加压测试

jmeter扩展插件Stepping Thread Group的简单介绍;

21、jmeter常用插件介绍

jmeter插件Transactions per Second、Response Times Over Time、PerfMon Metrics Collector的下载安装及使用;

22、内存溢出原因及解决方法

关于jmeter做压力负载测试时候遇到内存溢出的原因和解决方法;

23、jmeter分布式测试

关于高并发情况下分布式测试的一些技术点和注意事项;

24、dubbo接口测试

利用jmeter的dubbo插件进行dubbo接口测试和性能测试;

25、linux环境运行jmeter并生成报告

linux环境,非GUI模式运行jmeter脚本进行性能测试,并生成测试报告的介绍;

26、jmeter生成HTML格式性能测试报告

jmeter生成HTML格式的性能测试报告的2种方式,以及可视化图表解析内容;

jmeter(一)基础介绍

参考书籍:段念《软件性能测试与案例剖析》——第二版

推荐一本书《零成本实现web性能测试——基于Apache—jmeter》,主要内容是一些关于jmeter的实战使用,想学习的可以去看看。。。

jmeter是一款优秀的开源性能测试工具,目前最新版本3.0版本,官网文档地址:http://jmeter.apache.org/usermanual/index.html

一、优点

1、开源工具,可扩展性非常好

2、高可扩展性,用户可自定义调试相关模块代码

3、精心简单的GUI设计,小巧灵活

4、完全的可移植性和100%纯java

5、完全swing和轻量组件支持(预编译的HAR使用javax.swing.*)包

6、完全多线程框架,允许通过多个线程并发取样以及单独的线程对不同的功能同时取样

7、支持脚本取样器

二、安装及下载

这里附一个最新的jmeter官网下载地址:

http://jmeter.apache.org/download_jmeter.cgi

该链接是3.0版本的jmeter安装包

jmeter本身不需要安装,只需要配置好JDK环境,然后在在jmeter文件中的bin文件中打开jmeter.bat文件即可

最新版本,建议配置的JDK最好用1.7及以上版本

三、基础构成

1、组成部分

1)负载发生器:产生负载,多进程或多线程模拟用户行为

2)用户运行器:脚本运行引擎,用户运行器附加在进程或线程上,根据脚本模拟指定的用户行为

3)资源生成器:生成测试过程中服务器、负载机的资源数据

4)报表生成器:根据测试中获得的数据生成报表,提供可视化的数据显示方式·

2、主要概念

2.1测试计划(test plan)

描述一个性能测试,包含本次测试所有相关功能

img

2.2.threads(users)线程

img

Setup thread group:

一种特殊类型的线程,可用于执行预测试操作。即执行测试前进行定期线程组的执行

Teardown thread group:

一种特殊类型的线程,可用于执行测试后动作。即执行测试结束后执行定期的线程组

以上两个线程组,举个例子:loadrunner的脚本除了action里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块,与其对应

Thread group:

通常添加使用的线程,一般一个线程组可看做一个虚拟用户组,其中每个线程为一个虚拟用户

2.3测试片段(test fragment)

img

2.5版本之后新增的一个选项,是一种特殊的线程组,在测试树上与线程组一个层级,但是它不被执行,除非它是一个模块控制器或者被控制器所引用时才会被执行

2.4控制器

Jmeter有2种控制器:取样器(sampler)和逻辑控制器(Logic Controller)

作用:用这些原件驱动处理一个测试

1)取样器(Sampler)

img

是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler

如 HTTP Request Sampler 、 FTP Request Sampler 、TCP Request Sampler 、JDBC Request Sampler 等

每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。

Java Request Sampler 和 Beanshell Request Sampler 是两种特殊的可定制的 Sampler (暂不讨论)

2)逻辑控制器(Logic Controller)

img

包含两类原件:

一类是控制Test Plan中Sampler节点发送请求的逻辑顺序控制器,常用的有:If Controller、Swith Controller、Loop Controller、Random Controller等

另一类是用来组织和控制Sampler节点的,如Transaction Controller、Throughput Controller等

2.5监听器(Listener)

img

对测试结果进行处理和可视化展示的一系列组件,常用的有图形结果、查看结果树、聚合报告等

以上的五类原件就可以构成一个简单的性能测试脚本

下面再介绍几种jmeter提供的其他组件:

2.6配置原件(Config Element)

img

用于提供对静态数据配置的支持。CSV Date Set Config可以将本地数据文件形成数据池(Date Pool),而对应于HTTP Request Configuration

和TCP Request Sample等类型的Configuration元件则可以修改这些Sample的默认数据等

2.7定时器(Time)

img

用于操作之间设置等待时间,等待时间使性能测试中常用的控制客户端QPS的手段,jmeter定义了Constant Times、

Constant Throughput Times、Guass Ramdon Times等不同类型的Times

2.8断言(Assertions)

img

用于检查测试中得到的响应数据等是否符合预期,Assertions一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致

2.9前处理器(Pre Processors)

img

用于在实际请求发出之前对即将发出的请求进行特殊处理。

例如:Count处理器可以实现自增操作,自增后生成的的数据可以被将要发出的请求使用,而HTTP URL Re—Writing Modifier处理器则可以实现URL重写,

当URL中有sessionID一类的session信息时,可以通过该处理器填充发出请求实际的sessionID。

2.10后处理器(Post Processors)

img

用于对Sampler发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似loadrunner中的关联)。

例如:Regular Expression Extractor用于提取响应数据中匹配某正则表达式的数据段,并将其填充在参数中,Xpath Extractor则可以用于提取响应数据中通过给定Xpath值获得的数据。。。

jmeter(二)录制脚本

对大多数刚开始接触性能测试的人来说,代码功力可能不是太好,我们可以通过工具,录制脚本来进行测试,以达到我们的目的

一般来讲,录制脚本有两种方法

一、利用badboy进行脚本录制

1、下载安装

badboy官网地址:http://www.badboy.com.au

提示:官网下载时候会有用户邮件验证的,直接continue跳过,下载即可

安装:和一般的Windows安装程序没区别,无脑下一步就行;安装完成后一般都会在桌面和开始菜单里面有badboy的快捷方式,如果没有,在badboy安装目录下找到badboy.exe文件,双击启动即可

启动:启动badboy之后,界面如下

img

2、录制

1)如上图,在地址栏(红色标注区域)中输入你需要录制的web应用的URL,这里以http://www.baidu.com为例子

2)点击开始录制按钮(地址栏上方圈出来的地方)开始录制

3)开始录制后,你可以在badboy内嵌的浏览器(界面右侧)对被测应用进行操作,所有操作过程都会记录在界面左侧的编辑窗口(黄色标注区域)

录制的脚本并不是一行行代码,而是一个web对象,有点类似于loadrunner中VuGen中的tree view视图

4)录制完成后,点击工具栏中的停止按钮(绿色标注区域),完成脚本的录制

5)点击file→save或者export to jmeter,将文件保存为jmeter的脚本格式:.jmx;启动jmeter,打开刚录制保存的文件,就可以进行测试了

二、利用jmeter代理服务器进行脚本录制

1、启动jmeter:在测试计划中添加线程组,线程组中添加逻辑控制器→录制控制器

2、工作台:添加非测试元件→http代理服务器

3、端口(代理服务器监听端口):设置为8080(一般来说)

目标控制器:测试计划——线程组

分组选择:每个组放入一个新的控制器

4、http代理服务器:右键单击,添加定时器→高斯随机定时器(告知jmeter在其生成的http请求中自动增加一个定时器)

定时器会使相应的取样器被延迟:上一个请求发送被响应且延时指定时间后,下一个被定时器影响的取样请求才会被发送

如果在代理服务器中使用了高斯随机定时器,则应在其中的固定延迟偏移里添加:**${T}**:用于自动引用记录的延迟时间

5、打开浏览器,网络设置,将局域网设置中的代理服务器设为localhost,端口设置为8080

6、代理服务器配置后之后,点击启动,代理服务器就会开始记录所接受的http请求

7、在浏览器地址栏输入需要测试的地址并进行相关操作,录制完成后,停止http代理服务器,在录制控制器上点击右键,保存录制的脚本

注意:别忘了将代理服务器设置恢复原样

8、脚本录制完毕,启动jmeter,就可以进行测试了

jmeter(六)元件的作用域与执行顺序

jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同。

jmeter的test plan通过图形化的方式表达脚本,域代码方式的脚本不同,图形方式表达的脚本中无法使用变量和函数等描述元件的作用域,因此jmeter主要依靠test plan中元件的相对位置、

父子关系以及元件本身的类型来决定test plan中各元件的执行顺序;原件在test plan中的位置不同,可能导致该元件的行为有很大差异。(新版jmeter都可以自主选择语言,对号入座即可)

1、元件的作用域

jmeter中共有8类可被执行的元件(test plan和thread group不属于元件),其中,sampler(取样器)是不与其他元件发生交互的作用的元件,Logic Controller

(逻辑控制器)只对其子节点的sampler有效,而其他元件需要与sampler等元件交互。

Config Elements(配置元件):影响其范围内的所有元件

Pre-porcessors(前置处理器):在其作用范围内的每一个sampler元件之前执行

Timer(定时器):对其作用范围内的每一个sampler有效

Post-porcessors(后置处理器):在其作用范围内的每一个sampler元件之后执行

Assirtions(断言):对其作用范围内的每一个sampler元件执行后的结果执行校验

Listener(监听器):收集其作用范围内的每一个sampler元件的信息并且呈现出来

在jmeter中,元件的作用域是靠test plan的树形结构中元件的父子关系来确定的,其原则如下:

1) sampler不与其他元件相互作用,因此不存在作用域问题

2) Logic Controller只对其子节点中的sampler和Logic Controller作用

3) 除sampler和Logic Controller外的其他元件,如果是某个sampler的子节点,则该元件仅对其父节点作用

4) 除sampler和Logic Controller外的其他元件,如果其父节点不是sampler,则其作用域是该元件父节点下的其他所有后带节点(包括子节点,子节点的子节点等)

2、元件的执行顺序

在同一作用域范围内,test plan中的元件按照以下顺序执行:

1) Config Elements

2) Pre-porcessors

3) Timer

4) Sampler

5) Post-porcessors(除非Sampler得到的返回结果为空)

6) Assirtions(除非Sampler得到的返回结果为空)

7) Listener(除非Sampler得到的返回结果为空)

注意:Pre-porcessors、Post-porcessors和Assirtions等元件仅对Sampler作用,如在它们作用域内没有任何Sampler,则不会被执行;

如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在test plan中的上下顺序依次执行。

jmeter(三)SOAP/XML-RPC Request

项目背景:公司的微信端H5界面新开发了会员注册功能,需要对其进行压力测试

项目目标:需要承受每分钟最少6000的压力

一、建立一个测试计划(test plan)

之前有说过,jmeter打开后会自动生成一个空的test plan,用户可以基于该test plan建立自己的test plan

一个性能测试的负载必须有一个线程组完成,而一个测试计划必须有至少一个线程组。添加线程组操作如下:

在测试计划处右键单击:添加→Threads(Users)→线程组

img

每个测试计划都必须包含至少一个线程组,当然,也可以包含多个,多个线程组的运行在jmeter中采用的是并行的方式,即:同时被初始化且同时执行其下的sampler

img

线程组主要包含三个参数:

线程数:虚拟用户的数量,一个线程指一个线程或者进程

Ramp—Up Period(in seconds):准备时长。设置的线程数需要多久全部启动,比如上图,线程数为6000,启动时间为60,那么需要60S内启动6000个线程;

循环次数:每个线程发送请求的次数。如上图,6000个线程,每个线程发送1次,如果勾选了永远,那么它将永远发送下去,直到停止脚本;

设置合理的线程数对能否达到测试目标有决定性影响。比如在本例中,如果线程数太少,则无法达到设定的要求;

另外,设置合理的循环次数也很重要,除了给定的设置循环次数和永远,还可以通过勾选调度器,设置开始和结束时间来控制。

二、添加sampler

添加完线程组后,在线程组上右键单击:添加→Sampler→SOAP/XML-RPC Request(SOAP/XML-RPC:都是报文中不同的数据格式)

img

前面说过,取样器(Sampler)是与服务器进行交互的单元。一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录相应时间信息

img

这里解释一下,因为微信H5界面的会员注册,向微信端发送的是xml文件,所以这里我选择的取样器是SOAP/XML-RPC Request

上面的图中,选择SOAP/XML-RPC Request取样器,然后URL一栏输入我们需要进行加压的URL

然后默认选项,Use KeepAlive的意思是:保持连接,这个是http协议报文中的一个首部字段,之前的关于HTTP协议的随笔写过

下面的SOAP/XML-RPC Data输入需要发送的xml格式的文件就行(也可以导入xml文件的文件夹进行读取),下面是xml和json的区别:

img

添加完取样器和具体的地址参数之后,接下来就是添加监听器,对测试结果进行获取

三、添加监听器

在线程组上右键单击,添加你需要的监听器,一般常用的就是结果树和聚合报告

img

添加后启动线程组进行测试,等线程执行完成后,根据结果树中的请求和响应结果(成功或者失败)就可以分析我们的测试是否成功,以及根据聚合报告结果来确认我们这次确认是否达成了预期结果。

四、聚合报告简析

img

Aggregate Report: JMeter 常用的一个 Listener,中文被翻译为“聚合报告”

Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值

#Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100

Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间

Median:中位数,也就是 50% 用户的响应时间

90% Line:90% 用户的响应时间

Note:关于 50% 和 90% 并发用户数的含义,请参考下文

http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html

Min:最小响应时间

Max:最大响应时间

Error%:本次测试中出现错误的请求的数量/请求的总数

Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

·

·

·

· 联系

·

· 管理

随笔 - 228 文章 - 0 评论 - 323

jmeter(四)HTTP请求

启动jmeter,建立一个测试计划

这里再次说说怎么安装和启动jmeter吧,昨天下午又被人问到怎样安装和使用,我也是醉了;在我看来,百度能解决百分之八十的问题,特别是基础的问题。。。

安装:去官网下载一个安装包,官网地址:jmeter.apache.org(Windows系统下载.zip包,Linux系统下载.tgz包)

环境:jmeter是一个纯java工具,因此,JDK必不可少,现在最新版的jmeter是3.1,做了很多的优化,建议使用1.7及以上的JDK

JDK版本请注意和操作系统吻合,下载后默认安装,一般不需要修改环境变量

启动:打开jmeter文件夹,bin文件→jmeter.bat(Windows执行文件)文件,就可以启动jmeter了

启动jmeter,默认有一个测试计划,然后,修改计划名称,尽量使其变得有意义,容易看懂,然后,新建一个线程组

img

这里线程数我设置为1,方便演示

img

然后,添加一个http信息头管理器

img

这里解释一下为什么要添加http信息头管理器:

JMeter不是浏览器,因此其行为并不和浏览器完全一致。这些JMeter提供的配置元件中的HTTP属性管理器用于尽可能模拟浏览器行为,在HTTP协议层上发送给被测应用的http请求

(1)HTTP Request Defaults(请求默认值)

用于设置其作用范围内的所有HTTP的默认值,可被设置的内容包括HTTP请求的host、端口、协议等

(2)HTTP Authorization Manager(授权管理器)

用于设置自动对一些需要NTLM验证的页面进行认证和登录

(3)HTTP Cache Manager

用于模拟浏览器的Cache行为。为Test Plan增加该属性管理器后,Test Plan运行过程中会使用Last-Modified、ETag和Expired等决定是否从Cache中获取相应的元素

(4)HTTP Cookie Manager(cookie管理器)

用于管理Test Plan运行时的所有Cookie。HTTP Cookie Manager可以自动储存服务器发送给客户端的所有Cookie,并在发送请求时附加上合适的Cookie

同时,用户也可以在HTTP Cookie Manager中手工添加一些Cookie,这些被手工添加的Cookie会在发送请求时被自动附加到请求

(5)HTTP Header Manager(信息头管理器)

用于定制Sampler发出的HTTP请求的请求头的内容。不同的浏览器发出的HTTP请求具有不同的Agent

访问某些有防盗链的页面时需要正确的Refer…这些情况下都需要通过HTTP Header Manager来保证发送的HTTP请求是正确的

http信息头管理器添加好之后,需要填入信息头的名称以及对应的值,如下

img

Content-Type意思可以理解为参数名称、类型,值下面输入对应的参数类型就行了,这里我测试时候需要传输json类型,因此就填入了application/json

接着,添加Sampler(取样器)→http请求

img

按照截图所示,填入测试的服务器地址、端口、所用的户协议、方法,这里方法我用的是POST,然后填入路径,选择Body Data;

关于http请求的的属性参数说明:

1)名称:用于标识一个sample。建议使用一个有意义的名称

2)注释:对于测试没任何影响,仅用来记录用户可读的注释信息

3)服务器名称或IP:http请求发送的目标服务器名称或者IP地址,比如http://www.baidu.com

4)端口号:目标服务器的端口号,默认值为80,可不填

5)协议:向目标服务器发送http请求时的协议,http/https,大小写不敏感,默认http

6)方法:发送http请求的方法(链接:http://www.cnblogs.com/imyalost/p/5630940.html)

7)Content encoding:内容的编码方式(Content-Type=application/json;charset=utf-8)

8)路径:目标的URL路径(不包括服务器地址和端口)

9)自动重定向:如果选中该项,发出的http请求得到响应是301/302,jmeter会重定向到新的界面

10)Use keep Alive:jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信(默认选中)

11)Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时,使用

12)Parameters、Body Data以及Files Upload的区别:

1. parameter是指函数定义中参数,而argument指的是函数调用时的实际参数

2. 简略描述为:parameter=形参(formal parameter), argument=实参(actual parameter)

 **3.**在不很严格的情况下,现在二者可以混用,一般用argument,而parameter则比较少用

While defining method, variables passed in the method are called parameters.

当定义方法时,传递到方法中的变量称为参数.

While using those methods, values passed to those variables are called arguments.

当调用方法时,传给变量的值称为引数.(有时argument被翻译为“引数“)

4、Body Data指的是实体数据,就是请求报文里面主体实体的内容,一般我们向服务器发送请求,携带的实体主体参数,可以写入这里

5、Files Upload指的是:从HTML文件获取所有有内含的资源:被选中时,发出HTTP请求并获得响应的HTML文件内容后还对该HTML

进行Parse 并获取HTML中包含的所有资源(图片、flash等):(默认不选中)

如果用户只希望获取特定资源,可以在下方的Embedded URLs must match 文本框中填入需要下载的特定资源表达式,只有能匹配指定正则表达式的URL指向资源会被下载

接下来可以给这个测试计划添加一个监视器,常用的监视器有“查看结果树”和“聚合报告”

添加好监视器,点击运行,开始测试

img

如上,测试结束后,如果我们的请求成功发送给服务器,那么结果树里面的模拟请求会显示为绿色,可以通过取样器结果里面的响应状态码信息来判断

也可以点击请求模块,查看我们发送的请求

img

里面有我们发送的请求的方法、协议、地址以及实体主体数据,以及数据类型,大小,发送时间,客户端版本等信息

响应数据:里面包含服务器返回给我们的响应数据实体,如下图

img

<转>jmeter(十四)HTTP请求之content-type

本博客转载自:http://www.cnblogs.com/dinghanhua/p/5646435.html

个人感觉不错,对jmeter最常用的取样器http请求需要用到的信息头管理器做了很好的解释,推荐推荐!!!

本文讲三种content-type以及在Jmeter中对应的参数输入方式

第一部分:目前工作中涉及到的content-type 有三种:

content-type:在Request Headers里,告诉服务器我们发送的请求信息是哪种格式的。

1 content-type:application/x-www-form-urlencoded

默认的。如果不指定content-type,默认使用此格式。

参数格式:key1=value1&key2=value2

2 content-type:application/json

参数为json格式

{

“key1”:”value1”,

“key2”:”value2”

}

3 content-type:multipart/form-data [**dinghanhua]**

上传文件用这种格式

发送的请求示例:

img

第二部分 不同的content-type如何输入参数

1 content-type:application/x-www-form-urlencoded

参数可以在Parameters或Body Data里输入,格式不同,如下图所示。

这两个参数输入的tab页只能使用一个,某一个有数据后不能切换到另一个。

Parameters:

img

Body Data:

img

2 content-type:application/json

2.1 首先添加信息头管理。http请求上点击右键》添加》配置元件》 HTTP信息头管理器

img

2.2 信息头编辑页面,点击添加,输入content-type application/json

img

2.3 在http请求,Body Data中输入json格式的参数

img

3 content-type:multipart/form-data [**dinghanhua]**

在http请求编辑页面,选中Use multipart/form-data for POST

Parameters中输入除了上传的文件以外的参数:参数名和参数值

Files Upload中上传文件,参数名和MIME类型

img

img

上传文件如果不成功,修改Implementation为java试一下。

img

转载请注明出处,商用请征得作者本人同意,谢谢!!!