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)
描述一个性能测试,包含本次测试所有相关功能
2.2.threads(users)线程
Setup thread group:
一种特殊类型的线程,可用于执行预测试操作。即执行测试前进行定期线程组的执行
Teardown thread group:
一种特殊类型的线程,可用于执行测试后动作。即执行测试结束后执行定期的线程组
以上两个线程组,举个例子:loadrunner 的脚本除了 action 里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块,与其对应
Thread group:
通常添加使用的线程,一般一个线程组可看做一个虚拟用户组,其中每个线程为一个虚拟用户
2.3 测试片段(test fragment)
2.5 版本之后新增的一个选项,是一种特殊的线程组,在测试树上与线程组一个层级,但是它不被执行,除非它是一个模块控制器或者被控制器所引用时才会被执行
2.4 控制器
Jmeter 有 2 种控制器:取样器(sampler)和逻辑控制器(Logic Controller)
作用:用这些原件驱动处理一个测试
1)取样器(Sampler)
是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,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)
包含两类原件:
一类是控制 Test Plan 中 Sampler 节点发送请求的逻辑顺序控制器,常用的有:If Controller、Swith Controller、Loop Controller、Random Controller 等
另一类是用来组织和控制 Sampler 节点的,如 Transaction Controller、Throughput Controller 等
2.5 监听器(Listener)
对测试结果进行处理和可视化展示的一系列组件,常用的有图形结果、查看结果树、聚合报告等
以上的五类原件就可以构成一个简单的性能测试脚本
下面再介绍几种 jmeter 提供的其他组件:
2.6 配置原件(Config Element)
用于提供对静态数据配置的支持。CSV Date Set Config 可以将本地数据文件形成数据池(Date Pool),而对应于 HTTP Request Configuration
和 TCP Request Sample 等类型的 Configuration 元件则可以修改这些 Sample 的默认数据等
2.7 定时器(Time)
用于操作之间设置等待时间,等待时间使性能测试中常用的控制客户端 QPS 的手段,jmeter 定义了 Constant Times、
Constant Throughput Times、Guass Ramdon Times 等不同类型的 Times
2.8 断言(Assertions)
用于检查测试中得到的响应数据等是否符合预期,Assertions 一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致
2.9 前处理器(Pre Processors)
用于在实际请求发出之前对即将发出的请求进行特殊处理。
例如:Count 处理器可以实现自增操作,自增后生成的的数据可以被将要发出的请求使用,而 HTTP URL Re—Writing Modifier 处理器则可以实现 URL 重写,
当 URL 中有 sessionID 一类的 session 信息时,可以通过该处理器填充发出请求实际的 sessionID。
2.10 后处理器(Post Processors)
用于对 Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似 loadrunner 中的关联)。
例如:Regular Expression Extractor 用于提取响应数据中匹配某正则表达式的数据段,并将其填充在参数中,Xpath Extractor 则可以用于提取响应数据中通过给定 Xpath 值
获得的数据。。。
jmeter(二)录制脚本
对大多数刚开始接触性能测试的人来说,代码功力可能不是太好,我们可以通过工具,录制脚本来进行测试,以达到我们的目的
一般来讲,录制脚本有两种方法
一、利用 badboy 进行脚本录制
1、下载安装
badboy 官网地址:http://www.badboy.com.au
提示:官网下载时候会有用户邮件验证的,直接 continue 跳过,下载即可
安装:和一般的 Windows 安装程序没区别,无脑下一步就行;安装完成后一般都会在桌面和开始菜单里面有 badboy 的快捷方式,如果没有,在 badboy 安装目录下找到
badboy.exe 文件,双击启动即可
启动:启动 badboy 之后,界面如下
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(三)SOAP/XML-RPC Request
项目背景:公司的微信端 H5 界面新开发了会员注册功能,需要对其进行压力测试
项目目标:需要承受每分钟最少 6000 的压力
一、建立一个测试计划(test plan)
之前有说过,jmeter 打开后会自动生成一个空的 test plan,用户可以基于该 test plan 建立自己的 test plan
一个性能测试的负载必须有一个线程组完成,而一个测试计划必须有至少一个线程组。添加线程组操作如下:
在测试计划处右键单击:添加→Threads(Users)→线程组
每个测试计划都必须包含至少一个线程组,当然,也可以包含多个,多个线程组的运行在 jmeter 中采用的是并行的方式,即:同时被初始化且同时执行其下的 sampler
线程组主要包含三个参数:
线程数:虚拟用户的数量,一个线程指一个线程或者进程
Ramp—Up Period(in seconds):准备时长。设置的线程数需要多久全部启动,比如上图,线程数为 6000,启动时间为 60,那么需要 60S 内启动 6000 个线程;
循环次数:每个线程发送请求的次数。如上图,6000 个线程,每个线程发送 1 次,如果勾选了永远,那么它将永远发送下去,直到停止脚本;
设置合理的线程数对能否达到测试目标有决定性影响。比如在本例中,如果线程数太少,则无法达到设定的要求;
另外,设置合理的循环次数也很重要,除了给定的设置循环次数和永远,还可以通过勾选调度器,设置开始和结束时间来控制。
二、添加 sampler
添加完线程组后,在线程组上右键单击:添加→Sampler→SOAP/XML-RPC Request(SOAP/XML-RPC:都是报文中不同的数据格式)
前面说过,取样器(Sampler)是与服务器进行交互的单元。一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录相应时间信息
这里解释一下,因为微信 H5 界面的会员注册,向微信端发送的是 xml 文件,所以这里我选择的取样器是 SOAP/XML-RPC Request
上面的图中,选择 SOAP/XML-RPC Request 取样器,然后 URL 一栏输入我们需要进行加压的 URL
然后默认选项,Use KeepAlive 的意思是:保持连接,这个是 http 协议报文中的一个首部字段,之前的关于 HTTP 协议的随笔写过
下面的 SOAP/XML-RPC Data 输入需要发送的 xml 格式的文件就行(也可以导入 xml 文件的文件夹进行读取),下面是 xml 和 json 的区别:
添加完取样器和具体的地址参数之后,接下来就是添加监听器,对测试结果进行获取
三、添加监听器
在线程组上右键单击,添加你需要的监听器,一般常用的就是结果树和聚合报告
添加后启动线程组进行测试,等线程执行完成后,根据结果树中的请求和响应结果(成功或者失败)就可以分析我们的测试是否成功,以及根据聚合报告结果来确认我
们这次确认是否达成了预期结果。
四、聚合报告简析
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
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,默认有一个测试计划,然后,修改计划名称,尽量使其变得有意义,容易看懂,然后,新建一个线程组
这里线程数我设置为 1,方便演示
然后,添加一个 http 信息头管理器