Jmeter教程

jmeter(1):基础介绍

1、优势javascript

一、开源工具,可扩展性很是好html

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

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

四、彻底的可移植性和100%纯javagit

五、彻底swing和轻量组件支持(预编译的HAR使用javax.swing.*)包github

六、彻底多线程框架,容许经过多个线程并发取样以及单独的线程对不一样的功能同时取样web

七、支持脚本取样器正则表达式

 

2、安装及下载redis

这里附一个最新的jmeter官网下载地址:http://jmeter.apache.org/download_jmeter.cgi算法

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

jmeter自己不须要安装,只须要配置好JDK环境,而后在在jmeter文件中的bin文件中打开jmeter.bat文件便可

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

 

3、基础构成

一、组成部分

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

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

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

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

 

二、主要概念

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(2):脚本录制

通常来说,录制脚本有两种方法

1、利用badboy进行脚本录制

一、下载安装

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

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

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

启动:启动badboy以后,界面以下

 

二、录制

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,打开刚录制保存的文件,就能够进行测试了

 

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

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

 

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

 

三、端口(代理服务器监听端口):设置为8080(通常来讲)

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

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

 

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

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

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

 

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

 

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

 

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

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

 

八、脚本录制完毕,启动jmeter,就能够进行测试了

 

jmeter(3):SOAP、XML-RPC Request

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

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

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

以前有说过,jmeter打开后会自动生成一个空的test plan,用户能够基于该test plan创建本身的test plan

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

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

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

 

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

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

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

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

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

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

 

2、添加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的区别:

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

 

3、添加监听器

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

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

 

4、聚合报告简析

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(4):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信息头管理器

 

这里解释一下为何要添加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信息头管理器添加好以后,须要填入信息头的名称以及对应的值,以下

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

 

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

按照截图所示,填入测试的服务器地址、端口、所用的户协议、方法,这里方法我用的是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被翻译为“引数“)

   四、Body Data指的是实体数据,就是请求报文里面主体实体的内容,通常咱们向服务器发送请求,携带的实体主体参数,能够写入这里

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

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

      若是用户只但愿获取特定资源,能够在下方的Embedded URLs must match 文本框中填入须要下载的特定资源表达式,只有能匹配指定正则表达式的URL指向资源会被下载

 

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

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

 

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

也能够点击请求模块,查看咱们发送的请求

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

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

 

jmeter(5):JDBC Request

jmeter中取样器(Sampler)是与服务器进行交互的单元。一个取样器一般进行三部分的工做:向服务器发送请求,记录服务器的响应数据和记录响应时间信息

有时候工做中咱们须要对数据库发起请求或者对数据库施加压力,那么这时候就须要用到JDBC Request

JDBC Request能够向数据库发送一个请求(sql语句),通常它须要配合JDBC Connection Configuration配置元件一块儿使用

首先,仍是先创建一个测试计划,添加线程组

为了方便,这里线程数我设置为1,而后在线程组上面右键单击选择配置元件→ JDBC Connection Configuration(JDBC链接配置)

 

JDBC Connection Configuration界面以下:

Variable Name(变量名):这里写入数据库链接池的名字

Database URL:数据库链接地址

JDBC Driver class:数据库驱动(能够将须要链接的数据库驱动jar包复制到jmeter的lib/目录下,而后在设置测试计划界面,最下面的Library中导入)

Username:数据库登陆名

Password:数据库登录密码

这里顺带说说不一样数据库的驱动类和URL格式:

 

设置好JDBC链接配置后,添加JDBC请求,界面以下:

Variable name:这里写入数据库链接池的名字(和JDBC Connection Configuration名字保持一致 )

Query:里面填入查询数据库数据的SQL语句(填写的SQL语句末尾不要加“;”)

parameter valus:数据的参数值

parameter types:数据的参数类型

cariable names:保存SQL语句返回结果的变量名

result cariable name:建立一个对象变量,保存全部返回结果

query timeout:查询超时时间

handle result set:定义如何处理由callable statements语句返回的结果

 

完成了上面的操做后,就能够添加监听器,来查看咱们的请求是否成功了

这是请求内容,即SQL语句

这是响应数据,正确的显示了我查询的该表的对应字段的数据

 

jmeter这个工具仍是蛮强大的,每一个组件的做用都不一样,不一样组合的状况下,能够实现95%的性能测试的辅助工做。

 

jmeter(6):元件的做用域和执行顺序

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

jmeter的test plan经过图形化的方式表达脚本,域代码方式的脚本不一样,图形方式表达的脚本中没法使用变量和函数等描述元件的做用域,所以jmeter主要依靠test plan中元件的相对位置、

父子关系以及元件自己的类型来决定test plan中各元件的执行顺序;原件在test plan中的位置不一样,可能致使该元件的行为有很大差别。(新版jmeter均可以自主选择语言,对号入座便可)

 

一、元件的做用域

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,则其做用域是该元件父节点下的其余全部后带节点(包括子节点,子节点的子节点等)

 

二、元件的执行顺序

在同一做用域范围内,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(7):定时器

jmeter提供了不少元件,帮助咱们更好的完成各类场景的性能测试,其中,定时器(timer)是很重要的一个元件,最新的3.0版本jemter提供了9种定时器(以前6种),下面一一介绍:

1、定时器的做用域

一、定时器是在每一个sampler(采样器)以前执行的,而不是以后(不管定时器位置在sampler以前仍是下面);

二、当执行一个sampler以前时,全部当前做用域内的定时器都会被执行;

三、若是但愿定时器仅应用于其中一个sampler,则把定时器做为子节点加入;

四、若是但愿在sampler执行完以后再等待,则能够使用Test Action;

2、定时器的做用

一、固定定时器(Constant Timer)

若是你须要让每一个线程在请求以前按相同的指定时间停顿,那么能够使用这个定时器;须要注意的是,固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间。

对于“java请求”这个sampler来讲,定时器至关于loadrunner中的pacing(两次迭代之间的间隔时间);

对于“事务控制器”来讲,定时器至关于loadrunner中的think time(思考时间:实际操做中,模拟真实用户在操做过程当中的等待时间)。

这里有对loadrunner中的pacing和think time有比较全面的解释:

https://zhidao.baidu.com/question/1431215934913423459.html

咱们一般说的响应时间,应该大部分状况下是针对某一个具体的sampler(http请求),而不是针对一组sampler组合的事务 。

二、高斯随机定时器(Gaussian Random Timer)

如须要每一个线程在请求前按随机时间停顿,那么使用这个定时器,上图表示暂停时间会分布在100到400之间,计算公式参考:Math.abs((this.random.nextGaussian() * 300) + 100)

什么是高斯随机分布:https://zhidao.baidu.com/question/89318504.html

三、均匀随机定时器(Uniform Random Timer)

和高斯随机定时器的做用差别不大,区别在于延时时间在指定范围内且每一个时间的取值几率相同,每一个时间间隔都有相同的几率发生,总的延迟时间就是随机值和偏移值之和。

下面表示的是随机延迟时间的最大值是100毫秒:

(1)Random Delay Maximum(in milliseconds):随机延迟时间的最大毫秒数

(2)Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数

 

四、固定吞吐量定时器(Constant Throughput Timer)

 

可让JMeter以指定数字的吞吐量(即指定TPS,只是这里要求指定每分钟的执行数,而不是每秒)执行。

吞吐量计算的范围能够为指定为当前线程、当前线程组、全部线程组等范围,而且计算吞吐量的依据能够是最近一次线程的执行时延。这种定时器在特定的场景下,仍是颇有用的。

 

五、同步定时器(Synchronizing Timer)

 

这个定时器和loadrunner当中的集合点(rendezvous point)做用类似,其做用是:阻塞线程,直到指定的线程数量到达后,再一块儿释放,能够瞬间产生很大的压力(人多力量大- -哈哈!)

(1)Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量

(2)Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数

 

六、BeanShell定时器(BeanShell Timer)

 

这个定时器,通常状况下用不到,但它能够说是最强大的,由于能够本身变成实现想要作的任何事情,例如:但愿在每一个线程执行完等待一下,或者但愿在某个变量达到指定值的时候等待一下。

这里给你们介绍下BeanShell:

BeanShell是一种松散类型的脚本语言(这点和JS相似),一种彻底符合java语法的java脚本语言,而且又拥有本身的一些语法和方法。

七、bos(Poisson Random Timer)

这个定时器在每一个线程请求以前按随机的时间停顿,大部分的时间间隔出如今一个特定的值,总的延迟就是泊松分布值和偏移值之和。

上面表示暂停时间会分布在100到400毫秒之间:

(1)Lambda(in milliseconds):兰布达值

(2)Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数

泊松随机数: https://baike.baidu.com/item/%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83?fr=aladdin

八、JSR223定时器(JSR223 Timer)

在jemter最新的版本中,新增了这个定时器,能够这么理解,这个定时器至关于BeanShell定时器的“父集”,它能够使用java、JavaScript、beanshell等多种语言去实现你但愿完成的事情;

咱们都知道jemter是一种开源的纯java工具,能够本身构件各个组件,jar包去完成各类事情。

关于JSR223 :  https://wenku.baidu.com/view/8803a30af78a6529647d53ff.html

九、BSF定时器(BSF Timer)

BSF Timer,也是jmeter新的版本中新增的定时器,其使用方法和JSR223 Timer很类似,只须要在jmeter的lib文件夹导入其jar包,就能够支持脚本语言直接访问Java对象和方法的必定时器。

有了它 , 你就能在java application中使用javascript, Python, XSLT, Perl, tcl, ……等一大堆scripting language. 反过来也能够;

就是在这些scripting language中调用任何已经注册过了的JavaBean,java object。它提供了完整的API实现经过Java访问脚本语言的引擎。

因为本人对java了解不深,只能经过查阅相关资料,简单描述下其做用,不足之处,但愿指正。

BSF : https://baike.baidu.com/item/BSF/5847319?fr=aladdin

 

jmeter(8):断言

jmeter中有个元件叫作断言(Assertion),它的做用和loadrunner中的检查点相似;

用于检查测试中获得的响应数据等是否符合预期,用以保证性能测试过程当中的数据交互与预期一致。

使用断言的目的:在request的返回层面增长一层判断机制;由于request成功了,并不表明结果必定正确。

使用断言的方法:

在选择的Sampler下添加对应的断言(由于不一样类型的断言检查的内容不一样);配置好响应的检查内容(根据断言状况而定,有的断言控制面板不须要添加任何内容,如XML Assertion)。

添加一个断言结果的监听器(从监听器中添加),经过“断言结果”能够看到是否经过断言;对于一次请求,若是经过的话,断言结果中只会打印一行请求的名称;

  若是失败,则除了请求的名称外,还会有一行失败的缘由(不一样类型的断言,结果不一样)。

PS:一个Sampler能够添加多个断言,根据你的检查需求来添加相应的断言,当Sampler下全部的断言都经过了,那么才算request成功。

最新版本的3.0jmeter中有13种不一样的断言,下面简单介绍下每一个断言各自拥有什么样的做用以及它们的适用场景:

 

一、BeanShell断言

BeanShell以前关于定时器的随笔中有介绍过,是一种松散类型的脚本语言(这点和JS相似),一种彻底符合java语法的java脚本语言,而且又拥有本身的一些语法和方法;

做用对象:针对sampler中的Bean Shell sampler而使用的断言

Name:断言的名字(能够用一个比较容易理解和分辨的名称)

Comments:注释(对这个断言进行一个解释,备注)

Reset bsh.interpreter before each call:在每次调用Bean Shell以前重置bsh.interpreter类(bsh.interpreter是Bean Shell脚本语言的一种类,也能够理解为一种解析器)

Parameters(String Parameters and String []bsh.args):String参数(String []bsh.args是主类main函数的形式参数,是一个String 对象数组,能够用来获取命令行用户输入进去的参数)

Script file:脚本文件(能够填入脚本文件路径)

Script(see below for variables that are defined):参照下文定义的变量(使脚本文件参照定义的变量来运行)

 

二、 BSF断言

BSF(Bean Scripting Framework)以前也介绍过,是一个支持在Java应用程序内调用脚本语言 (Script),而且支持脚本语言直接访问Java对象和方法的一个开源项目;

做用对象:针对sampler中的BSF sampler而使用的断言

Script language(e.g.beanshell,javascirpt,jexl):脚本语言(能够从下面的下拉框中选择对应的脚本语言JavaScript、beanshell等)

parameters to be passed to script(=> String Parameters and String []args):(传递给脚本的参数→能够理解为使用BSF断言脚本时候一块儿引用的参数 )

Script file(overrides script):重写脚本(能够经过选择脚本文件的状态,是浏览调用已有的脚本仍是在在下方的输入框内写入脚本;)

Script:下面的输入框表示能够输入变量类型,运用的脚本(取样结果、断言结果、取样日志文件等参数)

 

三、比较断言(compare  assertion)

这是一种比较特殊的断言元件,针对断言进行字符串替换时使用;

做用对象:须要替换的字符串

Select Comparison Operators:选择比较运算符

Compare Content:能够选择比较的内容类型(true/false或者自定义,编辑)

Compare Time:比较时间(能够设定比较的时间,单位为秒,默认为-1)

Comparison Fitters:比较修改工具

regular expression substitutions:替换正则表达式

Regex String:要替换的字符串(可从断言结果中选择)

substitutions:替换的字符串(替换结果)

 

四、HTML断言

对响应类为XML类型的文件进行断言;

做用对象:针对sampler中的SOAP/XML-RPC Request而使用的断言

Tidy Settings:Tidy 环境(Tidy是一个HTML语法检查器和打印工具,能够将HTML转换为XML类型的文件)

Doctype:文档类型(可经过下拉框选择不一样文档类型→ omit疏忽遗漏的/auto动态的/strict严格的/loose宽泛的。。。。。。我也不太懂这里什么意思GG)

Format:文件格式(可选择HTML/XHTML/XML三种不一样类型的文件格式来检查返回内容)

Errors only:偏差校订(能接受的最大值)

Error threshold:偏差/错误范围(可选择偏差/错误数量的范围,最大值)

Warning threshold:警告范围(可选择偏差警告的数量范围,最大值)

若是勾选“Error only”这里忽略Warning,只对偏差做统计检查;若是对返回内容的检查结果不超过指定结果,则断言经过,不然失败。

Write JTidy report to file:写入JTidy报告的文件(JTidy是Tidy的一个java移植,能够将它当成一个处理HTML文件的DOM解析器)

 

五、JSR223断言

JSR223即Java 规范请求,是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求;

做用对象:针对sampler中的JSR223 sampler而使用的断言

Script language(e.g.beanshell,javascirpt,jexl):脚本语言(能够从下面的下拉框中选择对应的脚本语言JavaScript、beanshell等)

parameters to be passed to script(=> String Parameters and String []args):(传递给脚本的参数→能够理解为使用JSR223断言脚本时候一块儿引用的参数 )

Script file(overrides script):重写脚本(能够经过选择脚本文件的状态,是浏览调用已有的脚本仍是在在下方的输入框内写入脚本;)

Script:下面的输入框表示能够输入变量类型,运用的脚本(取样结果、断言结果、取样日志文件等参数)

 

六、MD5Hex断言

MD5是一种消息摘要算法,用以提供消息的完整性保护(具体关于MD5的知识请自行查询);

做用对象:针对参数类型为MD5Hex加密的参数的断言

MD5Hex:将已被MD5加密的参数写入其中,添加取样器等其余元件

 

七、Size断言

用于判断返回内容的大小;

做用对象:返回信息,响应报文

APPly to:应用范围(返回内容的断言范围)

         Main sample and sub-samples:做用于父节点取样器及对应子节点取样器

         Main sample only:仅做用于父节点取样器

         Sub-samples only:仅做用于子节点取样器

         JMeter Variable:做用于jmeter变量(输入框内可输入jmeter的变量名称)

Response Size Field to Test:响应字节的测试范围(能够选择用于判断的响应范围)

         Full Response:所有响应

         Response Headers:响应头部

         Response Body:响应主体

         响应代码:响应报文相关的代码

         响应信息:响应报文的信息

         Size to Assert:断言字节范围

         字节大小单位为:字节;比较顺序是①返回内容的大小②比较类型③指定字节大小

 

八、SMIME断言

SMIME是一种多用途网际邮件扩充协议,相比于以前的SMAP邮件传输协议,增长了安全性,对邮件主题进行保护;

做用对象:针对采用了该种邮件传输协议的信息

signature:签名(可选择对协议的签名验证状态)

          Verify signature:验证签名

          Message not signed:没有签名消息

Signer certificate:签名证书(由于SMIME协议增长了安全传输,须要证书验证)

          No check:不检查

          Check values:检查

Signer distinguished name:签名证书者名称(证书注册者的名称)

Sigmer email address:签名者的邮件地址(注册的邮件地址)

Issuer distinguished name:发行者名称(由谁发行的证书)

Serial Number:证书序号

Certificate file:选择证书文件

Execute assertion message at position:执行断言消息的位置(在返回消息的具体哪一个位置执行断言)

 

九、XML概要断言

亦能够称为XML模型断言/XML数据类型断言;XML Schema 定义了两种主要的数据类型:①xml document schema 文档架构 ;② 文档架构xml-schema xml模式

做用对象:返回结果为XML概要断言的2中数据类型的消息

XML Schema:XML概要模型

File Name:文件名(写入须要断言的文件名称)

 

十、XML断言

XML(可扩展标记语言) 提供一种描述结构化数据的方法。与主要用于控制数据的显示和外观的 HTML 标记不一样,XML 标记用于定义数据自己的结构和数据类型;

做用对象:判断返回结果是否和xml的格式即<></>成对出现

 

十一、XPath断言

XPath即为XML路径语言,它是一种用来肯定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

做用对象:针对返回信息为XPAth的数据类型进行断言

Apply to:适用范围

         Main sample and sub-samples:主要样本和次级样本

         Main sample only:仅主要样本

         Sub-samples only:仅次级样本

         JMeter Variable:jmeter变量(输入框内可输入jmeter的变量名称)

XML Parsing Options:XML解析选项

         Use Tidy(tolerant parser):使用Tidy(容错解析器),默认选择quiet(不显示)

         Quiet:不显示

         Report errors:错误报告

         Show warnings:显示错误

         Use Namespaces:使用名称空间

         Validate XML:验证XML(文件包/数据)

         Ignore Whitespace:忽略空格(容许你指定语法分析器能够忽略哪一个空格,而哪一个空格重要的)

         Fetch external DTDs:获取外部DTDs(一些XML元素具备属性,属性包含应用程序使用的信息,属性仅在程序对元素进行读、写操做时,提供元素的额外信息,这时候须要在DTDs中声明)

XPath Assertion:输入框中写入xpath断言,点击Validate验证其正确性

         True if nothing matches:确认都不匹配

 

十二、响应断言

判断返回内容中的内容

做用对象:响应报文中的全部对象

APPly to:适用范围

         Main sample and sub-samples:做用于父节点取样器及对应子节点取样器

         Main sample only:仅做用于父节点取样器

         Sub-samples only:仅做用于子节点取样器

         JMeter Variable:做用于jmeter变量(输入框内可输入jmeter的变量名称)

要测试的响应字段:要检查的项

                响应报文

                Documeng(text):测试文件

                URL样本

                响应代码

                响应信息

                Response Headers:响应头部

                Ignore status:忽略返回的响应报文状态码

模式匹配规则:

           包括:返回结果包括你指定的内容

           匹配:(好像跟Equals查很少,弄不明白有什么区别)   

           Equals:返回结果与你指定结果一致

           Substring:返回结果是指定结果的字串

           否:不进行匹配

要测试的模式:即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理

 

1三、断言持续时间

用于判断服务器的响应时间

做用对象:服务器

 

APPly to:适用范围

         Main sample and sub-samples:做用于父节点取样器及对应子节点取样器

         Main sample only:仅做用于父节点取样器

         Sub-samples only:仅做用于子节点取样器

Duration to assert:持续断言

Duration in milliseconds:响应时间设置(单位:毫秒),若是响应时间大于设置的响应时间,则断言失败,不然成功!

 

jmeter(9):逻辑控制器

jmeter中逻辑控制器(Logic Controllers)的做用域只对其子节点的sampler有效,做用是控制采样器的执行顺序。

jmeter提供了17种逻辑控制器,它们各个功能都不尽相同,大概能够分为2种使用类型:

①.控制测试计划执行过程当中节点的逻辑执行顺序,如:Loop Controller(循环控制器)、If Controller(若是if控制器)等;

②.对测试计划中的脚本进行分组,方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等

 

jmeter提供以下17种逻辑控制器:

 

1、临界区控制器(critical section Controller)

做用:临界区控制器确保其子节点下的取样器或控制器将被执行(只有一个线程做为一个锁)

名称和注释很简单,就是给控制器添加一个备注,令人明白这个控制器的解释含义的意思

Lock name:锁名称,这里能够填入其子节点下执行的线程的名称,这个线程做为一个全局锁存在

 

二、遍历循环控制器(ForEach Controller)

做用:用来遍历当前元素的全部可执行场景;在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或屡次,每次读取不一样的变量值;

输入变量前缀:在其中输入须要遍历的用户参数(User Parameter)

Start index for loop(exclusive):循环指数开始(惟一)→ 遍历查询的变量范围,开始的值(这里若是不填写,默认从1开始,若是没有1开始的变量,执行时会报错)

End index for loop(inclusive):循环指数结束(包含)→ 遍历查询的变量范围,结束的值

输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),而后就能够在控制器下的取样器使用,格式为${输出变量名}

Add”_”before number:输入变量名称中是否使用“_”进行间隔

PS:这个控制器通常配合配置元件→ 正则表达式提取器来一块儿使用,可对页面上的某些元素进行重复处理。

 

三、包含控制器(Include Controller)

做用:用于引用外部的Jmx文件;从而控制多个测试计划组合

include Test Plan:包含测试计划的文件名,能够点击浏览,从文件夹保存的JMX文件夹目录下选择对应的JMX文件

使用方法:建立一个测试计划,下面可添加取样器/控制器等,而后保存测试计划,为了方便起见, 线程组也能够添加外部JMX文件中用于调试;

若是测试使用Cookie或用户定义的变量,这些应放置在顶层(包括文件),不然没法正常工做;此元素不支持变量/函数在文件名字段中;可是,若是属于包含控制器定义的内容,则使用前缀路径名。

当使用包含控制器中包含相同的JMX文件,则要确保文件名不一样,以免没法读取;若是文件不能被发现,那么控制器会尝试打开文件名相对于JMX启动目录。

 

四、生命周期/运行周期控制器(Runtime Controller)

做用:用于控制该控制器下的取样器/控制器的运行时间

Runtime(seconds):运行时间,单位为:秒

 

五、转换控制器(Switch Controller)

做用:经过给该控制器中的value赋值,来指定运行哪一个取样器(也能够理解为开关控制器)

Switch value:控制器具体赋值的value值字段

有两种赋值方式:

①.第一种是数值,Switch控制器下的子节点从0开始计数,经过指定子节点所在的数值来肯定执行哪一个元素。

②.第二种是直接指定子元素的名称,好比采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。

当Value为空时,默认执行第1个子节点元素。

 

六、当/判断控制器(While Controller)

 做用:运行其子节点下的取样器/控制器,直到条件为“假”

Condition(function or variable):条件(函数或变量):里面可填入判断依据的条件,参照

使用方法:可能的条件值有:

①.空白:最后一个示例循环失败时退出循环

②.最后一个值:最后一个示例循环失败时退出循环。 若是以前的最后一个示例只是循环失败,不进入循环。

③.不然:退出时(或不输入)循环条件等于字符串“ 假 

条件能够是任何变量或函数,最终等于字符串” 假 ”。须要注意的是:条件是评估两次,一次取样前,一次随机取样

 

七、事务控制器(transaction controller)

做用:生成一个额外的采样器来测量其下测试元素的整体时间;值得注意的是,这个时间包含该控制器范围内的全部处理时间,而不只仅是采样器的

Generate parent sample:生成父样本(不一样的模式选择)

include duration of timer and pre-post processors in generated sample:包含时间的计时器和先后处理器生成的示例(不一样的模式选择)

对于Jmeter2.3以上的版本,有两种模式的操做

①.事务采样器是添加到其下采样器后面的

②.事务采样器是做为其下采样器的父采样器

生成的事务采样器的测量的时间包括其下采样器以及其余的一切时间。因为时钟频率问题,这个时间可能略大于单个采样器的时间之和;

时钟开始时间介于控制器记录开始时间与第一个采样器开始之间,时钟结束时间亦然。

事务采样器只有在其子采样器都成功的状况下才显示成功。

在父模式下,事务控制器下的各个采样器只有在结果树里才能看到;同时,子采样器的数据也不会在CSV文件中显示,可是在XML文件中能够看到。

 

八、交替控制器(creatleave controller)

做用: 交替控制,使得该控制器包含的取样器步骤交错执行在每一个循环中

忽略子控制器模块(Ignore sub-contorller blocks):若是勾选此项,交错控制器将sub-controllers像单一请求元素同样,一次只容许一个请求/控制器

使用方法:假使该控制器下有2个取样器A和B,交替执行A和B2个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序

 

九、仅一次控制器(once only controller)

做用:在多线程循环的时候,将使其子节点下的取样器请求只运行一次

 

十、流量控制器(throughput controller)

做用:jmeter自带的翻译这里是错误的,由于它并不能控制吞吐量(吞吐量的概念请自行百度);其实质做用是容许用户控制执行的频率

总共有两种执行模式:百分比执行和总执行

总执行(Total Executions):使控制器中止执行必定数量的测试计划

百分比执行(Percent Executions):使控制器按必定比例执行迭代的测试计划

流量(Throughput):对应上面的执行数量或者比例

每一个用户(Per User):每一个用户

若是勾选此项,将致使控制器计算是否应该执行在每一个用户(每一个线程)的基础上;若是不加以控制,那么将计算全球全部用户

 

十一、IF控制器(If Controller)

做用:容许用户控制该控制器下面的取样器/控制器是否执行该节点下的子节点;

条件(默认JavaScript)(Condition(default javascript):使用JavaScript的函数或变量进行评估判断条件为真或假

条件解释为变量表达式(interpret condition as variable expression):若是勾选该项,那么变量表达式会进行求值,并与“ture”或“false”进行比较,而无需使用JavaScript

对全部子条件执行(evaluate for all children):若是勾选该项,则该controller在没一个子节点执行时执行一次;

默认状况下,该控制器能够对包含在其下面的全部可运行的元素进行执行,但只在入口执行一次

 

十二、录制控制器(Recording Controller)

做用:相似代理服务器的做用,在测试执行期间记录测试样本

清除全部记录的样本(Clear all the recorded samples):点击能够清除全部已经记录的测试样本

通常状况下,在测试执行时候,它没有效果,可是在执行HTTPS测试脚本时,会记录下全部测试样本

 

1三、循环控制器(Loop Controller)

做用:该控制器下的取样器请求能够循环运行

循环次数(Loop Count):在输入框中输入须要循环的次数,控制器下的请求便可循环运行

永远(forever):若是勾选该项,那么控制器下的请求可一直运行

 

1四、模块控制器(Module Controller)

做用:测试控制器子节点下的某一个模块,而不是整个测试计划

 

寻找目标元素(Find target element):寻找测试计划中须要特定测试的元素,模块;也可理解为该控制器能够控制已经封装好的模块元素

△ :一个测试计划由一个控制器和全部的测试元素(取样器等)组成,测试计划能够位于任何线程组或工做台;若是计划位于线程组,则能够禁用其余控制器,防止正在运行的测试计划被影响(除了模块控制器)

     模块控制器的优点在于:当存在多个线程组时,该控制器能够轻松切换,只须要选择对应的取样器,方便快捷,替代了建立不少测试计划的繁琐操做

△ :任何一个模块所用的控制器名字必须惟一,由于其名字被用来找到目标控制器时从新加载;出于这个缘由,最好保证控制器名字不一样,不然执行测试时候可能发生意外

△ :模块控制器与远程测试不该使用或非gui测试与工做台部件,由于工做台测试元素并无测试计划的一部分 jmx 文件。 任何这样的测试就会失败

 

1五、简单控制器(Simple Controller)

 做用:用来组合取样器和其余逻辑控制器

简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操做

 

1六、随机控制器(Random Controller)

做用:相似交替控制器,但该控制器随机选取某一个取样器请求并执行

忽略子控制器模块(Ignore sub-controller blocks):若是勾选此项,交错控制器将sub-controllers像单一请求元素同样,一次只容许一个请求/控制器

 

1七、随机顺序控制器(Random Order Controller)

做用:相似于简单控制器,将执行每一个子节点下的取样器请求一次,可是执行是随机的

 

jmeter(10):参数化

参数化是自动化测试脚本的一种经常使用技巧。简单来讲,参数化的通常用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取值范围和规则;

这样,脚本在运行时就能够根据须要选取不一样的参数值做为输入。这种方式一般被称为数据驱动测试(Data Driven Test),参数的取值范围被称为数据池(Data Pool)。

 

jmeter的test plan中,支持以下4种参数化方式

函数助手:_CSVRead

CSV Data Set Config:CSV数据控件

User Defined Variables:用户定义的变量

User Variables:用户参数

 

首先新建一个测试脚本,能够经过工具(badboy)录制或者本身手动编写

登陆请求的界面以下:

这里咱们对登陆的用户名密码进行参数化,将用户名密码写入txt文档,保存为.dat格式,编码类型选择UTF-8

由于配置元件——CSV Data Set Config对参数化的格式要求比较严格,用户名密码一一对应,之间用半角英文逗号隔开

而后将保存的.dat文件放入计算机的某个盘里,这里我放入路径为:F:\jmeter\csvtest.dat

下面具体介绍参数化经常使用的的两种方法:

 

1、函数助手:_CSVRead

点击jmeter的界面,功能栏选项→ 函数助手对话框→ _CSVRead

CSV file to get values from | *alias:CSV文件取值路径,即这里须要写入以前的须要参数化的参数的文件路径

CSV文件列号| next|*alias:文件起始列号:CSV文件列号是从0开始的,第一列为0,第二列为1,以此类推。。。

函数字符串:即生成的参数化后的参数,能够直接在登录请求中的参数中引用,第一列为用户名,函数字段号为0,第二列为密码,函数字段号为1,以此类推动行修改使用便可

替换参数化后的参数,而后修改线程数,执行脚本,经过监听器里结果树的请求内容,能够看到请求的参数都是参数化后的数据

 

2、配置元件——CSV Data Set Config

点击线程组添加配置元件→ CSV Data Set Config:

说明:

Filename:F:\jmeter\csvtest.dat文件名,保存参数化数据的文件目录,可选择相对或者绝对路径(建议填写相对路径,避免脚本迁移时须要修改路径);

File encoding:UTF-8,F:\jmeter\csvtest.dat文件的编码格式,在保存时保存编码格式为UTF-8便可;

Variable Names(comma-delimited):对对应参数文件每列的变量名,相似excel文件的文件头,起到标示做用,同时也是后续引用的标识符,建议采用有意义的英文标示;

                                (如:有几列参数,在这里面就写几个参数名称,每一个名称中间用分隔符分割,这里的 user,pwd,能够被利用变量名来引用:user,user,{pwd};

Delimitet:参数文件分隔符,用来在“Variable Names”中分隔参数,与参数文件中的分隔符保持一致便可;

Allow quote data:是否容许引用数据,默认false,选项选为“true”的时候对全角字符的处理出现乱码 ;

Recycle on EOF?:是否循环读取参数文件内容;由于CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,若是线程数超过文本的记录行数,那么能够选择从头再次读入;

△ Ture:为true时,当已读取完参数文件内的测试用例数据,还需继续获取用例数据时,此时会循环读取参数文件数据(即:读取文件到结尾时,再重头读取文件);

False:为false时,若已至文件末尾,则再也不继续读取测试数据;一般在“线程组线程数* 线程组循环次数>参数文件行数”时,选用false(即:读取文件到结尾时,中止读取文件);

Stop thread on EOF?:当Recycle on EOF为False时(读取文件到结尾),中止进程,当Recycle on EOF为True时,此项无心义;

若为ture,则在读取到参数文件行末尾时,终止参数文件读取线程;

若为false,此时线程继续读取,但会请求错误,所以时读取的数据为EOF;

Sharing mode:共享模式,即参数文件的做用域,有如下几种方式:

All threads:当前测试计划中的全部线程中的全部的线程都有效,默认;

Current thread group:当前线程组中的线程有效;

Current thread:当前线程有效;

 

完成以后,将刚才生成的参数写入参数对应的值里面:

以上两种常见的参数化的方法,推荐使用CSV控件方法(由于函数助手参数化功能相比其较弱)

 

3、配置元件——User Defined Variables

点击线程组添加配置元件→ User Defined Variables(用户定义的变量):

如上图所示,在该参数组中已经定义了两个参数,经过界面下方的添加、删除按钮能够向参数列表增长和删除参数,Up和Down能够上下移动参数的位置;

PS:User Defined Variables中定义的参数值在test plan执行过程当中不能发生取值的改变,所以通常仅将test plan中不须要随迭代发生改变的参数(只取一次的参数)

    设置在此处;例如:被测应用的host和port值。

 

4、前置处理器——User Variables

点击线程组添加前置处理器——User Variables(用户参数):

如上图所示,在该参数组中已经设置了两个参数,username和password分别有2组不一样的取值,经过页面下方的四个按钮,能够增长删除参数的可能取值。

PS:User Variables中设置的参数能够在test plan执行过程当中发生变化。

 

以上就是jmeter参数化的四种方式,其中:

一、函数助手_CSVRead的参数化功能相比CSV Data Set Config较弱;

二、CSV Data Set Config适用于参数取值范围较大的时候使用,该方法具备更大的灵活性;

三、User Defined Variables通常用于test plan中不须要随请求迭代的参数设置;

四、User Variables适用于参数取值范围很小的时候使用;

 

PS:相比于loadrunner来讲,jmeter参数化有如下不一样:

1.jmeter参数文件第一行没有列名称

2.参数文件的编码,尽可能保存为UTF-8(编码问题在使用CSV Data Set Config参数化时要求的比较严格)

3.Jmeter的参数化没有LoadRunner作的出色,它是依赖于线程设置的(只有CSV Data Set Config参数化方法才有)

 

jmeter(11):JDBC Request之Query Type

工做中遇到这样一个问题:

须要准备10W条测试数据,利用jmeter中的JDBC Request向数据库中批量插入这些数据(只要主键不重复就能够,利用函数助手中的Random将主键的ID末尾五位数随机插入);

响应数据报错:Can not issue data manipulation statements with executeQuery().后来查阅了不少资料,才发现跟JDBC Request中的Query Type类型选择有关;

最后得出的结论是:若是SQL语句是update、insert等更新语句,应该使用statement的execute()方法;若是使用statement的executeQuery()就会出现报错。

下面主要说jmeter的JDBC Request请求中的Query Type

JDBC Request界面以下:

其中Query Type(SQL语句类型)包含十个类型,每一个类型做用都不一样,下面分别介绍。

一、Select statement

这是一个查询语句类型;若是JDBC Request中的Query内容为一条查询语句,则选择这种类型。

PS:多个查询语句(不使用参数的状况下)能够放在一块儿顺序执行,须要设置Query Type为:Callable Statement;

    若是Query Type为:select Statement,则只执行第一条select语句。

 

二、Update statement

这是一个更新语句类型(包含insert和update);若是JDBC Request中的Query内容为一条更新语句,则选择这种类型。

PS:若是该类型下写入多条update语句,依然只执行第一条(缘由同上,具体下面介绍)。

 

三、Callable statement

这是一个可调用语句类型,CallableStatement 为全部的 DBMS 提供了一种以标准形式调用已储存过程的方法。

已储存过程储存在数据库中,对已储存过程的调用是 CallableStatement 对象所含的内容。

这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另外一种形式不带结果参数;结果参数是一种输出 (OUT) 参数,是已储存过程的返回值。

两种形式均可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数,问号将用做参数的占位符。 

在 JDBC 中调用已储存过程的语法以下所示。注意,方括号表示其间的内容是可选项;方括号自己并非语法的组成部份。 

{call 过程名[(?, ?, ...)]},返回结果参数的过程的语法为: {? = call 过程名[(?, ?, ...)]};

不带参数的已储存过程的语法相似:{call 过程名}。

 

四、Prepared select statement

statement用于为一条SQL语句生成执行计划(这也是为何select statement只会执行第一条select语句的缘由),若是只执行一次SQL语句,statement是最好的类型;

Prepared statement用于绑定变量重用执行计划,对于屡次执行的SQL语句,Prepared statement无疑是最好的类型(生成执行计划极为消耗资源,两种实现速度差距可能成百上千倍);

PS:PreparedStatement的第一次执行消耗是很高的. 它的性能体如今后面的重复执行。

 

五、Prepared update statement

Prepared update statement和Prepared select statement的用法是极为类似的,具体能够参照第四种类型。

 

六、Commit

commit的意思是:将未存储的SQL语句结果写入数据库表;而在jmeter的JDBC请求中,一样能够根据具体使用状况,选择这种Query类型。

 

七、Rollback

rollback指的是:撤销指定SQL语句的过程;在jmeter的JDBC请求中,一样能够根据须要使用这种类型。

 

八、AutoCommit(false)

MySQL默认操做模式就是autocommit自动提交模式。表示除非显式地开始一个事务,不然每条SQL语句都被当作一个单独的事务自动执行;

咱们能够经过设置autocommit的值改变是不是自动提交autocommit模式;

而AutoCommit(false)的意思是AutoCommit(假),即将用户操做一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务从新开始一个新的事务。

 

九、AutoCommit(true)

这个选项的做用和上面一项做用相反,即:不管何种状况,都自动提交将结果写入,结束当前事务开始下一个事务。

 

十、编辑(${})

jmeter中的JDBC请求中的SQL语句是没法使用参数的,好比: SELECT * FROM ${table_name} 是无效的。

若是需实现同时多个不一样用户使用不一样的SQL,能够经过把整条SQL语句参数化来实现;(把SQL语句放在csv文件中,而后在JDBC Request的Query 中使用参数代替 ${SQL_Statement})

 

jmeter(12):关联之正则表达式提取器

若是有这样的状况:一个完整的操做流程,须要先完成某个操做,得到某个值或数据信息,而后才能进行下一步的操做(也就是常说的关联/将上一个请求的响应结果做为下一个请求的参数);

在jmeter中,能够利用正则表达式提取器来帮助咱们完成这一动做。

 

首先:在默认的测试计划中添加一个线程组,而后添加取样器,这里我以JDBC请求作例子:

 

而后:右键添加后置处理器→正则表达式提取器,正则表达式提取器界面以下:

说明:

后置处理器:在请求结束或者返回响应结果时发挥做用

正则表达式提取器:容许用户从服务器的响应中经过使用perl的正则表达式提取值。该元素会做用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的变量名中。

APPly to:做用范围(返回内容的断言范围)

         Main sample and sub-samples:做用于父节点的取样器及对应子节点的取样器

         Main sample only:仅做用于父节点的取样器

         Sub-samples only:仅做用于子节点的取样器

         JMeter Variable:做用于jmeter变量(输入框内可输入jmeter的变量名称)

要检查的响应字段:须要检查的响应报文的范围

         主体:响应报文的主体

         Body(unescaped):主体,响应的主体内容且替换了全部的html转义符,注意html转义符处理时不考虑上下文,所以可能有不正确的转换,不太建议使用 

         Body as a Document:从不一样类型的文件中提取文本,注意这个选项比较影响性能 

         Response Headers:响应信息头

         Request Headers:请求信息头

         URL:统一资源定位符,即Internet上用来描述信息资源的字符串

         Response Code:响应状态码,好比200、404等

         Response Message:响应信息

PS:jmeter的中文翻译有时候不太准确,建议尽可能选择语言格式为英文(为了方便说明,这里选择中文语言,固然,本身明白最好,不用纠结这个)

引用名称(Reference Name):Jmeter变量的名称,存储提取的结果;即下个请求须要引用的值、字段、变量名(例子中我提取的是SOCIAL_NO)

引用方法:引用方法:${引用名称}

正则表达式(Regular Expression):使用正则表达式解析响应结果,“()”表示提取字符串中的部分值,请不要使用“||”,除非你自己须要匹配这个字符。

下面是经常使用的正则表达式操做符:

模板(Template):从匹配的结果中建立一个字符串,这是经过正则表达式匹配出来的一组值,意为使用提取到的第几个值(可能有多个值匹配,所以使用模板);从1开始匹配,以此类推.

                参数能够在取值模板组合使用,例如:“11-22”做为模板获得的值是使用“-”链接的第一个待匹配内容与第二个待匹配内容组合而成的字符串。

匹配数字(Match No):正则表达式匹配数据的结果能够看作一个数组,表示如何取值:0表明随机取值,正数n则表示取第n个值(好比1表明取第一个值),负数则表示提取全部符合条件的值。

缺省值:匹配失败时候的默认值;一般用于后续的逻辑判断,通常一般为特定含义的英文大写组合,好比:ERROR

 

最后,根据上面的说明,完成配置,而后能够先添加一个监视器(查看结果树),检查是否取到了对应的值;

提取到的参数,调用时用${SOCIAL_NO_1},${SOCIAL_NO_2}...,若是想要获得匹配出的参数的个数,用${SOCIAL_NO_matchNr},若是想随机选取一个,只须要将

匹配数字设为0,使用${SOCIAL_NO}调用便可。

 

jmeter(13):常见问题及解决方法

jmeter做为一个开源的纯Java性能测试工具,工做中极大的方便了咱们进行接口、性能测试,但使用过程当中也遇到了不少的问题,下面就记录一下本身遇到的问题,后续会不断更新。。。

 

一、获取日志

在使用jmeter过程当中,若是想得到更详细的日志,能够修改jmeter\bin\jmeter.properties文件中的一个属性:全部log_level.jmeter的后缀由info改成debug,以下:

 

 

二、jmeter安装

安装使用jmeter时候不须要设置classpath以及class变量,只须要默认安装好JDK便可(一般状况下),而后解压jmeter安装包,启动jmeter\bin\jmeter.bat程序便可;

由于jmeter是以Java_jar的方式启动,并且会忽略该变量,这对全部Java程序都适用。

 

三、请求/响应数据显示乱码

有时候在发送请求/查看响应数据时,服务端接收到的请求中包含乱码,致使没法解析报错,解决方法有以下几种:

请求数据显示乱码,能够在请求中以下设置:

返回数据包含乱码时,能够修改jmeter\bin\jmeter.properties文件中的一个属性:将encoding=后面的编码格式改成utf-8,以下:

 

四、内存OOM(OutOfMemoryError:内存溢出)

在执行压力测试时候,有时候会遇到OutOfMemoryError这样的异常;JMeter是一个纯Java开发的工具,内存是由java虚拟机JVM管理;若是出现了内存溢出的问题,

能够经过调整JVM内存相关的参数进行优化。

具体过程以下:

①找到jmeter.bat文件,也就是咱们启动jmeter的脚本:

②打开jmeter.bat文件,对一下这些配置项进行编辑:

③参数调整:

调整堆内存的大小:

将默认的set HEAP=-Xms512m -Xmx512m,调整为set HEAP=-Xms1024m -Xmx1024m;

调整堆内存中新生带的大小:

将默认的set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m,调整为set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m;

调整堆内存中永久带的大小:

将默认的set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m,调整为set PERM=-XX:PermSize=128m -XX:MaxPermSize=256m;

调整后重启jmeter,问题通常能够获得解决(参数的调整不能一律而论,具体根据测试机的硬件配置来决定)。

 

五、Listener使用技巧

listener做为一个收集sampler的结果数据和呈现结果的文件,其自己会在每次sampler运行完成后执行一次,即一个test plan中的listener数量越多,运行时listener自己带来的资源消耗

就越大(尤为是view results in table以及view results tree等)。

所以实际执行test plan时,应首先禁用不须要的listener,再开始执行;更好的方式是每次运行时将生成的结果写入结果文件中,方便之后用不一样的listener展示保存的结果数据。

固然,在并发量较大的状况下,通常的测试机限于配置等因素,没法支撑较大的并发数,能够用如下的方法来进行测试,方法以下:

去掉listener,为sampler添加断言(通常是响应断言),根据断言结果来判断请求是否成功,测试报告以plugins插件中的报告形式或文本形式写入文件中来提高测试效率。

 

六、调试test plan

不少测试人员在初始进行性能测试时,脚本都是录制获得的,但录制的脚本通常都包含不少对本次测试来讲无用的sampler,以及录制的sampler须要从新修改参数等内容,才能使用。

因此调试test plan就颇有必要,经常使用的有如下2种方法:

①使用listener观察sampler的请求和相应

录制的脚本,通常都须要剔除无用的sampler,而后修改参数,进行调试,才能用于测试执行,通常用于调试的listener是结果树,能够在测试计划中将线程组的数量修改成1,而后执行。

listener显示的每个sampler结果为绿色(表示经过),但jmeter仅根据http返回码来判断sampler执行是否成功,这样没法判断sampler语义上的错误;所以,通常都是在sampler

中插入对应的检查点(Assertion:断言),根据返回的内容,来判断sampler是否真正成功。

②使用http Mirror server观察sampler发出的请求

在调试和修改sampler时,常常会为其增长一些额外的设置,例如额外的信息头、cookie管理器等,但设置完成后直接运行脚本进行测试,并不能保证请求真的和咱们预期的一致。

若是不想将请求发送给被测应用,能够使用http mirror server组件(http镜像服务器)。

http mirror server能够启动一个镜像服务器,其能够把全部接收到的请求原封不动的返回,这样就能够查看发出的请求的具体内容。

使用方法以下:

点击工做台,右键添加→http mirror server,若有必要修改服务器端口(通常修改成localhost:8080,方便调试),而后启动镜像服务器;

其次修改须要调试的sampler,将其请求发送到mirror server启动的端口,运行测试计划,便可以从listener中查看响应数据。

PS:其实http mirror server更大的做用是检查浏览器是否发送了特殊的http头,启动mirror server,使用浏览器访问该server,则能够在返回页面看到浏览器发送请求的完整内容。

 

jmeter(14):Http请求之content-type

第一部分:目前工做中涉及到的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]

上传文件用这种格式

发送的请求示例:

 

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

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

参数能够在Parameters或Body Data里输入,格式不一样,以下图所示。

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

Parameters:

 

Body Data:

 

2  content-type:application/json

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

 

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

 

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

 

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

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

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

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

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

 

jmeter(15):函数助手

1、使用jmeter函数助手

启动jmeter后,能够在JMeter的选项菜单中找到函数助手对话框(快捷键:Ctrl+Shift+F1),以下图所示:

打开函数助手,能够从下拉列表中选择一个函数,并为其参数设定值,不一样函数要求的参数也不一样;表格的左边一列是函数参数的简要描述,右边一列是供用户填充参数的值。

 

2、经常使用JMeter函数

一、__regexFunction

正则表达式函数能够使用正则表达式(用户提供的)来解析前面的服务器响应(或者是某个变量值),函数会返回一个有模板的字符串,其中携带有可变的值。

__regexFunction还能够被用来保存值,以便供后续使用。

在函数的第6个参数中,能够指定一个引用名;在函数执行之后,能够使用用户定义值的语法来获取一样的值。例如,若是输入"refName"做为第6个参数,那么能够使用:

${refName}来引用第2个参数(Template for the replacement string)的计算结果,这依赖于函数的解析结果;

${refName_g0}来引用函数解析后发现的全部匹配结果;

${refName_g1}来引用函数解析后发现的第一个匹配组合;

${refName_g#}来引用函数解析后发现的第n个匹配组合;

${refName_matchNr}来引用函数总共发现的匹配组合数目;

参数以下表所示:

函数参数

描述

是否必需

第1个参数

第1个参数是用于解析服务器响应数据的正则表达式,它会找到全部匹配项;若是但愿将表达式中的

某部分应用在模板字符串中,必定记得为其加上圆括号。例如,<a href="(.*)">,这样就会将链

接的值存放到第一个匹配组合中(这里只有一个匹配组合)。又如,<input type="hidden"

name="(.*)"value="(.*)">,在这个例子中,连接的name做为第一个匹配组合,连接的value会

做为第二个匹配组合,这些组合能够用在测试人员的模板字符串中。

第2个参数

这是一个模板字符串,函数会动态填写字符串的部份内容。要在字符串中引用正则表达式捕获的匹配组

合,请使用语法:[groupnumber][groupnumber]。例如11或者 22,模板能够是任何字符串。

第3个参数

第3个参数告诉JMeter使用第几回匹配;测试人员的正则表达式可能会找到多个匹配项,对此,

有4种选择:

n     整数,直接告诉JMeter使用第几个匹配项;

n     “1”对应第一个匹配,“2”对应第二个匹配,以此类推;

n     RAND,告诉JMeter随机选择一个匹配项;

n     ALL,告诉JMeter使用全部匹配项,为每一个匹配项建立一个模板字符串,并将它们链接在一块儿

n     浮点值0到1之间,根据公式(找到的总匹配数目*指定浮点值)计算使用第几个匹配项,计算值

      向最近的整数取整

否,默认值为1

第4个参数

若是在上一个参数中选择了“ALL”,那么这第4个参数会被插入到重复的模板值之间

第5个参数

若是没有找到匹配项返回的默认值

第6个参数

重用函数解析值的引用名,参见上面内容

第7个参数

输入变量名称。若是指定了这一参数,那么该变量的值就会做为函数的输入,而再也不使用前面的采样结

果做为搜索对象

 

二、__counter

每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既能够被配置成针对每一个虚拟用户是独立的,也能够被配置成全部虚拟用户公用的。若是每一个虚拟用户的计数器

是独立增加的,那么一般被用于记录测试计划运行了多少遍。全局计数器一般被用于记录发送了多少次请求,计数器使用一个整数值来记录,容许的最大值为2,147,483,647。

目前计数器函数实例是独立实现的(JMeter 2.1.1及其之前版本,使用一个固定的线程变量来跟踪每一个用户的计数器,所以多个计数器函数会操做同一个值)。

全局计数器(FALSE)每一个计数器实例都是独立维护的。

参数以下表所示:                                      

函数参数

描述

是否必需

第1个参数

True,若是但愿每一个虚拟用户的计数器保持独立,与其余用户的计数器相区别;

false,全局计数器;

第2个参数

重用计数器函数建立值的引用名。能够这样引用计数器的值:${refName}。这样一来,就能够建立一个

计数器后,在多个地方引用它的值(JMeter 2.1.1及其之前版本,这个参数是必需的)

 

三、__threadNum

函数__threadNum只是简单地返回当前线程的编号。线程编号不依赖于线程组,这就意味着从函数的角度看来,某个线程组的线程#1和另外一个线程组的线程#1是没有区别的。

另外,该函数没有参数。这一函数不能用在任何配置元件中(如用户定义的变量),缘由在于配置元件是由一个独立线程运行的。另外在测试计划中使用也是没有意义的。

 

4)__intSum

函数__intSum能够被用来计算两个或者更多整数值的合。

参数以下表所示:

函数参数

描述

是否必需

第1个参数

第1个整数值

第2个参数

第2个整数值

n个参数

n个整数值

最后一个参数

重用函数计算值的引用名。若是用户指定了这一参数,那么引用名中必须包含一个非数字字母,不然它会被当成另

一个整数值,而被函数用于计算

JMeter 2.3.1及其之前版本,要求必须有引用名参数。后续JMeter版本中,引用名是可选的参数,可是引用名不能是整数值。

 

五、__longSum

函数__ longSum能够被用来计算两个或者更多长整型值的合。

参数以下表所示:

函数参数

描述

是否必需

第1个参数

第1个长整型值

第2个参数

第2个长整型值

n个参数

n个长整型值

最后一个参数

重用函数计算值的引用名。若是用户指定了这一参数,那么引用名中必须包含一个非数字字母,不然它会被当成

另外一个长整型值,而被函数用于计算

 

六、__StringFromFile

__StringFromFile能够被用来从文本文件中读取字符串,这对须要大量可变数据的测试颇有用。例如,当测试一个银行系统时,测试人员可能须要100条甚至1000条帐户信息。

使用配置元件CSV Data Set Config ,也能达到相同的目的,并且方法更简单,可是该配置元件目前不支持多输入文件。

每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处从新读取,直到最大循环次数。若是在一个测试脚本中对该函数有屡次引用,那么每一次引用

都会独立打开文件,即便文件名是相同的(若是函数读取的值,在脚本其余地方也有使用,那么就须要为每一次函数调用指定不一样的变量名)。

若是在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。

参数以下表所示:

函数参数

描述

是否必需

文件名

文件名(能够使用相对于JMeter启动目录的相对路径)。若是要在文件名中使用可选的序列号,那么文件名

必须适合转成十进制格式。参考下面的例子

变量名

一个引用名(refName)的目的是复用这一函数建立的值。能够使用语法${refName}来引用函数建立的

值。默认值为“StringFromFile_”

初始序列号

初始序列号(若是省略这一参数,终止序列号会做为一个循环计数器)

终止序列号

终止序列号(若是省略这一参数,序列号会一直增长下去,不会受到限制)

当打开或者从新打开文件时,文件名参数将会被解析;每次执行函数时,引用名参数(若是支持)将会被解析。

使用序列号:当使用可选的序列号时,文件名须要使用格式字符串Java.text.DecimalFormat;当前的序列号会做为惟一的参数,若是不指明可选的初始序列号,

就使用文件名做为起始值。一些有用的格式序列以下:

#:插入数字,不从零开始,不包含空格。

000:插入数字,包含3个数字组合,不从零开始。

例如:

①pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat   

②pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat   

③pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999  

若是不但愿某个格式字符被翻译,测试人员须要为它加上单引号;注意"."是格式字符,必须被单引号所包含。

若是省略了初始序列号,而终止序列号参数将会做为循环计数器,文件将会被使用指定的次数。例如:

${_StringFromFile(PIN#'.'DAT,,1,2)}:读取 PIN1.DAT, PIN2.DAT。

${_StringFromFile(PIN.DAT,,,2)}:读取 PIN.DAT 两次。

 

七、__machineName

函数__machineName返回本机的主机名。

参数以下表所示:

函数参数

描述

是否必需

变量名

重用函数计算值的引用名

 

八、__javaScript

函数__javaScript能够用来执行JavaScript代码片断(非Java),并返回结果值。JMeter的_javaScript函数会调用标准的JavaScript解释器;

JavaScript会做为脚本语言使用,所以测试人员能够作相应的计算;在脚本中能够访问以下一些变量:

Log:该函数的日志记录器;

Ctx:JmeterContext对象;

Vars:JmeterVariables对象;

threadName:字符串包含当前线程名称 (在2.3.2 版本中它被误写为"theadName");

sampler:当前采样器对象(若是存在);

sampleResult:前面的采样结果对象(若是存在);

props:JMeter属性对象;

Rhinoscript容许经过它的包对象来访问静态方法;例如,用户能够使用以下方法访问JMeterContextService静态方法:

Packages.org.apache.jmeter.threads.JMeterContextService.getTotalThreads()

JMeter不是一款浏览器,它不会执行从页面下载的JavaScript;

参数以下表所示:

函数参数

描述

是否必需

JavaScript代码片断

待执行的JavaScript代码片断;例如:

n   new Date():返回当前日期和时间

n   Math.floor(Math.random()*(${maxRandom}+1)):在0和变量maxRandom之间的随机数

n   ${minRandom}+Math.floor(Math.random()*(maxRandommaxRandom−{minRandom}+1)):

n   在变量 minRandom和maxRandom之间的随机数

n   "${VAR}"=="abcd"

变量名

重用函数计算值的引用名

请记得为文本字符串添加必要的引号。另外,若是表达式中有逗号,请确保对其转义。例如,{__javaScript('{__javaScript('{sp}'.slice(7\,99999))},对7以后的逗号进行了转义。

 

九、__Random

函数__Random会返回指定最大值和最小值之间的随机数。

参数以下表所示:

函数参数

描述

是否必需

最小值

最小数值

最大值

最大数值

变量名

重用函数计算值的引用名

 

十、__CSVRead

函数__CSVRead会从CSV文件读取一个字符串(请注意与StringFromFile 的区别)。

JMeter 1.9.1之前的版本仅支持从单个文件中读取,JMeter 1.9.1及其之后版本支持从多个文件中读取。在大多数状况下,新配置元件CSV Data Set更好用一些。

当对某文件进行第一次读取时,文件将被打开并读取到一个内部数组中;若是在读取过程当中找到了空行,函数就认为到达文件末尾了,即容许拖尾注释(JMeter 1.9.1版本引入);

后续全部对同一个文件名的引用,都使用相同的内部数组。另外,文件名大小写对函数调用很重要,哪怕操做系统不区分大小写,CSVRead(abc.txt,0)和CSVRead(aBc.txt,0)

会引用不一样的内部数组;使用*ALIAS特性能够屡次打开同一个文件,另外还能缩减文件名称。

每个线程都有独立的内部指针指向文件数组中的当前行;当某个线程第一次引用文件时,函数会为线程在数组中分配下一个空闲行。如此一来,任何一个线程访问的文件行,

都与其余线程不一样(除非线程数大于数组包含的行数)。

默认下,函数会在遇到每个逗号处断行;若是但愿在输入列中使用逗号,那么须要换一个分隔符(设置属性csvread.delimiter实现),且该符号没有在CSV文件任何列中出现。

参数以下表所示:

函数参数

描述

是否必需

文件名

设置从哪一个文件读取(或者*ALIAS)

列数

从文件的哪一列读取。0=第一列, 1=第二列,依此类推。“next”为走到文件的下一行。*ALIAS为打开

一个文件,并给它分配一个别名

例如,能够用以下参数来设置某些变量:

①COL1a ${__CSVRead(random.txt,0)}   

②COL2a {__CSVRead(random.txt,1)}{__CSVRead(random.txt,1)}{__CSVRead(random.txt,next)}  

③COL1b ${__CSVRead(random.txt,0)}   

④COL2b {__CSVRead(random.txt,1)}{__CSVRead(random.txt,1)}{__CSVRead(random.txt,next)}   

上面例子会从一行中读取两列,接着从下一行中读取两列。若是全部变量都在同一个前置处理器中(用户参数上定义),那么行都是顺序读取的。不然,不一样线程可能会读取不一样的行。

这一函数并不适合于读取很大的文件,由于整个文件都会被存储到内存之中。对于较大的文件,请使用配置元件CSV Data Set或者StringFromFile 。

 

十一、__property

函数__property会返回一个JMeter属性的值。若是函数找不到属性值,而又没有提供默认值,则它会返回属性的名称。

例如:

${__property(user.dir)}:返回属性user.dir的值;

${__property(user.dir,UDIR)}:返回属性user.dir的值,并保存在变量UDIR中;

${__property(abcd,ABCD,atod)}:返回属性abcd的值 (若是属性没有定义,返回"atod"),并保存在变量ABCD 中;

${__property(abcd,,atod)}:返回属性abcd 的值(若是属性没有定义,返回"atod"),可是并不保存函数的返回值;

参数以下表所示:

 

函数参数

描述

是否必需

属性名

获取属性值、所需的属性名

变量名

重用函数计算值的引用名

默认值

属性未定义时的默认值

 

十二、_P

函数_P是一个简化版的属性函数,目的是使用在命令行中定义的属性。不一样于函数_property,本函数没有提供选项用于设置保存属性值的变量。

另外,若是没有设置默认值,默认值自动设为1。之因此选择1,缘由在于它对于不少常见测试变量都是一个合理值,例如,循环次数、线程数、启动线程耗时间等。

例如:定义属性值:

jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu

获取值以下:

${__P(group1.threads)}:返回属性group1.threads的值;

${__P(group1.loops)}:返回属性group1.loops 的值;

${__P(hostname,www.dummy.org)}:返回属性hostname的值,若是没有定义该属性则返回值www.dummy.org

在上面的例子中,第一个函数调用返回7,第二个函数调用返回1,而最后一个函数调用返回www.dummy.org(除非这些属性在其余地方有定义);

参数以下表所示:

函数参数

描述

是否必需

属性名

获取属性值、所需的属性名

默认值

属性未定义时的默认值。若是省略此参数,默认值自动设为1

 

1三、__log

函数__log会记录一条日志,并返回函数的输入字符串。

参数以下表所示:

函数参数

描述

是否必需

待记录字符串

一个字符串

日志级别

OUT、ERR、DEBUG、INFO(默认)、WARN或者ERROR

可抛弃的文本

若是非空,会建立一个可抛弃的文本传递给记录器

注释

若是存在,注释会在字符串中展现,用于标识日志记录了什么

OUT 和ERR的日志级别,将会分别致使输出记录到System.out和System.err中。在这种状况下,输出老是会被打印(它不依赖于当前的日志设置)。

例如:

${__log(Message)}:写入日志文件,形如"...thread Name : Message";

${__log(Message,OUT)}:写到控制台窗口;

{__log({__log({VAR},,,VAR=)}:写入日志文件,形如"...thread Name VAR=value";

 

1四、__logn

函数__logn会记录一条日志,并返回空字符串。

参数以下表所示:

函数参数

描述

是否必需

待记录字符串

一个字符串

日志级别

OUT,ERR,DEBUG, INFO(默认),WARN 或者ERROR

可抛弃的文本

若是非空,会建立一个可抛弃的文本传递给记录器

OUT和ERR的日志级别,将会分别致使输出记录到System.out和System.err中。在这种状况下,输出老是会被打印(它不依赖于当前的日志设置)。

例如:{__logn(VAR1={__logn(VAR1={VAR1},OUT)}:将变量值写到控制台窗口中。

 

1五、__BeanShell

函数__BeanShell会执行传递给它的脚本,并返回结果。关于BeanShell的详细资料,请参考BeanShell的Web站点:http://www.beanshell.org/ 。

须要注意,测试脚本中每个独立出现的函数调用,都会使用不一样的解释器,可是后续对函数调用的援引会使用相同的解释器;这就意味着变量会持续存在,并跨越函数调用。

单个函数实例能够从多个线程调用。另外,该函数的execute()方法是同步的。若是定义了属性"beanshell.function.init",那么它会做为一个源文件传递给解释器。

这样就能够定义一些通用方法和变量。在bin目录中有一个初始化文件的例子:BeanShellFunction.bshrc。

以下变量在脚本执行前就已经设置:

log:函数BeanShell(*)的记录器;

ctx:目前的JMeter Context变量;

vars:目前的JMeter变量;

props:JMeter属性对象;

threadName:线程名(字符串);

sampler:当前采样器(若是存在);

sampleResult:当前采样器(若是存在);

"*"意味着该变量在JMeter使用初始化文件以前就已经设置了。其余变量在不一样调用之间可能会发生变化;

参数以下表所示:

函数参数

描述

是否必需

BeanShell脚本

一个BeanShell脚本(不是文件名)

变量名

重用函数计算值的引用名

例如:

${__BeanShell(123*456)}:回56088;

${__BeanShell(source("function.bsh"))}:行在function.bsh中的脚本;

请记得为文本字符串及表明文本字符串的JMeter变量添加必要的引号;

 

1六、__plit

函数__split会经过分隔符来拆分传递给它的字符串,并返回原始的字符串。若是分隔符紧挨在一块儿,那么函数就会以变量值的形式返回"?"。

拆分出来的字符串,以变量${VAR_1}、{VAR_2}…以此类推的形式加以返回。JMeter 2.1.2及其之后版本,拖尾的分隔符会被认为缺乏一个变量,会返回"?"。

另外,为了更好地配合ForEach控制器,如今__split会删除第一个不用的变量(由前一次分隔符所设置)。

在测试计划中定义变量VAR="a||c|":{__split({__split({VAR},VAR),|} ,该函数调用会返回VAR变量的值,例如"a||c|",并设定VAR_n=4(3 ,JMeter 2.1.1及之前版本)、

VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?(null,JMeter 2.1.1及其之前版本)、VAR_5=null(JMeter 2.1.2及其之后版本)变量的值。

参数以下表所示:

函数参数

描述

是否必需

待拆分字符串

一个待拆分字符串,例如“a|b|c”

变量名

重用函数计算值的引用名

分隔符

分隔符,例如“|”。若是省略了此参数,函数会使用逗号作分隔符。须要注意的是,假如

要画蛇添足,明确指定使用逗号,须要对逗号转义,如“\,”

 

1七、__XPath

函数__XPath读取XML文件,并在文件中寻找与指定XPath相匹配的地方。每调用函数一次,就会返回下一个匹配项。到达文件末尾后,会从头开始。

若是没有匹配的节点,那么函数会返回空字符串,另外,还会向JMeter日志文件写一条警告信息;整个节点列表都会被保存在内存之中。

例如:

${__XPath(/path/to/build.xml, //target/@name)} 

这会找到build.xml文件中的全部目标节点,并返回下一个name属性的内容。

参数以下表所示:

函数参数

描述

是否必需

XML文件名

一个待解析的XML文件名

XPath

一个XPath表达式,用于在XML文件中寻找目标节点

 

1八、__setProperty

函数__setProperty用于设置JMeter属性的值。函数的默认返回值是空字符串,所以该函数能够被用在任何地方,只要对函数自己调用是正确的。

经过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。属性对于JMeter是全局的,所以能够被用来在线程和线程组之间通讯。

参数以下表所示:

函数参数

描述

是否必需

属性名

待设置属性名

属性值

属性的值

True/False

是否返回属性原始值

 

1九、__time

函数__time能够经过多种格式返回当前时间。

参数以下表所示:

函数参数

描述

是否必需

格式

设置时间所采用的格式

变量名

待设置变量名

若是省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其余状况下,当前时间会被转成简单日期格式。包含以下形式:

YMD = yyyyMMdd;

HMS = HHmmss;

YMDHMS = yyyyMMdd-HHmmss;

USER1 = JMeter属性time.USER1;

USER2 = JMeter属性time.USER2;

用户能够经过修改JMeter属性来改变默认格式,例如:time.YMD=yyMMdd。

 

20、_jexl

函数_jexl能够用于执行通用JEXL表达式,并返回执行结果

参数以下表所示:

函数参数

描述

是否必需

表达式

待执行的表达式。例如,6*(5+2)

变量名

待设置变量名

以下变量能够经过脚本进行访问:

log:函数记录器;

ctx:JMeterContext对象;

vars:JMeterVariables对象;

props:JMeter属性对象;

threadName:字符串包含当前线程名称 (在2.3.2 版本中它被误写为"theadName");

sampler:当前的采样器对象(若是存在);

sampleResult:前面的采样结果对象(若是存在);

OUT - System.out,例如 OUT.println("message");

JEXL能够基于它们来建立类,或者调用方法,例如:

①Systemclass=log.class.forName("java.lang.System");  

②now=Systemclass.currentTimeMillis(); 

须要注意的是,Web站点上的JEXL文档错误地建议使用"div"作整数除法。事实上"div"和"/"都执行普通除法。

JMeter 2.3.2之后的版本容许在表达式中包含多个声明。JMeter 2.3.2及其之前的版本只处理第一个声明(若是存在多个声明,就会记录一条警告日志)。

 

2一、__V

函数__V能够用于执行变量名表达式,并返回执行结果。它能够被用于执行嵌套函数引用(目前JMeter不支持)。

例如,若是存在变量A一、A2和N=1,则:

${A1}:能正常工做;

{A{A{N}}:没法正常工做(嵌套变量引用);

{__V(A${N})}:能够正常工做。A{__V(A${N})}:能够正常工做。A{N}变为A1,函数 __V返回变量值A1;

参数以下表所示:

函数参数

描述

是否必需

变量名表达式

待执行变量名表达式

 

2二、__evalVar

函数__evalVar能够用来执行保存在变量中的表达式,并返回执行结果。

如此一来,用户能够从文件中读取一行字符串,并处理字符串中引用的变量。例如,假设变量"query"中包含有"selectcolumnfromcolumnfrom{table}",

而"column"和"table"中分别包含有"name"和"customers",那么${__evalVar(query)}将会执行"select name from customers"。

参数以下表所示:

函数参数

描述

是否必需

变量名

待执行变量名

 

2三、__eval

函数__eval能够用来执行一个字符串表达式,并返回执行结果。如此一来,用户就能够对字符串(存储在变量中)中的变量和函数引用作出修改。

例如,给定变量name=Smith、column=age、table=birthdays、SQL=select columnfromcolumnfrom{table} where name='${name}',

那么经过{__eval({__eval({SQL})},就能执行"select age from birthdays where name='Smith'"。这样一来,就能够与CSV数据集相互配合;

例如:将SQL语句和值都定义在数据文件中。

参数以下表所示:

函数参数

描述

是否必需

变量名

待执行变量

 

2四、__char

函数__char会将一串数字翻译成Unicode字符,另外还请参考下面__unescape()函数。

参数以下表所示:

函数参数

描述

是否必需

Unicode字符编码(十进制数或者十六进制数)

待转换的Unicode字符编码,能够是十进制数或者十六进制数

Unicode字符编码(十进制数或者十六进制数) 待转换的Unicode字符编码,能够是十进制数或者十六进制数;

例如:

①${__char(0xC,0xA)} = CRLF  

②${__char(165)} = ï¿½ (yen)  

 

2五、__unescape

函数__unescape用于反转义Java-escaped字符串,另外还请参考上面的__char函数。

参数以下表所示:

函数参数

描述

是否必需

待反转义字符串

待反转义字符串

例如:

①${__unescape(\r\n)} = CRLF  

②${__unescape(1\t2)} = 1[tab]2

 

2六、__unescapeHtml

函数__unescapeHtml用于反转义一个包含HTML实体的字符串,将其变为包含实际Unicode字符的字符串。支持HTML 4.0实体。

例如,字符串"&lt;Fran&ccedil;ais&gt;"变为"<Fran?ais>"。

若是函数不认识某个实体,就会将实体保留下来,并一字不差地插入结果字符串中。例如,">&zzzz;x"会变为">&zzzz;x"。

参数以下表所示:

函数参数

描述

是否必需

待反转义字符串

待反转义字符串

 

2七、__escapeHtml

函数__escapeHtml用于转义字符串中的字符(使用HTML实体)。支持HTML 4.0实体。

例如,"bread" & "butter"变为&quot;bread&quot; &amp; &quot;butter&quot;。

参数以下表所示:

函数参数

描述

是否必需

待转义字符串

待转义字符串

 

2八、__FileToString

函数__FileToString能够被用来读取整个文件。每次对该函数的调用,都会读取整个文件。

若是在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。

参数以下表所示:

函数参数

描述

是否必需

文件名

包含路径的文件名(路径能够是相对于JMeter启动目录的相对路径)

文件编码方式(若是不采

用平台默认的编码方式)

读取文件须要用到的文件编码方式。若是没有指明就使用平台默认的编码方式

变量名

引用名(refName)用于重用函数建立的值

 

3、变量

一、预约义变量

大多数变量都是经过函数调用和测试元件(如用户定义变量)来设置的;在这种状况下用户拥有对变量名的完整控制权。可是有些变量是JMeter内置的。例如:

Cookiename:包含Cookie值。

JMeterThread.last_sample_ok:最近的采样是否能够(true/false)。

 

二、预约义变量属性

JMeter属性集是在JMeter启动时经过系统属性初始化的;其余补充JMeter属性来自于jmeter.properties、user.properties或者命令行。

JMeter还另外定义了一些内置属性。下面是具体列表。从方便的角度考虑,属性START的值会被复制到同名变量中去。

START.MS:以毫秒为单位的JMeter启动时间;

START.YMD:JMeter启动日期格式yyyyMMdd;

START.HMS:JMeter启动时间格式HHmmss;

TESTSTART.MS:以毫秒为单位的测试启动时间;

请注意:START变量/属性表征的是JMeter启动时间,而非测试的启动时间。它们主要用于文件名之中。

 

jmeter(16):配置元件之计数器

先说说利用jmeter生成数据的几种方法:

一、CSV Data Set Config

这个元件被用来在参数化生成数据时使用,简单高效,容易生成有序数;只须要新建excel,而后经过拖拽、复制黏贴等方式产生不一样的数据,而后读取调用便可。

但它也有不足之处,以下:

①若是数据库中某些表的某些字段不容许重复(好比订单号),那么在完成一轮测试后,再次测试须要从新手动构造新的不重复的数据;

②excel只有数字格式才能够经过拖拽生成增加数据;

③数据量过大时,容易被excel修改成科学计数法;

 

二、${_Random}

${_Random}是jmeter函数助手里面自带的一个函数,做用是返回指定的最大值和最小值之间的一个随机数。

缺点:数值可能会重复出现; 

若是须要引用的数据量较大,且要求不能重复或者须要自增,那么能够使用计数器来实现。

计数器(counter):容许用户建立一个在线程组以内均可以被引用的计数器。

计数器容许用户配置一个起点,一个最大值,增量数,循环到最大值,而后从新开始,继续这样,直到测试结束。计数器使用long存储的值,所取的范围是2^63——2^63-1.

一、启动jmeter,添加线程组,右键添加配置元件——计数器

 

计数器界面以下:

启动(start):给定计数器的起始值、初始值,第一次迭代时,会把该值赋给计数器 

PS:英文版是Start,Jmeter的中文语言将Start翻译成了“启动”,有些歧义

递增(Increment):每次迭代后,给计数器增长的值

最大值(Maximum):计数器的最大值,若是超过最大值,从新设置为初始值(Start),默认的最大值为Long.MAX_VALUE,2^63-1(若是持续压测,建议最好不要设置最大值)

Number format:可选格式,好比000,格式化为001,002;默认格式为Long.toString(),可是默认格式下,仍是能够看成数字使用

引用名称(Reference Name):用于控制在其它元素中引用该值,形式:$(reference_name}

与每用户独立的跟踪计数器(Track Counter Independently for each User):全局的计数器,若是不勾选,即全局的,好比用户#1 获取值为1,用户#2获取值仍是为1;

若是勾选,即独立的,则每一个用户有本身的值:好比用户#1 获取值为1,用户#2获取值为2。

每次迭代复原计数器(Reset counter on each Thread Group Iteration):可选,仅勾选与每用户独立的跟踪计数器时可用;

若是勾选,则每次线程组迭代,都会重置计数器的值,当线程组是在一个循环控制器内时比较有用。

 

二、具体过程

①计数器设置

②取样器设置

③结果树请求内容

从上图能够看出,计数器成功的生成了咱们所需的值。

PS:以上就是计数器的使用方法;为了方便演示,请求地址和路径是随便选用的,忽略红色报错便可。。。

 

jmeter(17):目录结构

首先得了解一下这些东西,之后才能快速的找到某些配置文件进行修改(举个例子,改配置只是其中之一)

1、bin目录
examples:         目录中有CSV样例

jmeter.bat        windows的启动文件

jmeter.log        jmeter运行日志文件

jmeter.sh         linux的启动文件

jmeter.properties     系统配置文件

jmeter-server.bat      windows分布式测试要用到的服务器配置

jmeters-server         linux分布式测试要用的服务器配置

其中系统配置文件中的SSL设置重点关注以下几个:

# 指定HTTPS协议层

https.default.protocol=TLS

# 指定SSL版本

https.default.protocol=SSLv3

# 设置启动的协议

https.socket.protocols=SSLv2Hello SSLv3 TLSv1

# 缓存控制,控制SSL是否能够在多个迭代中重用

https.use.cached.ssl.context=true

 

2、docs目录

  接口文档目录。例C:\apache-jmeter-3.0\docs\api下的index.html

 

3、extras目录

  扩展插件目录。提供了对Ant的支持,能够使用Ant来实现自动化测试,例如批量脚本执行,产生html格式的报表,测试运行时,能够把测试数据记录下来,jmeter会

   自动生成一个.jtl文件,将该文件放到extras目录下,运行"ant -Dtest=文件名 report",就能够生成测试统计报表。

 

4、lib目录

  所用到的插件目录,里面均为jar包。jmeter会自动在jmeter_HOME/lib和ext目录下寻找须要的类,lib下存放JMeter所依赖的外部jar,

   如:httpclient.jar、httpcore.jar、httpmime.jar等等。

  其中lib\ext目录下存放有Jmeter依赖的核心jar包,ApacheJMeter_core.jar、ApacheJMeter_java.jar在写client端须要引用,JMeter插件包也在此目录下。

  lib\junit下存放junit测试脚本.

 

5、Licenses目录

  jmeter证书目录

 

6、Printable_docs目录

  用户使用手册,例C:\apache-jmeter-3.0\printable_docs下的index.html

 

jmeter(18):关联之Xpath Extractor

jmeter提供的对关联的支持包括如下2个方面:

①可以将返回页面上的指定内容保存在参数中;

②可以将GET或POST方法中的数据使用该参数来替换;

XPath Extractor的使用方法与正则表达式提取器(Regular Expression Extractor)相似,只不过该Expression中指定的不是正则表达式,而是给定的XPath路径。

首先,新建一个线程组,而后右键-添加-后置处理器-XPath Extractor:

 

这里简单介绍下jmeter后置处理器的做用

后置处理器(Post Processor)本质上是一种对sampler发出请求后接受到的响应数据进行处理(后处理)的方法,结合以前我介绍过的jmeter元件的做用域和执行顺序 

必须将后置处理器元件放在合适的位置才能达到预期的效果。

XPath Extractor界面以下:

APPly to:做用范围(返回内容的断言范围)

         Main sample and sub-samples:做用于父节点的取样器及对应子节点的取样器

         Main sample only:仅做用于父节点的取样器

         Sub-samples only:仅做用于子节点的取样器

         JMeter Variable:做用于jmeter变量(输入框内可输入jmeter的变量名称)

XML Parsing Options:要解析的XML参数

         Use Tidy:当须要处理的页面是HTML格式时,必须选中该选项;若是是XML或XHTML格式(例如RSS返回),则取消选中;

                   Quiet表示只显示须要的HTML页面,Report errors表示显示响应报错,Show warnings表示显示警告;

         Use Namespaces:若是启用该选项,后续的XML解析器将使用命名空间来分辨;

         Validate XML:根据页面元素模式进行检查解析;

         Ignore Whitespace:忽略空白内容;

         Fetch external DTDs:若是选中该项,外部将使用DTD规则来获取页面内容;

Return entire XPath fragment of  text content:返回文本内容的整个XPath片断;

Reference Name:存放提取出的值的参数。

XPath Query:用于提取值的XPath表达式。

Default Value:参数的默认值。

PS:XPath是XML/XHTML中经常使用的选取给定节点和节点集的方法。

 

正则表达式提取器和XPath Extractor的区别:

①正则表达式提取器能够用于对页面任何文本的提取,提取的内容是根据正则表达式在页面内容中进行文本匹配;

②XPath Extractor则能够提取返回页面任意元素的任意属性;

③若是须要提取的文本是页面上某元素的属性值,建议使用XPath Extractor;

④若是须要提取的文本在页面上的位置不固定,或者不是元素的属性,建议使用正则表达式提取器。

 

jmeter(19):Http属性管理器

jmeter是一个开源灵活的接口和性能测试工具,固然也能利用jmeter进行接口自动化测试。在咱们利用它进行测试过程当中,最经常使用的sampler大概就是Http Request,

使用这个sampler时,通常都须要使用配置元件里的http属性管理器,其做用就是用于尽量的模拟浏览器的行为,在http协议层上定制发送给被测应用的http请求。

jmeter提供如下五种http属性管理器:

HTTP Cache Manager:Cache管理器

HTTP Cookie Manager:cookie管理器

HTTP Header Manager:信息头管理器

HTTP Authorzation Manager:受权管理器

HTTP Request Defaults:请求默认值

 

一、HTTP Cache Manager

Clear cache each iteration?(每次迭代清空缓存):若是选择该项,则该属性管理器下的全部Sampler每次执行时都会清除缓存;

Use Cache-Control/Expires header when processing GET requests:在处理GET请求时使用缓存/过时信息头;

Max Number of elements in cache(缓存中的最大元素数):默认数值为5000,固然能够根据须要自行修改;

PS:若是Test Plan中某个Sampler请求的元素是被缓存的元素,则Test Plan在运行过程当中会直接从Cache中读取元素,这样获得的返回值就会是空。

在这种状况下,若是为该Sampler设置了断言检查响应体中的指定内容是否存在,该断言就会失败!

为test plan增长该属性管理器后,test plan运行过程当中会使用Last-Modified、ETag和Expired等决定是否从Cache中获取对应元素。

Cache:通常指的是浏览器的缓存

Last-Modified:文件在服务端最后被修改的时间

ETag:在HTTP协议规格说明中定义为:被请求变量的实体标记

Expired:给出的日期/时间以后;通常结合Last-Modified一块儿使用,用于控制请求文件的有效时间

 

二、HTTP Cookie Manager

Clear cookie each iteration?(每次迭代时清除本身会话区域的全部cookie);

Implementation:实现方式;

Cookie Policy:cookie的管理策略,建议选择compatibility,兼容性强;

PS:对于JMeter来讲,一个test plan只能有一个cookie管理器。由于当多个magager存在时,JMeter没有方法来指定使用那个manager;

同时,一个cookie manager中的存储的cookie也不能被其余cookie manager所引用,因此同一个计划中不建议使用多个cookie manager;

若是你想让JMeter的cookie manager支持跨域,  修改JMeter.property :CookieManager.check.cookies=false;

HTTP cookie Manager管理cookie有两种方法:

①、它能够像浏览器同样存储和发送cookie,若是发送一个带cookie的http请求,cookie manager会自动存储该请求的cookies,而且后面若是发送同源站点的http请求时,

均可以用这个cookies;每一个线程都有本身的“cookie存储区域”,因此当测试一个使用cookie来管理session信息的web站点时,每一个JMeter线程都有本身的session;

PS:以这种自动收集的方式收集到的cookie不会在cookie manager中进行展现,可是运行后经过查看结果树能够查看到cookie信息,接受到的cookie会被自动存储在线程变量中,

可是从Jmeter2.3.2版本后,默认再也不存储,若是你想要manager自动存储收集到 的cookie,你须要修改JMeter.property:CookieManager.save.cookies=true;

存储的时候,cookie的key会以“COOKIE_”为前缀命名(默认状况),若是你想自定义这个前缀,修改JMeter.property:CookieManager.name.prefix= ;

②、除了上面说的自动收集,还能够手动添加cookie,点击界面下方的Add按钮,而后输入cookie的相关信息;

PS:通常不建议手动添加,能够将cookie经过浏览器插件(好比Firefox的firebug)导出cookie,而后点击界面下方的load按钮,载入刚才导出的cookie文件便可。

关于Cookie:

cookie通常分为2种:持久cookie(Permanent cookie)和会话cookie(Session cookie):

持久cookie:保存在客户端本地硬盘上,在浏览器被关闭后仍然存在;

会话cookie:一般保存在浏览器进程的会话中,一旦浏览器会话结束或关闭,cookie就再也不存在。

 

三、HTTP Header Manager

一般Jmeter向服务器发送http请求的时候,后端须要一些验证信息,好比说web服务器须要带过去cookie给服务器进行验证,通常就是放在请求头(header)中,或者请求传参

须要定义参数格式等;所以对于此类请求,在Jmeter中能够经过HTTP信息头管理器,在添加http请求以前,添加一个HTTP信息头管理器,发请求头中的数据经过键值对的形式放到

HTTP信息头管理器中,在日后端请求的时候就能够模拟web携带header信息。

PS:能够点击添加、删除按钮等来新增和删减信息头的数据,也可经过载入按钮来将信息头数据加载进去(信息头数据较多时推荐使用)。

 

四、HTTP Authorzation Manager

该属性管理器用于设置自动对一些须要验证的页面进行验证和登陆;

基础URL:须要使用认证页面的基础URL,如上图,当取样器访问它时,jmeter会使用定义的username和password进行认证和登陆;

用户名:用于认证和登陆的用户名;

密码:用于认证和登陆的口令;

域:身份认证页面的域名;

Realm:Realm字串;

Mechanism:机制;jmeter的http受权管理器目前提供2种认证机制:BASIC_DIGEST和KERBEROS:

           BASIC_DIGEST:HTTP协议并无定义相关的安全认证方面的标准,而BASIC_DIGEST是一套基于http服务端的认证机制,保护相关资源避免被非法用户访问,

                             若是你要访问被保护的资源,则必须要提供合法的用户名和密码。它和HTTPS没有任何关系(前者为用户认证机制,后者为信息通道加密)。

           KERBEROS:一个基于共享秘钥对称加密的安全网络认证系统,其避免了密码在网上传输,将密码做为对称加密的秘钥,经过可否解密来验证用户身份;

 

五、HTTP Request Defaults

HTTP请求默认值,这个属性管理器用于设置其做用范围内的全部HTTP Request默认值,包括:

服务器请求或IP:请求发送的目标服务器名称或地址;

端口:目标服务器的端口号,默认80;

协议:箱目标服务器发送请求所采用的协议,HTTP或HTTPS,默认HTTP;

Content encoding :内容的编码方式,默认值为iso8859;

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

同请求一块儿发送参数 : 对于带参数的URL ,jmeter提供了一个简单的对参数化的方法:用户能够将URL中全部参数设置在本表中,表中的每一行是一个参数值对;

从HTML文件获取全部有内含的资源:该选项被选中时,jmeter在发出HTTP请求并得到响应的HTML文件内容后,还对该HTML进行Parse 并获取HTML中包含的

全部资源(图片、flash等),默认不选中;若是用户只但愿获取页面中的特定资源,能够在下方的Embedded URLs must match 文本框中填入须要下载的特定资源表达式,

这样,只有能匹配指定正则表达式的URL指向资源会被下载。

注意事项:

①、一个测试计划中能够有多个Defaults组件,多个Defaults组件的默认值会叠加;

②、两个default中都定义的"Server Name or IP",显示在发送请求时只能使用一个;

 

jmeter(20):阶梯式加压测试

性能测试中,有时须要模拟一种实际生产中常常出现的状况,即:从某个值开始不断增长压力,直至达到某个值,而后持续运行一段时间。

在jmeter中,有这样一个插件,能够帮咱们实现这个功能,这个插件就是:Stepping Thread Group

 

一、下载配置方法

Stepping Thread Group是jmeter插件的一种,其做用就是模拟实际的生产状况,不断对服务器施加压力,直至到某个值,而后持续运行一段时间。

下载地址:https://jmeter-plugins.org/downloads/old/

下载界面以下:

下载后须要解压,而后将JMeterPlugins-Standard.jar包放在jmeter安装目录的jmeter-3.0\lib\ext路径下,从新启动jemter便可。

 

二、使用介绍

启动jmeter,添加线程组——jp@gc - Stepping Thread Group,以下图:

Stepping Thread Group界面以下:

功能以下:

This group will start 100 threads:设置线程组启动的线程总数为100个;

First,wait for N seconds:启动第一个线程以前,须要等待N秒;

Then start N threads:设置最开始时启动N个线程;

Next,add 10 threads every 30 seconds,using ramp-up 5 seconds:每隔30秒,在5秒内启动10个线程;

Then hold load for 60 seconds:启动的线程总数达到最大值以后,再持续运行60秒;

Finally,stop 5 threads every 1 seconds:每秒中止5个线程;

 

3、相关插件

Stepping Thread Group插件相对来讲比较旧,在plugins插件组中,还有一个相似的优化过的插件,叫作:Concurrency Thread Group

相关介绍以及下载地址以下:https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/

其实最好的办法,是直接下载jmeter的第三方插件Plugin Manager(其中包含了不少扩展支持插件),解压后将其放入jmeter安装目录的jmeter-3.0\lib\ext路径下,而后重启便可。

下载地址:https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/

 

jmeter的第三方扩展插件功能是很丰富的,也算必定程度上弥补了jmeter做为开源工具的某些不足之处,具体的做用仍是须要在实战中摸索实践。。。

 

jmeter(21):经常使用插件介绍

1、下载安装及使用

下载地址:https://jmeter-plugins.org/ 

安装:下载后文件为plugins-manager.jar格式,将其放入jmeter安装目录下的lib/ext目录,而后重启jmeter,便可。

启动jemter,点击选项,最下面的一栏,以下图所示:

打开后界面以下:

Installed Plugins(已安装的插件):即插件jar包中已经包含的插件,能够经过选中勾选框,来使用这些插件;

Available Plugins(可下载的插件):即该插件扩展的一些插件,能够经过选中勾选框,来下载你所须要的插件;

Upgrades(可更新的插件):便可以更新到最新版本的一些插件,通常显示为加粗斜体,能够经过点击截图右下角的Apply Changes and Restart Jmeter按钮来下载更新;

PS:通常不建议进行更新操做,由于最新的插件都有一些兼容问题,并且极可能致使jmeter没法使用(常常报加载类异常)!!!

  建议使用jmeter最新的3.2版原本尝试更新这些插件。。。

 

2、Transactions per Second

TPS:每秒事务数,性能测试中,最重要的2个指标之一。该插件的做用是在测试脚本执行过程当中,监控查看服务器的TPS表现————好比总体趋势、实时平均值走向、稳定性等。

jmeter自己的安装包中,监视器虽然提供了好比聚合报告这种元件,也能提供一些实时的数据,但相比于要求更高的性能测试需求,就稍显乏力。

经过上面的下载地址下载安装好插件后,重启jmeter,从监视器中就能够看到该插件,以下图所示:

某次压力测试TPS变化展现图:

 

3、Response Times Over Time

TRT:事务响应时间,性能测试中,最重要的两个指标的另一个。该插件的主要做用是在测试脚本执行过程当中,监控查看响应时间的实时平均值、总体响应时间走向等。

使用方法如上,下载安装配置好插件以后,重启jmeter,添加该监视器,便可实时看到实时的TRT数值及总体表现。

某次压力测试TRT变化展现图:

 

4、PerfMon Metrics Collector

服务器性能监控数据采集器。在性能测试过程当中,除了监控TPS和TRT,还须要监控服务器的资源使用状况,好比CPU、memory、I/O等。该插件能够在性能测试中实时监控服务器的各项资源使用。

下载地址:https://jmeter-plugins.org/install/Install/

下载界面以下:

其中JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的插件,ServerAgent是服务端的插件。

下载成功后,复制JmeterPlugins-Extras.jarJmeterPlugins-Standard.jar两个文件,放到jmeter安装文件中的lib/ext中,重启jmeter,便可看到该监视器插件。以下图:

将ServerAgent-2.2.1.jar上传到被测服务器,解压,进入目录,Windows环境,双击ServerAgent.bat启动;linux环境执ServerAgent.sh启动,默认使用4444端口。

如出现以下图所示状况,即代表服务端配置成功:

一、服务端启动校验

CMD进入命令框,观察是否有接收到消息,若是有,即代表ServerAgent成功启动。

二、客户端监听测试

给测试脚本中添加jp@gc - PerfMon Metrics Collector监听器,而后添加须要监控的服务器资源选项,启动脚本,便可在该监听器界面看到资源使用的曲线变化。以下图所示:

在脚本启动后,便可从界面看到服务器资源使用的曲线变化,Chart表示主界面显示,Rows表示小界面以及不一样资源曲线所表明的颜色,Settings表示设置,可选择本身须要的配置。

PS:注意测试脚本须要持续运行一段时间,才能够看到具体的曲线变化,不然ServerAgent端会断开链接!

 

jmeter(22):内存溢出缘由及解决办法

jmeter是一个java开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出,

这里就介绍下如何解决内存溢出及相关的知识点。。。

 

首先来看看咱们常说的内存泄漏、内存溢出是什么?

内存泄露是指你的应用使用资源以后没有及时释放,致使应用内存中持有了不须要的资源,这是一种状态描述;

内存溢出是指你应用的内存已经不能知足正常使用了,堆栈已经达到系统设置的最大值,进而致使崩溃,这事一种结果描述;

一般都是因为内存泄露致使堆栈内存不断增大,从而引起内存溢出。

在利用jmeter测试过程当中,若是内存溢出的话,通常会出现这个提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆内存溢出,不够用了。

 

说到堆栈内存,顺带简单介绍下堆栈的相关知识

 

内存溢出解决方法:调整堆内存大小

步骤:

一、打开jmeter安装文件(能够用notepad++打开),bin目录下的jmeter.bat文件:

二、找到set HEAP开头的内容,根据具体须要修改堆(heap)值大小,以及NEW分配的内存值大小:

这里默认值为:

set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m

将其修改成:

set HEAP=-Xms512m -Xmx4096m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m

注意:通常而言,堆的最大值不要超过物理内存的一半,不然容易致使jmeter运行变慢、卡顿甚至内存溢出(由于java自己的垃圾回收机制是动态分配内存,

调整时候其自己会占用不少内存),NEW分配的内存,不宜太大!

三、修改完成后,关闭文件,重启jmeter既能够:

 

jmeter(23):分布式测试

jmeter用了一年多,也断断续续写了一些相关的博客,忽然发现没有写过度布式测试的一些东西,这篇博客就介绍下利用jmeter作分布式测试的一些技术点吧,权当参考。。。

关于jmeter的介绍和元件做用,以前的博客介绍过,不少其余同行的博客也够详细的,这里不作介绍,对jmeter不甚了解的能够参考以前的博客:

 

1、为何要使用分布式测试

按照通常的压力机配置,jmeter的GUI模式下(Windows),最多支持300左右的模拟请求线程,再大的话,容易形成卡顿、无响应等状况,这是限于jmeter其自己的机制和硬件配置。

有时候为了尽可能模拟业务场景,须要模拟大量的并发请求,这个时候单台压力机就显得有心无力。针对这个状况,jmeter的解决方案是支持分布式压测,即将大量的模拟并发分配给

多台压力机,来知足这种大流量的并发请求场景。

 

2、分布式压测的原理

一、分布式测试中,选择一台做为管理机(Contorller),其余的机器做为测试执行的代理机(Agent);

二、执行测试时,由Contorller经过命令行将测试脚本发给Agent,而后Agent执行测试(不须要启动GUI),同时将测试结果发送给Contorller;

三、测试完成,能够在Contorller上的监听器里面看到Agent发来的测试结果,结果为多个Agent测试结果汇总而成;

 

3、分布式设置步骤

一、修改Contorller配置

打开Contorller机下jmeter安装文件下的bin目录:jmeter.properties文件,搜索remote_hosts=127.0.0.1,将Agent机的IP和端口写在后面,好比:

 remote_hosts=127.0.0.1,127.0.0.2:80,127.0.0.3:80 

其中127.0.0.2和127.0.0.3为Agent机的IP,每一个Agent机之间用英文半角逗号隔开,修改保存。

二、启动jemter

启动jmeter后,设置线程组、配置元件、取样器、监听器等原件,点击“运行-远程启动”:

能够选择远程启动一个Agent机,或者选择远程所有启动,这样,就能够进行分布式测试了。

PS:上面的例子中,127.0.0.2和127.0.0.3为举例说明,具体实践请修改成对应的Agent机IP以及端口。

 

4、注意事项

一、保持Contorller和Agent机器的JDK、jmeter以及插件等配置版本一致;

二、若是测试数据有用到CSV或者其余方式进行参数化,须要将data pools在每台Agent上复制一份,且读取路径必须保持一致;

三、确保Contorller和Agent机器在同一个子网里面;

四、检查防火墙是否被关闭,端口是否被占用(防火墙会影响脚本执行和测试结构收集,端口占用会致使Agent机报错);

五、分布式测试中,经过远程启动代理服务器,默认查看结果树中的响应数据为空,只有错误信息会被报回;

六、若是并发较高,建议将Contorller机设置为只启动测试脚本和收集汇总测试结果,在配置文件里去掉Contorller机的IP;

七、分布式测试中,若是1S启动100个模拟请求,有5个Agent机,那么须要将脚本的线程数设置为20,不然模拟请求数会变成500,和预期结果相差太大。

 

jmeter(24):dubbo接口测试

1、Dubbo简介

dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包含以下几点:

一、远程通信:提供对多种基于长链接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式;

二、集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持;

三、自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方能够平滑增长或减小机器;

四、dubbo简化模型

 

2、Dubbo插件

一、jmeter自己并不支持dubbo接口的测试,须要下载第三方插件,而后将jar包放入${JMETER_HOME}\lib\ext路径下,重启便可。

插件下载地址:jmeter-plugins-dubbo

 

3、Dubbo Sample

启动jmeter,添加线程组→Sampler→Listener,dubbo-sample界面以下:

各参数说明以下:

Protocol:注册协议,包括zookeeper、multicast、Redis、simple;

Address:注册地址,dubbo服务的IP+Port:

①、当使用zk,address填入zk地址,集群地址使用","分隔;

②、使用dubbo直连,address填写直连地址和服务端口;

Protocol:使用的dubbo协议,包括dubbo、rmi、hessian、webservice、memcached、redis,根据本身的协议类型选择对应的选项便可;

Timeout:请求超时时间,单位ms,根据dubbo具体配置填写;

Version:版本,dubbo不一样版本之间差别较大,不一样版本之间不能互相调用,这里指定dubbo版本,是为了方便识别和说明;

Retries:异常重试次数(相似这种分布式服务通讯框架,大多都有重试机制,是为了保证事务成功率);

Cluster:集群类型,包括failover、failfast、failsafe、failback、failking;

Group:组类型,若是有的话,根据配置填写便可;

Connections:链接数,同上,根据配置填写;

Async:服务处理类型,包括sync(同步)、async(异步),根据配置填写;

Loadbalance:负载均衡策略,包括random(随机)、roundrobin(轮询)、leastactive(最少活跃数)、consistenthash(一致性哈希);

Interface:接口名(由于dubbo服务大可能是开发根据规范自行命名的,所以这里须要填写完整的接口名+包名);

Method:当前接口下的方法名,按照开发提供的API文档填写便可;

Args:接口报文,根据API文档填写,如上图所示,添加输入行,输入对应的参数类型和值便可(参数类型和值如何定义填写,请参考上面的连接);

①、paramType:参数支持任何类型,包装类直接使用java.lang下的包装类,小类型使用:intfloatshotdoublelongbytebooleanchar,自定义类使用类彻底名称;

②、paramValue:基础包装类和基础小类型直接使用值,例如:int为1,boolean为true等,自定义类与List或者Map等使用json格式数据;

 

以上即为利用jmeter的dubbo插件进行dubbo接口的测试,固然,一样能够进行性能测试。。

 

jmeter(25):linux环境运行jmeter并生成报告

jmeter是一个java开发的利用多线程原理来模拟并发进行性能测试的工具,通常来讲,GUI模式只用于建立脚本以及用来debug,执行测试时建议使用非GUI模式运行。

 

1、为何要非GUI模式运行

jmeter是java语言开发,实际是运行在JVM中的,GUI模式运行须要耗费较多的系统资源,通常来讲,GUI模式要占用10%-25%的系统资源。

而使用非GUI模式(即linux或dos命令)能够下降对资源的消耗,提高单台负载机所能模拟的并发数。

启动jmeter,提醒以下:

 

2、环境准备

一、安装JDK

二、安装jmeter

下载压缩包,而后将安装包上传至linux服务器,通常有如下2种方式:

①、经过FileZilla或其余相似工具上传至linux服务器;

②、直接将zip文件拖至linux服务器;

方法以下:

输入命令 yum install -y lrzsz ,安装linux下的上传和下载功能包,而后将jmeter压缩包拖进去便可,示例以下:

而后输入命令 unzip jmeter-3.2.zip ,进行解压。

三、配置环境变量

输入命令 vim /etc/profile ,在最下面添加以下内容:

复制代码
export JAVA_HOME=/usr/java/1.8.0_181
export CLASSPATH=.:JAVA_HOME/lib/dt.jar:$JAVA_HOME.lib/tools.jar:$JRE_HOME.lib
export PATH=$PATH:$JAVA_HOME/lib
export PATH=/jmeter/apache-3.2/bin/:$PATH
export JMETER_HOME=/jmeter/jmeter-3.2
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
复制代码

 保存后,输入命令 source /etc/profile ,使修改的配置生效。

四、授予权限

在执行jmeter脚本执行,首先要确保监控工具、jmeter以及相关的文件有相应的权限,不然会报错,常见的报错以下:

①、文件没有权限

②、没法打开目录下的文件

③、编码格式错误

查看文件或工具是权限的命令以下:

复制代码
# 查看当前目录下全部文件的权限
ls -l     
# 查看当前目录下全部文件的权限
ll
# 查看某个文件的权限
ls -l filename
# 查看某个目录的权限
ls ld /path
复制代码

 五、linux文件颜色表明的含义

在linux中,不一样颜色的文件表明不一样的含义,下面是linux中不一样颜色的文件表明的含义:

复制代码
# 白色:普通的文件
# 蓝色:目录
# 绿色:可执行的文件
# 红色:压缩文件或者包文件
# 青色:链接文件
# 黄色:设备文件
# 灰色:其余的文件
复制代码

 

3、运行jmeter

一、启动jmeter,建立脚本

这里以访问我博客首页为例:

脚本保存为test.jmx,而后将文件上传至linux服务器。

二、运行脚本

将脚本上传至linux服务器,而后进入jmeter的bin目录下,输入命令 jmeter -n -t test.jmx -l test.jtl ,运行jmeter脚本。

PS:经常使用命令解析:

复制代码
# 常见命令说明
-h 帮助:打印出有用的信息并退出
-n 非 GUI 模式:在非 GUI 模式下运行 JMeter
-t 测试文件:要运行的 JMeter 测试脚本文件
-l 日志文件:记录结果的文件
-r 远程执行:启动远程服务
-H 代理主机:设置 JMeter 使用的代理主机
-P 代理端口:设置 JMeter 使用的代理主机的端口号
复制代码

 运行结果以下图:

三、查看测试报告

启动jmeter,新建一个线程组,添加所需的监听器,导入脚本运行产生的.jtl文件,以下:

 

jmeter(26):生成HTML性能测试报告

性能测试工具Jmeter因为其体积小、使用方便、学习成本低等缘由,在如今的性能测试过程当中,使用率愈来愈高,但其自己也有必定的缺点,好比提供的测试结果可视化作的很通常。

不过从3.0版本开始,jmeter引入了Dashboard Report模块,用于生成HTML类型的可视化图形报告(3.0版本的Dashboard Report模块会中文乱码,所以建议使用3.0以上的版本)。

1、生成HTML测试报告的两种方式

一、利用已有.jtl文件生成报告

进入jmeter的bin目录下,输入以下命令:

jmeter -g test.jtl -o /path
# -g:后跟test.jtl文件所在的路径
# -o:后跟生成的HTML文件存放的路径

PS:若是是在Windows环境命令行运行,必须指定生成的HTML文件存放文件夹,不然会报错;若是是linux环境,如指定路径下不存在该文件夹,会生成对应的文件夹存放报告文件!

 

二、无.jtl文件生成测试报告

若是还未生成.jtl文件,则能够经过以下命令,一次性完成测试执行和生成HTML可视化报告的操做,进入jmeter的bin目录下,输入以下命令:

jmeter -n -t test.jmx -l test.jtl -e -o /path
# -n:以非GUI形式运行Jmeter 
# -t:source.jmx 脚本路径 
# -l:result.jtl 运行结果保存路径(.jtl),此文件必须不存在 
# -e:在脚本运行结束后生成html报告 
# -o:用于存放html报告的目录

我本地Windows环境执行截图以下:

PS:(linux系统和windows系统命令同样)须要注意的是,生成的.jtl文件路径下,不能存在同名的.jtl文件,不然会执行失败。

执行完毕后,用浏览器打开生成的文件目录下的index文件,效果展现以下:

 

2、图表信息详解

测试报告分为两部分,Dashboard和Charts,下面分开解析。

一、Dashboard(概览仪表盘)

①、Test and Report informations

②、APDEX (应用性能指标)

③、Requests Summary

 

二、Charts(详细信息图表)

PS:因为详细信息图表有点多,这里我挑几个性能测试过程当中比较关键的图表解析!

Over Time

①、Response Times Over Time(脚本运行期间的响应时间变化趋势图)

说明:能够根据响应时间和变化和TPS以及模拟的并发数变化,判断性能拐点的范围。

②、 Response Time Percentiles Over Time (successful responses)

说明:脚本运行期间成功的请求响应时间百分比分布图,能够理解为聚合报告里面不一样%的数据,图形化展现的结果。

③、Bytes Throughput Over Time(脚本运行期间的吞吐量变化趋势图)

说明:在容量规划、可用性测试和大文件上传下载场景中,吞吐量是很重要的一个监控和分析指标。

④、 Latencies Over Time(脚本运行期间的响应延时变化趋势图)

说明:在高并发场景或者强业务强数据一致性场景,延时是个很严重的影响因素。

 

Throughput

①、Transactions Per Second(每秒事务数)

说明:每秒事务数,即TPS,是性能测试中很重要的一个指标,它是用来衡量系统处理能力的一个重要指标。

 

Response Times

①、 Response Time Percentiles(响应时间百分比分布曲线图)

说明:即响应时间在某个范围内的请求在全部请求数中所占的比率,相比于平均响应时间,这个值更适合用来衡量系统的稳定性。

②、Time Vs Threads(平均响应时间和线程数的对应变化曲线)

说明:能够经过这个对应的变化曲线来做为肯定性能拐点的一个参考值。

 

 

转载: https://www.cnblogs.com/imyalost

相关文章
相关标签/搜索