Jmeter介绍以及脚本制作与调试
Jmeter介绍
Jmeter 是 Apache 基金会 Jakarta 上的一个纯 Java 开源项目,起初用于基于 Web 的压力测试(pressure test),后来其应用范围逐渐扩展到对文件传输 FTP, 大型数据库(JDBC 方式),脚本程序(CGI, Perl 等),Web Services,Java 应用 系统等方面的测试。Jmeter 本身主要用于性能测试,如系统压力等。除此之外, Jmeter 能够对应用系统做功能测试和回归测试,并且能够通过使用带有断言的脚 本程序来验证系统然后返回用户期望的结果。为了提高工具的应用灵活性, JMeter 允许使用正则表达式创建断言。正是由于它的灵活性和可扩展性,JMeter 逐渐成为流行的开源测试工具。
Jmeter特点:
- 支持多种服务类型进行测试;
- 支持通过录制\回放的方式获取测试脚本;
- 具备高移植性,是100%的Java程序;
- 采用多线程框架,允许通过多个线程并发取样及通过独立的线程组对不同的功能同时取样;
- 精心设计的GUI支持高速用户操作和精确计时;
- 支持缓存和离线的方式分析\回放测试结果;
- 具备高扩展性 l 支持HTTP、JAVA请求、JMS、EJB、WebService、JDBC、FTP、LDAP、SMTP、 Junit、Mail、MongoDB等
Jmeter与Loadrunner的对比:
1、界面、安装、协议支持、函数库、成本、开源
2、都可以实现分布式负载,相对来说Loadrunner更强大一些
3、都支持在windows和linux环境的负载生成器。控制台方面,Jmeter跨平台、而 LoadRunner不是
4、LoadRunner可以指定每个负载生成器运行不同数量的并发用户,而目前Jmeter 不行
5、Jmeter中测试计划之外的数据文件不会一起发送到负载生成器,而LoadRunner 中的文件可以通过选择纳入LoadRunner的管理而一起发送到远端
Jmeter安装
Jmeter是纯JAVA开发的,能够运行Java程序的系统一般都可以运行Jmeter,如: Windows、Linux、mac等。Windows下安装步骤如下:
第一步:安装JDK,必须JDK1.7以上,推荐1.8版本
第二步:进入jmeter下载面:http://jmeter.apache.org/download_jmeter.cgi 下载相应安装包,如:apache-jmeter-3.0.zip
第三步:解压安装到一个英文名称目录下,如C:\
第四步:配置相应环境变量: 新建JMETER_HOME:C:\apache-jmeter-3.0 修改CLASSPATH:加上:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan. jar;%JMETER_HOME%\lib\logkit-2.0.jar;
第五步:进入C:\apache-jmeter-3.0\bin,进入bin目录后,双击运行jmeter.bat,打 开的时候会有两个窗口,Jmeter的命令窗口和Jmeter的图形操作界面,不可以关闭命令窗口。
Jmeter主要测试组件
JMeter 的主要测试组件总结如下:
- 测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
- 线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请 求内容在Sampler中定义,它被线程组包含。
- 监听器负责收集测试结果,同时也被告知了结果显示的方式。
- 逻辑控制器可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以 模拟复杂的请求序列。
- 断言可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域, 即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。
- 配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
- 前置处理器和后置处理器负责在生成请求之前和之后完成工作。前置处理器常常 用来修改请求的设置,后置处理器则常常用来处理响应的数据。
- 定时器负责定义请求之间的延迟间隔。
9.取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应 时间的最小单元,JMeter 原生支持多种不同的sampler ,如 HTTP Request Sampler 、 FTP Request Sample 、TCP Request Sample 、JDBC Request Sampler 等,每一种不 同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。
10.测试片段(Test Fragment)测试片段元素是控制器上的一个种特殊的线程组, 它在测试树上与线程组处于一个层级。它与线程组有所不同,因为它不被执行,除 非它是一个模块控制器或者是被控制器所引用时才会被执行。
11.工作台:录制http协议脚本时用到,可以在它下面新建一个代理服务器原件,设 置代理后在进行录制;设置服务器监控,监控被测服务器性能指标,不建议这么做, 会对jmeter进行测试时产生影响;可以显示jmeter相关信息;备份脚本,脚本调试 的时候可以把它作为一个原件暂存区。
Jmeter元件作用域与执行顺序
元件的作用域:
配置元件(config elements ) :元件会影响其作用范围内的所有元件。
前置处理程序(Per-processors):元件在其作用范围内的每一个sampler元件之前执行。
定时器(timers ):元件对其作用范围内的每一个sampler有效
后置处理程序(Post-processors):元件在其作用范围内的每一个sampler元件之后执行。
断言(Assertions):元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。
监听器(Listeners):元件收集其作用范围的每一个sampler元件的信息并呈现。 总结:从各个元件的层次结构判断每个元件的作用域
元件的执行顺序:
配置元件-->前置处理程序-->定时器-->取样器-->后置处理程序(除非Sampler 得到的返 回结果为空)-->断言(除非Sampler 得到的返回结果为空)-->监听器(除非Sampler 得到的返回结果为空)
关于执行顺序,有两点需要注意:
前置处理器、后置处理器和断言等元件公能对 取样器作用,因此,如果在它们的作用 域内没有任何取样器,则不会被执行。
如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中 的上下顺序一次执行。
Jmeter运行原理
Jmeter运行在JVM虚拟机上,每个进程的开销比较大,且java 支持多线程,所 以Jmeter是以线程的方式来运行测试的。
Jmeter通过线程组来驱动多个线程运行测试脚本对被测试服务器发起负载,每 一个负载机上都可以运行多个线程组,Jmeter运行场景不仅可以在GUI方式中完成, 还可以使用命令行,而且命令行运行的方式对于负载机的资源消耗会更小。
控制机:运用多台Jmeter负载机进行性能测试时,被选中作为管理机的那台机器称 为控制机,该台机器也能运行脚本,同时也用来管理远程负载机运行的任务,并且 收集测试结果。
负载机:向被测服务器发起负载的机器,控制机会把测试脚本发送给负载机,如果 运行的测试脚本有参数文件以及依赖的jar包时,控制机不能发送,需要手动拷贝 到负载机本地。
运行过程如下:
远程负载机启动程序,等待控制机连接;
控制机连接上远程负载机;
控制机发送指令(脚本及启动命令)启动线程;
负载机运行脚本,回传测试数据;
控制机收集结果并显示
Jmeter脚本制作
Jmeter脚本制作一般分为两种方式:
利用工具录制脚本、手工编写脚本
Http代理方式录制功能:该功能的原理是解析网络数据包,按Http协议的方式包装 成Http Request、Http Response等对象
第三方工具Badboy进行录制:Badboy简单来说是一个浏览器模拟工具,具有录制 与回放功能,也能进行调试。
手工编写脚本,一般通过fiddler抓包或者开发提供的接口设计文档的形式,在 Jmeter的GUI界面操作进行脚本生成,还可以使用编写java代码打包成jar包进行生 成等方式。
Badboy介绍:
Badboy是用C++开发的动态应用测试工具,其拥有强大的屏幕录制和回放功 能,同时提供图形结果分析功能。
Badboy录制的脚本可以导出成.jmx后缀的格式,jmx正是Jmeter脚本保存的格 式,其实质是一个XML格式的文件。
Badboy的录制方式有两种:一种是Request方式,一种是Navigation方式,通 过工具栏的 'N' 按钮切换;Request方式是模拟浏览器发送表单信息到服务器,每 一个资源都将作为请求发送;Navigation方式是记录用户鼠标的操作动作,回放 时模拟界面点击,类似于UI自动化测试工具selenium。
因Jmeter对脚本的需要,我们使用Request方式进行录制生成jmx格式脚本。
Badboy安装:
Badboy安装与其它Windows应用程序安装方式一样,双击exe文件即可完成安装。
Badboy界面介绍(以LR示例网站为例):
Badboy使用:
1、在地址栏输入被测网站地址,回车、F5或者点击 ;
2、左边显示script(脚本)的目录结构;
3、Test Suite1:脚本的根节点,类似Jmeter的测试计划节点;
4、Test1:测试场景根节点,类似一个业务功能的脚本存放在此目录下;
5、Step1:测试活动的步骤,如果一个业务操作过长,比如:订票业务它分为登 录、进入订票界面、订票等步骤,可以把它分为几个Step,也可以录制成一个 Step,导入Jmeter后再根据业务进行拆分;
6、录制完测试脚本后,通过点击File→Export to JMeter...→另存为".jmx"→保存;
7、启动jmeter,点击文件→打开→选中“.jmx”→打开, 添加"查看结束树"和"聚合报告",右击Thread Group→添加→监听器→查看结果树, ,右击Thread Group→添加→监听器→聚合报告;
8、启动脚本运行完毕后"查看结果树",验证脚本的正确性
Jmeter的Http代理方式录制:
1、浏览器配置代理:
打开IE浏览器,进入工具--Internet选项-连接--局域网设置,如下图设置:
备注:如果有本地使用了8080端口,为了避免端口冲突,可以换成其它的
2、Jmeter配置控制器:
打开Jmeter,新增一个线程组,然后在其下面新增一个控制器(录制控制器、简单控 制器)。
3、Jmeter中配置代理:
在Jmeter中,右击控制台--添加--非测试原件--HTTP代理服务器,然后排除模式添加一 个设置: .*.(bmp|css|js|gif|ico|jp?g|png|swf|woff),然后勾选Regex matching(正则 匹配)
4、启动Jmeter代理服务器并开始录制:
拖动Jmeter代理服务器界面的滚动条到最下面,点击启动按钮。然后直接在IE浏览器下 操作即可,此时可以看见操作过程中会在录制控制器下生成请求。由于在排除模式添 加了正则表达式。可以排除一些图片等的请求。
手工脚本制作:
在Jmeter手工制作脚本之前,先要获取HTTP请求的相关信息,如请求地址、 请求参数、请求类型等,一般情况下,有两种方法获取这些相关信息:
1、根据开发提供的接口设计规范文档;
2、使用第三方抓包工具如Fiddler、Charles等抓包,然后从中提取信息。 HTTP请求添加方法:线程组 -->右键添加 -->Sampler -->HTTP请求。如下图界面
HTTP请求界面说明:
名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
注释:对于测试没有任何作用,仅用户记录用户可读的注释信息。
服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。
端口号:目标服务器的端口号,默认值为80 。
Timeouts:指定超时时间,单位是毫秒,Connect指定连接超时时间,Response指定 响应超时时间。
Implementation:实现方式,有三个选择项,默认值为Jmeter属性:jemter.
httpsampler,其中HttpClient可以高效的访问HTTP协议的资源,可以看成是一个没 有界面的浏览器。Java选项,使用JDK提供的net包中的工具类来访问。一般建议使用
HttpClient4。 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS ,默认值 为http 。
方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、 TRACE、DELETE等。
Content encoding :内容的编码方式,默认值为iso8859,如果不确定可以向开发团 队确定,大多数会指定为utf-8格式。
路径:目标URL路径(不包括服务器地址和端口)
自动重定向:如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面。
跟随重定向:Http Request 取样器的默认选项,当响应Code是3**时,自动跳转到目标地址。与自动重定向不同的是,Jmeter会记录重定向过程中的所有的请求响应,在 查看结果树时可以看到服务器返回的内容。
Use keep Alive : 当该选项被选中时,jmeter 和目标服务器之间使用 Keep-Alive方式 进行HTTP通信,默认选中。
Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时,使用Use
multipart/from-data方法发送,默认不选中。比如可以用它来做文件上传。
Browser-compatible headers:浏览器兼容模式,如果使用Use multipart/from-data for HTTP POST,建议勾选此项。
Parameters 同请求一起发送参数 :可以把要发送的参数与值填如此域。
Body Data:同请求一起发送的数据信息,这里可以支持多种数据格式,json、xml等
Files Upload:同请求一起发送的文件。MIME类型有STRICT、RFC6532、
BROWSER_COMPATTIBLE等,如不知道MIME类型,可以使用抓包工具获取。
Proxy Server:当测试时网络使用了网络代理就需要在此配置代理服务器。
请求头设置:
http请求头设置在Jmeter中需要使用到HTTP信息头管理器。该属性管理器用 于定制Sampler发出的HTTP请求的请求头的内容。不同的浏览器发出的HTTP请求 具有不同的Agent,访问某些有防盗链的页面时需要正确的Refer...这些情况下都需 要通过HTTP信息头管理器来保证发送的HTTP请求是正确的。
https请求配置: 要发送https的请求,需要在http请求或者http请求默认值做如下配置:
发送带参数的post请求:
发送带Json串的post请求:
第一步:需要在HTTP信息头管理器添加一条名称为 Content-Type,值为 application/json
第二步:如下图操作,把json数据放入到Body Data中
Jmeter脚本调试
调试与调优:
调试:当开发的代码或者编写的脚本出现功能不能实现的时候,去修改代码,让
功能实现的过程称为调试。
调优:当开发的代码功能没有问题,效率或者可读性不佳的时候,去改进代码效
率或可读性的过程称为调优。
Jmeter脚本调试即调整修改脚本让其完成录制时的业务功能。
Jmeter脚本调试的过程如下:
录制脚本-->回放-->处理关联(如果需要) -->再次回放-->验证脚本的正确性
Jmeter关联的概念:
在脚本回放过程中,客户端发出请求,通过Jmeter中的正 则表达式提取器所
定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相
应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这
种动态获得服务器响应内容的方法称作关联。通俗点说,就是把脚本中某些写死
的(hard-coded) 数据,转变成撷取自服务器所送的、动态的、每次都不一样的
数据。
关联的应用场合:
当客户端的某个请求是随着服务器端的响应而动态变化的时候,我们就需要 用到关联。
举例一:登录过程
客户端发出获得登录页面的请求, 服务器端得到该请求后,返回登录页面, 同时动态生成一个Session Id;当用户输入用户名密码,请求登录时,该Session Id同时被发送到服务器端;如果该Session Id在当前会话中有效,那么返回登录 成功的页面,如果不正确则登录失败。
在第一次录制过程中Jmeter把这个值记录了下来,写到了脚本中,但再次回 放时,客户端发出同样的请求,而服务器端再一次动态的生成了Session Id,此 时客户端发出的请求就是错误的,为了获得这个动态的Session Id我们就要用到关联技术。
针对Jmeter实际操作来讲,就是使用正则表达式提取器从上一个请求的返回值中取出需要关联的数据做成Jmeter参数,把这个Jmeter参数提供给下面接口 使用的过程。
举例二:随机发帖过程
一个论坛系统,我们录制脚本指定版块发帖后,之后的脚本都会只对这个版块发帖,假设这个版块不存在,或者要做随机发帖的时候,那明显一个固定的版块不满足实际的业务需求,此时也可以使用关联来解决此问题。
Jmeter关联实现:
在需要获得数据的请求上右击添加一个后置处理器-->正则表达式提取器,界面
如下:
名称:随意设置,最好具有业务上的意义,方便区分
注释:随意设置,一般不填写
Apply to:应用范围,包含4个选项。
Main sample and sub-samples:匹配范围包括当前父取样器并覆盖子取样器。 Main sample only:匹配范围是当前父取样器(一般默认选择这个)。
Sub-samples only:仅匹配子取样器。
Jmeter Variable:支持对Jmeter变量值进行匹配。
要检查的响应字段:针对响应数据的不同部分进行匹配,共七个选项。
主体:响应数据的主体部分,排除Header部分;Http协议返回请求的主体部分就是 Body。(一般默认选择这个)
Body(unescaped):针对替换了转义码的Body部分。
Body as a Document:返回内容作为一个文档进行匹配。
信息头:只匹配信息头部分的内容。
URL:只匹配URL链接。
响应代码:匹配响应代码,比如状态码200代表成功等。
响应信息:匹配响应信息,比如”成功” “OK”等。
引用名称:即下一个请求要引用的参数名称,如填写sessionid,则可用\({sessionid} 引用它。
正则表达式:正则表达式提取器根据该处的设置进行信息匹配
模板:用\)$引用起来,如果在正则表达式中有多个正则表达式,则可以是\(1\),\(2\) 等等,表示解析到的第几个值给sessionid,\(1\)表示第一个模板,\(0\)表示全文匹配。
匹配数字:用正则表达式匹配的时候,可能出现多个值的情况,为正数用来确定取 一组值中的第几个,为0表示随机取匹配值,负数取所有值。
默认值:如果没有匹配到可以指定一个默认值。
正则表达式使用:
1、提取单个字符串:
假如想匹配Web页面的如下部分:id = "kw" name = "wd">并提取wd。一个合适 的正则表达式:id = "kw" name = "(.+?)">
2、提取多个字符串:
假如想匹配Web页面的如下部分:id = "kw" name = "wd">并提取kw和wd。一个 合适的正则表达式:id = "(.+?)" name = "(.+?)"。这样就会创建2个组,分别用于\(1\) 和\(2\)
比如:
引用名称:Data
模板:\(1\)\(2\)
如下变量的值将会被设定:
Data: kwwd
Data_g0: id = "kw" name = "wd"
Data_g1: kw
Data_g2: wd
在需要引用地方可以通过:${Data}, ${Data_g1}进行使用。
其中:.代表任意字符,+表示一次或多次,代表出现任意次,?表示懒惰模式, 必须跟在或者+后边用
为了查看正则表达式提取器的取值,我们可以添加一个Debug Sampler,添加后, 运行脚本,然后可以在察看结果树中查看正则表达式提取器的取值。如下图所示: