jmeter性能测试
1. Jmeter简介
Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。
本文为JMeter性能测试完整入门篇,从Jmeter下载安装到编写一个完整性能测试脚本、最终执行性能测试并分析性能测试结果。
运行环境为Windows 10系统,JDK版本为1.8,JMeter版本为5.1。
2.Jmeter安装
2.1、需要安装JDK
JDK—java开发工具包
JRE—java运行环境
JVM—java虚拟机
2.2、验证机器是否安装好java环境
java -version—查看版本号
java 验证系统的环境变量path是否设置ok
2.3、设置环境变量—目标:任意路径可以识别jmeter
JMETER_HOME:D:\JMeter\apache-jmeter-5.1.1
PATH:%JMETER_HOME%\bin
2.3、杂项
每一台机器是否能创建多少个用户数—内存(物理内存)16G
Jmeter—一个java进程—进程需要一定内存资源-堆内存
jmeter-server—分布式启动时使用
jmeter.bat—单台机器启动
jmeter永久中文设置—打开bin目录下jmeter.properties文件在37行左右修改为language=zh_CN
3.性能指标简介
3.1性能指标四个字总结:多、快、好、省。
多:对应的就是并发量
快:延时、响应时间
好:稳定性(长时间运行)
省:资源使用率
3.2、性能指标的描述:
3.2.1、响应时间:对请求作出响应所需要的时间,是用户感知软件性能的主要指标(端到端的)
响应时间包括:
1.用户客户端呈现时间
2.请求\响应数据网络传输时间
3.应用服务器处理时间
4.数据库系统处理时间
思考:响应时间多少合理?答:2、5、8秒原则
3.2.2、并发用户数
并发用户数的概念:系统用户数、在线用户数、并发用户数
系统用户数:软件系统注册是用户总数
在线用户数:(1)某段时间内访问的用户数,这些用户只是在线,(2)不一定同时做某一件事情
并发:用于从业务的角度模拟真实用户访问同时访问
并发数:同时访问系统的用户数
在c/s或者b/s结构的应用,系统的性能主要有服务器觉得,服务器在大量用户同时访问时压力最大
并发分为:
严格并发:秒杀
广义并发:不同用户做不同的事情
计算:
平均并发用户数的计算:c=nL/t
c-是平均的并发用户数
n-是平均每天访问用户数
l-是一天内用户从登陆到退出的平均时间
t-是考察时间长度(一天内多长时间有用户使用系统
并发用户数峰值计算:C^约等于C+3*根号C
3.2.3.吞吐量
性能测试:指单位时间内系统处理用户的请求数
从业务角度看:吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量用户请求数/秒或页面数/秒来衡量
从网络角度看:吞吐量可以用:字节/秒来衡量
对于交互式应用来说,吞吐量指标反映的是服务器承受的压力他能够说明系统的负载能力
TPS:每秒事物数
计算:当没有遇到性能瓶颈的时候吞吐量与虚拟用户数之间存在一定的联系,可以采用以下公式计算:
F=VU*R/T=100*1/5=20
其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示每个虚拟用户 发出的请求数,T表示性能测试所用的时间
没有经过初始化的性能环境等于没有作用的环境
3.2.4.性能计数器
性能计数器:是描述服务器或操作系统性能的一些数据指标
比如:内存,CPU、磁盘等资源使用率等
3.2.5.思考时间
Think time:从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔
在做性能测试时,为了模拟这样的时间间隔,引入了思考时间这个概念,来更加真实的模拟用户的操作
网络环境是影响性能指标的重要因素之一;解决方法:连续运维:对linux系统注入网络延时的方法(比如数据库服务器在美国,应用服务器在加拿大和你直接2台服务器通过网线直连有很大区别)
重要:
没有经过初始化的性能环境等于没有作用的环境
网络环境是影响性能指标的重要因素之一;解决方法:连续运维:对linux系统注入网络延时的方法(比如数据库服务器在美国,应用服务器在加拿大和你直接2台服务器通过网线直连有很大区别)
数据库:数据库dump,如果数据敏感不能做导出,可以确认数据库表的数据格式,创造测试数据
4.什么是jmeter脚本
4.1.概念:
通俗:用户操作被测软件系统某场景的动作流程
Jmeter:用户操作被测软件系统某场景的请求
性能测试:重要场景从1到N的变化
4.2.怎么快速开发漂亮的脚本
准确:最基本的要求,脚本能可以正常运行
快速:借助技术手动快速高效完成脚本开发
漂亮:脚本逻辑、维护性高
4.3.开发脚本方案
方案一:代理“剑”
剑语:jmetery也有自己的dialing,录制脚本前,我们只要启动好代理,手动通过浏览器来录制,录制完毕停止代理
1.提示:
直接保存jmx文件
需要人为调整脚本
录制https需要设置
2.Jmeter自带脚本录制工具
测试计划-》新建线程组-》右击测试计划-》非测试媛姐-》HTTP代理服务器
1.jmeter设置端口
2.jmeter设置目标控制器选择测试计划>线程组
3.打开浏览器,导入jmeter证书,证书在Jmeter的bin目录下ApacheJMeterTemporaryRootCA.crt
4.设置浏览器代理,代理地址就是本机127.0.0.1,端口号就是HTTP代理服务器设置的端口号
5.可点击HTTP代理服务器-》Requests Filtering设置排除没用的请求
6.点击启动即可
方案二:badboy录制(不怎么用了)
方案三:Fiddler(可导出jmx文件)
5.Jmeter主要元件
JMeter的主要元件有测试计划、线程组、取样器、逻辑控制器、配置元件、前置处理器、后置处理器、监听器、定时器、断言
其中共有8类可被执行的元件, test plan(测试计划)和 thread group(线程组)不属于可被执行的元件,而 sampler(取样器)是不与其他元件发生交互的作用的元件。
5.1测试计划(Test Plan)
用来描述一个性能/接口测试脚本和场景设计,包含与本次测试所有相关的功能。也就是说,使用Jmeter进行测试的所有内容,都是与基于一个测试计划中在换个说法,一个测试计划就对应一个Jmeter测试脚本
在Jmeter-Gui中,只能编辑一个测试计划,如果需要新创建一个测试计划,就要开启一个新的Jmeter-Gui窗口界面。
5.2线程组Threads(Users))
线程组元件是任何一个测试流程的起始点,在一个测试计划中的所有 元件都必须在某个线程组下。
JMeter自带的线程组,如下图所示:
(1)、setup thread group(setup线程组)
一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行;类似LoadRunner的init,测试开始时进行初始化的工作。
(2)、teardown thread group(tearDown线程组)
一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组;类似LoadRunnner的end,测试结束时进行回收工作。
(3)、thread group(线程组)
这个就是我们通常添加运行的线程。通俗的讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。
虽然三个线程组名字不一样,但是创建之后,页面都是一样的
线程组概括说明:
1. 线程组是一个测试流程的起始点。
2. 线程组中可以有多个线程。线程组也可以看作是一个虚拟用户组, 线程组中的每一个线程都可以理解为相当于一个“虚拟用户”。
3. 线程组中一个取样器代表一个请求,一个请求等同于一个线程。
4. 每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿 对服务器的并发访问。
5. 线程组元件可以设置线程数、设置执行测试的次数等操作。
【线程数】:虚拟用户数,控制多少用户并发
【Ramp-Up时间】:启动所有线程需要的时间;
1. 若是线程数过多,则会>该值启动完所有线程。
2. 为0代表立即启动所有线程;一般不这么设置,因为在测试的开始就建立全部线程并立即发送访问请求,会引起不正常的初始访问峰值。
3. 设置为T,N个线程时,JMeter将每隔T/N秒建立一个线程。T过大会降低访问峰值的负载:后面的线程还没启动,前面启动的部分线程已经结束了。
4. 网上提到设置合理的启动时间的方法:让初始吞吐量接近平均吞吐量,避免启动时间过小,同时最后一个线程启动时,第一个线程还未结束,避免启动时间过大。
【循环】:每个线程的循环次数。用来延长单个线程的运行时间,从而保证当最后一个线程启动时,所有线程都在运行中,达到压测效果。
1.若不勾选永远,设置为固定值。为达到最后一个线程启动时第一个线程还未结束,循环次数的计算方法为:
(1)假设线程数:5,ramp-up:10s,rt:0.2s
(2)最后一个线程启动开始时间 S = 10 - 10/5 = 8s
(3)第一个线程运行时间应该 > 8s
(4)循环次数 a > 8/0.2 = 40,即循环次数最少为40次,此时整个测试理论运行时间 = 40*0.2 + 8 = 16s
【延迟创建线程直到需要】:
JMeter 所有的线程是一开始就创建完成的,只是递增的时候会按照上面的规则递增;
如果选择了这个选项,则不会在一开始创建所有线程,只有在需要时才会创建。这样CPU 消耗会更平均,但是这时会有另一个隐患:稍微影响正在跑的线程;
如果不选择,在启动场景时,JMeter 会用更多的 CPU 来创建线程,它会影响前面的一些请求的响应时间,因为压力机的 CPU 在做其他事情。
举例:
-
-
-
设置 线程数:100,Ramp-Up:1s, 循环:2。
表示1秒内启动100线程并循环2次。 -
设置 线程数:3,Ramp-Up:1s, 循环:永远,持续时间:5s。
1s内启动3个线程,持续循环5s。
-
-
【调度器】:
持续时间(秒):测试计划持续多长时间,会覆盖结束时间。
启动延迟(秒):测试计划延迟多长时间启动,会覆盖启动时间。
5.3取样器(sampler)
-
- 取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的 响应数据。
- 取样器是线程组内部的元件,也就是说取样器只能在线程组中添加。
- 取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记 录响应时间的最小单元。(取样器通常要进行这三个工作)
- 取样器是按照测试计划树的顺序从上到下执行的。且取样器配合控制 器使用,可以修改取样器的执行顺序和次数。
重要:调试取样器,它是我们在开发脚本的时候调试用的。添加调试取样器后在察看结果树中能看到我们在脚本中所有参数化变量所取的值,这样有利于我们排错
5.4逻辑控制器(Logic Controller)
-
- 我们有编程基础的人都知道,提到逻辑主要就是条件和循环。
- JMeter官网对逻辑控制器的解释是:Logic Controllers determine the order in which Samplers are processed.
- 意思是说,逻辑控制器可以控制取样器(samplers)的执行顺序。
- 由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。
jmeter提供了17种逻辑控制器,它们各个功能都不尽相同,大概可以分为2种使用类型
1.控制测试计划执行过程中节点的逻辑执行顺序,如:Loop Controller(循环控制器)、If Controller(如果if控制器)等;
2.对测试计划中的脚本进行分组,方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等
5.4.1、循环控制器(loop Controller)--控制器下放http请求
指定其子节点运行的次数,可以使用具体的数值,也可是设置为变量(截图描述更详细)
5.4.2、简单控制器(Simple Controller)
简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作
这是Jmeter里最简单的一个控制器,它可以让我们组织归整我们的采样器和其它逻辑控制器(即:分组功能),提供一个块的结构和控制,不具有任何的逻辑控制和运行时的功能;
5.4.3、遍历循环控制器(ForEach Controller)
输入变量前缀:在其中输入需要遍历的用户参数(User Parameter)
Start index for loop(exclusive):循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)
End index for loop(inclusive):循环指数结束(包含)→ 遍历查询的变量范围,结束的值
输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,格式为${输出变量名}
Add”_”before number:输入变量名称中是否使用“_”进行间隔
PS:这个控制器一般配合配置元件→ 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理
5.4.4、包含控制器(Include Controller)
作用:用于引用外部的Jmx文件;从而控制多个测试计划组合
五、临界区控制器(critical section Controller)
作用:临界区控制器确保其子节点下的取样器或控制器将被执行(只有一个线程作为一个锁)
六、生命周期/运行周期控制器(Runtime Controller)
作用:用于控制该控制器下的取样器/控制器的运行时间
七、仅一次控制器(once only controller)
作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。
注意:将Once Only Controller作为Loop Controller的子节点,Once Only Controller在每次循环的第一次迭代时均会被执行
八、转换控制器(Switch Controller)
作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器。有两种赋值方式:
· 第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
· 第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。
当Value为空时,默认执行第1个子节点元素
九、当/判断控制器(While Controller)
作用:运行其子节点下的取样器/控制器,直到条件为“假”
十、事务控制器(transaction controller)
作用:生成一个额外的采样器来测量其下测试元素的总体时间;值得注意的是,这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的
十一、IF控制器(If Controller)
条件(默认JavaScript)(Condition(default javascript)):使用JavaScript的函数或变量进行评估判断条件为真或假
条件解释为变量表达式(interpret condition as variable expression):如果勾选该项,那么变量表达式会进行求值,并与“ture”或“false”进行比较,而无需使用JavaScript
对所有子条件执行(evaluate for all children):如果勾选该项,则该controller在没一个子节点执行时执行一次;
默认情况下,该控制器可以对包含在其下面的所有可运行的元素进行执行,但只在入口执行一次
十二、吞吐量控制器(Throughput Controller)
作用:控制其下的子节点的执行次数与负载比例分配,别被名字迷惑了,跟吞吐量没任何关系。jmeter自带的翻译这里是错误的,因为它并不能控制吞吐量(吞吐量的概念请访问百度);其实质作用是允许用户控制执行的频率;也有两种方式:
百分比执行和总执行
总执行(Total Executions):使控制器停止执行一定数量的测试计划
百分比执行(Percent Executions):使控制器按一定比例执行迭代的测试计划
流量(Throughput):对应上面的执行数量或者比例
每个用户(Per User):每个用户
如果勾选此项,将导致控制器计算是否应该执行在每个用户(每个线程)的基础上;如果不加以控制,那么将计算全球所有用户
十三、Interleave Controller 交替控制器
使用方法:假使该控制器下有2个取样器A和B,交替执行A和B2个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序
十四、随机控制器(Random Controller)
作用:类似交替控制器,但该控制器随机选取某一个取样器请求并执行
十五、随机顺序控制器(Random Order Controller)
作用:随机执行其下的所有子结点
与Random Controller不同的是,这个控制器会先将需要随机的内容均执行一遍,但次序不定
十六、录制控制器(Recording Controller)
作用:类似代理服务器的作用,在测试执行期间记录测试样本
十七、模块控制器(Module Controller)
作用:测试控制器子节点下的某一个模块,而不是整个测试计划
· 模块控制器,用于跳转到选定的控制器位置并执行对应的控制器
· 应用场景: 业务逻辑的跳转
配制说明
· Module to Run: 选择需要跳转到的目标控制器
5.5、定时器(Timer)
用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例 如:用户需要时间阅读文字内容、填表、或者查找需要点击的链接 等。为了模拟用户实际情况,在性能测试中我们需要考虑操作时间。 若不认真考虑操作时间很可能会导致测试结果的失真。例如,估计的 可支撑用户数可能会偏小。
在性能测试中,访问请求之间的停顿时间被称之为思考时间。 那么如何模拟这种停顿呢?我们可以借助JMeter的定时器元件实现。
Jmeter中的定时器一般被我们用来设置延迟与同步(操作之间的等待时间)。定时器的执行优先级高于Sampler(取样器),在同一作用域(例如控制器下)下有多个定时器存在时,每一个定时器都会执行,如果想让某一个定时器进队某一Sampler有效,则可以把定时器加在此Saopler节点下。
Jmeter自带的定时器,如下图所示:
Constant Timer 固定定时器
作用:通过ThreadDelay设定每个线程请求之前的等待时间(单位为毫秒)。注意:固定定时是有作用域的,放到线程组下其作用域是所有请求都会延迟固定器设置的时间,如果放到请求内,作用域是单个请求延迟时间(常用)。
Uniform Random Timer 均匀随机定时器
作用:它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。
总延迟时间=指定范围内的随机时间+固定延迟时间。
Constant Throughput Timer 固定吞吐量定时器
Gaussian Random Timer 高斯随机定时器
JSR223 Timer JSR223定时器
Poisson Random Timer 泊松随机定时器
Synchronizing Timer 同步定时器
作用:用来设置集合点,其作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力
(1)Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量,若设置为0,等于设置为线程组中的线程数量;
(2)Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数;如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。如果大于0,那么如果超过Timeout inmilliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0
同步定时器(Synchronizing Timer)的超时时间设置要求:超时时间 > 请求集合数量 * 1000 / (线程数 / 线程加载时间)
BeanShell Timer BeanShell脚本编写定时器
参数说明:
Reset Interpreter:每次迭代是否重置解析器,默认为false;在长时间运行的脚本中建议设置为true。
Parameters:BeanShell脚本的入参。入参可以是单个变量;也可以是数组,若是字符串数组,两个元素之间用空格隔开;也可以是常量。
File Name:BeanShell脚本可以从脚本文件中读取。
Script:在Script区直接写BeanShell脚本。
增加一个Java Request请求,并且增加时间验证是否按照自己设定的定时运行脚本:
Java Request ${__time(yyyy-MM-dd HH:mm:ss:SSS,)}
增加结果查看树:结果显示按之前设置的每个1秒钟运行
Precise Throughput Timer 精准吞吐量定时器
5.6前置处理器
前置处理器是在取样器发出请求之前执行一些操作。即:如果将强制处理器附加到取样器原件,则他将在该取样器原件运行之前执行
前置处理器蛀牙是用来处理,请求在实际发送之前的一些准备工作,比如取样器参数设置,环境变量设置,脚本预处理等操作
例如当URL中有sessionID一类的session信息时,可以通过该处理器填充发出请求实际的sessionID
Jmeter自带的前置处理器,如下图所示
5.6.1 HTML Link Parser(HTML链接解析器)
HTML链接解析器,用于从前一个sampler返回的html页面中按照规则解析链接和表单,再根据此处理器所在的sampler中的规则进行匹配修改,而后该sampler会执行;
此处理器无配置,使用示例如下:
如下示例中执行说明为:
1. 发送sampler“搜索”并返回HTML页面;
2. sampler“点击链接”中下的HTML链接解析器会将步骤1中返回的HTML页面根据“点击链接”这个sampler设置的规则进行解析并将解析结果发送给sampler“点击链接”;
3. sampler“点击搜索”发送;
HTTP URL Re-writing Modifier(HTTP URL重写修改器)
HTTP URL重写修改器,此处理器与HTTP Link Parser类似,但专用于使用url重写来存储sessionId而非cookie的http request,在线程组级别添加此修改器则应用于所有sample,若为单个sample添加则只适用该sample;
参数配置:
Session Argument Name:会话参数名称,用于搜索sessionId,其他sample也可通过此参数来 调用其获取的sessionId;
Path Extension:路径扩展,如url添加了分号作为分割,则勾选此项;
Do not use equals in path extension:用于url不用等号来分割key和value的类型;
Do not use questionmark in path extension:用于不带?的类型;
Cache Session Id?:勾选此项则会存储在其挂载的sample上获取到的sessionId供后边的其他sample使用;
URL Encode:是否使用url编码;
User Parameters(用户参数)
用户参数,用于做几组参数给线程组的各个线程使用,如果线程数多于用户参数组数,则多出来的线程则从第一组用户参数开始依次调用参数组;
参数配置:
Name:此前置处理器的名称;
Update Once Per Iteration:标识是否每轮迭代更新一次元素;
JDBC PreProcessor(数据库预处理器)
数据库预处理器,用于在sample开始前查询数据库并获取一些值;
参数配置:
Variable Name of Pool declared in JDBC Connection Configuration:连接池名称,需与JDBC链接配置中的Variable Name相同(此预处理器需要一个JDBC Connection Configuration,此配置器在配置元件中);
Query Type:数据库查询类型,根据需要自行选择;
Query:数据库语句输入框,根据需要输入,注意结尾不要加”;”;
Parameter values:参数名称,如果Query的语句中有”?”则此处填值,可以使用调用参数方式;
Parameter types:参数类型,与Parameter values对应,设置参数类型,与sql字段类型相同;
Variable names:设定此项可以获取固定列的所有值;
Result variable name:随意设定一个名称,则此名称会被作为一个参数并对应Query出来的内容;可以使用参数调用的方法来获取此设置的名称对应的值;
Query timeout(s):超时时间;
Handle ResultSet:有四个选项,结果保存的方式;
RegEx User Parameters(重要)
正则表达式,使用正则表达式为从另一个HTTP请求中提取的HTTP参数指定动态值
参数配置:
name:此前置处理器名称;
Regular Expression Reference Name:调用的正则表达式提取器中的引用名称;
Parameter names regexp group number:用于提取参数名称的正则表达式的组编号;
Parameter values regex group number:用于提取参数值的正则表达式的组编号;
Sample Timeout
超时器,用于设定sample的超时时间,如果完成时间过长,此预处理器会调度计时器任务以中断样本;
参数配置:
name:超时器名称;
Sample timeout:超时时间;
JSR223 PreProcessor
JSR223预处理器,用于调用脚本;
参数配置:
Name:名称,随意设定;
Language:使用的JSR223语言,可根据需要选择;
Parameters:传递给脚本的参数;
Script file:脚本文件;
Script compilation caching:存储编译的脚本,默认勾选;
Script:要运行的脚本;
脚本中可用参数说明:
vars:操作Jmeter变量
a) vars.get(“name”):从jmeter中获得变量值
b) vars.put(“key”,”value”):保存数据到jmeter变量中,如果变量不存在会自动创建
props: 操作Jmeter属性
a) props.get(“START.HMS”); 注:START.HMS为属性名
b) props.put(“PROP1”,”1234”); 保存数据到Jmeter属性中,如果属性不存在会自动创建
log: 记录日志
比如log.info(“日志信息”); 具体查看: https://www.slf4j.org/api/org/slf4j/Logger.html
ctx: 操作上下文,具体查看:
http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html
prev: 操作前一个请求。注意必须有前一个请求才可用,否则会报错,具体查看:
http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
sampler: 操作当前请求。具体查看:
http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html
BeanShell PreProcessor
BeanShell预处理器,语法使用与BeanShell Sampler是一样的。但可使用的内置变量稍有不同;
参数配置:
Reset bsh interpreter beford each call:是否重新构造interpreter,即是否重新初始化
Paraneters:BeanShell 脚本中的变量初始化时可以在这里指定值,这里接受变量与字符串数组,如果是字符串数组两个元素之间用空格隔开
ScriptFile——File Name:指定运行的BeanShell脚本
Script:编写BeanShell脚本,通过BeanShell可以访问ctx、vars、props、prev、sample、log。其中通过ctx可以访问Jmeter运行时状态,比如线程数和线程状态;通过vars访问定义的变量;通过props访问运行时设置;通过prev访问前一个取样器结果;通过sample访问当前取样器;通过log写日志
5.7配置元件(Config Element)
jmeter的配置元件(config element)用于提供对静态数据的配置支持,可以为取样器设置默认值和变量。配置元件有很多的功能,读取文件数据,设置公共请求参数,赋予变量值等,以便后续取样器使用(类似于项目中配置文件的作用,如数据、地址、数据库链接等进行配置)
例如:性能测试中为了模拟打了用户操作我们往往需要做参数化,jmeter的参数化可以通过配置元件来完成,理由csv Data Set Config(CSV数据文件设置)可以将本地数据文件形成数据池(Data Pool),它可以帮助我们从文件中读取测试数据
另外jmeter也提供了众多的函数来帮我们生产动态数据,(通过函数助手可以查看到)
基础须知:Jmeter各个元件的执行顺序为:配置元件->前置处理器->定时器->取样器->后置处理器->断言器->监听器。配置元件在Jmeter执行过程中,在相同作用域下肯定会被最先执行,使用过程中要严格遵守作用域问题。
5.7.1:信息头管理器
信息头管理器用来传输取样器信息头。使用规则:特别需要注意使用的作用域问题,分为3种。
1、如果整个测试计划下的所有取样器请求都一致,则在测试计划下添加,这样能做到整个测试计划下共享信息头。
2、如果在同一线程组下,所有取样器的请求头都用到了相同的某个值如:token等,那就在线程组下添加信息头管理器,这样同一线程组下的所有取样器都能传入相同的请求头了。
3、如果每个取样器的请求头不太一致,则在具体的取样器下添加。
通过下图进行下简单理解:
注意点:
(1)如果存在多个信息头管理器,则引用的信息头会进行叠加。如下例子:
【测试计划下添加的信息头】填入信息:token:12345678
【线程组1下添加的信息头】填入信息:Content-Type:application/json
则HTTP请求1-1会叠加这两个值,如图:
执行结果:
(2)如果存在多个信息头管理器,而且信息头管理器有变量名称重复了,只是作用域不一样,则会引用作用域小的变量,如下例子:
【测试计划下添加的信息头】填入信息:token:12345678
【线程组1下添加的信息头】填入一个与上相同的变量信息:token:abcdefg
则实际执行的时候,会引用作用域小的token,如图:
执行结果:
(3)如果存在多个信息头管理器,而且信息头管理器有变量名称重复了,作用域也一样,则会引用第一个信息头管理器的变量,如下例子:
【测试计划下添加的信息头1】填入信息:token:12345678
【测试计划下添加的信息头2】填入信息:token:abcdefgh
则实际执行的时候,得看哪个信息头管理器放在前面就引用哪个信息头的变量,该处是将【测试计划下添加的信息头1】放在前面,所以是引用到了token:12345678。如下图:
执行结果:引用的是前面的信息头
5.7.2、Cookie管理器
对于有些请求需要Cookie的时候,可以考虑加上这个配置元件,通常会在登录接口返回Cookie存储到客户端本地,使用该元件可以解决Cookie验证问题。
使用方式:直接添加即可,一般是添加到测试计划或者线程组下。
5.7.3:请求默认值
如果多个请求存在相同的部分,那么就可以将这些相同的部分抽取到【请求默认值】,在填写具体请求的时候,就可以省略请求默认值得信息不填,同样需要非常注意作用域问题。
例子:新建一个【HTTP请求默认值】,填写发起百度请求的信息,那么在实际发起百度请求的时候,就可以忽略这部分信息了。
执行结果如下:
5.7.4:用户定义的变量
主要用于进行参数化设计,但只适用于数据量比较少的参数化,大数量的参数化就不适用了,重要的事情每次都需要强调下:需要注意作用域的问题。
使用方法:添加元件后,填写变量信息即可,填写完后,就可以在作用域范围下的元件进行引用,如下图:
执行结果:
5.7.5CSV设置文件
用于进行批量参数化,有两种方式,第一种是Jmeter自带的CSV配置文件,第二种是插件管理器安装的Random CSV Data Set Config。
1、Jmeter自带的CSV配置文件:该元件只能按照提供的数据源文件按顺序取值。下面进行元件页面各项值的介绍。
(1)文件名:选择提供数据的文件,要选择.csv格式的文件
(2)文件编码:选择对文件的编码格式,一般选utf-8
(3)变量名称:给获取到的数据源数据取变量,要取多个数据,就要用英文下分号";"间隔
(4)忽略首行:选择True就是忽略数据源的首行,选择False就是不忽略
(5)其他选项:一般默认即可。
下面实际使用:
(1)准备CSV源文件:
(2)填写CSV参数化元件信息:
(3)引用参数化的值
执行结果:
注意事项:该CSV参数化元件只能按顺序取值,即:脚本一次执行下,只能在数据源文件从上往下取值,下面我给请求添加循环数看看现象。
执行结果:
有时候我们想要每次执行请求都能随机取数据源的某一条数据,那么这时候就需要用到第二种CSV参数化配置文件:Random CSV Data Set Config
2、Random CSV Data Set Config:该元件Jmeter不会自带,需要我们手动安装。
(1)打开插件管理器
(2)安装Random CSV Data Set
使用介绍
Filename:选择数据源文件路径
File encoding:选择编码格式,一般选择UTF-8
Delimeter:分隔符,默认即可
Variable names:给变量命名
Fist line is CSV header:如果第一行是表头,则勾选下
其他没介绍到的默认即可,不用关心
下面进行实际使用
(1)信息配置:
(2)执行结果:
5.8后置处理器(Post Processors)
用于对sampler发出请求后得到的服务器响应进行处理,一般用来提取响应中的特定数据(类似LoadRunner中的关联)。
例如:我们在做接口测试的时候,难免会遇到一个接口的请求参数是另一个接口的响应结果,这个时候就需要用到后置处理器来处理我们的请求参数,如系统登录成功后我们要回去sessionid,在后面业务操作中服务器会验证这个sessionid,获取sessionid的这个过程,就是用后置处理器中的正则表达式提取器来完成的
后置处理器常用于处理响应数据,提取某个值
路径:线程组(用户)->添加->后置处理器();我们可以清楚地看到JMeter5中共有11个后置处理器
Jeter自带的后置处理器,如下图所示。
5.8.1CSS/JQuery提取器
CSS/JQuery提取器,是通过css选择器定位页面元素并读取数据 。
1、我们先来看看这个 CSS/JQuery提取器 长得是啥样子,路径:线程组 > 添加 > 后置处理器 > CSS/JQuery提取器,如下图所示:
关键参数如下说明:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Apply to:
Main sample only 仅适用于主要样本
Sub-samples only 仅适用于子样本
Main sample and sub-samples 主要样本和子样本
JMeter Variable Name to use 用作Jmeter变量名称
Name of created variable:引用名称 也就是jmeter里面的变量
CSS Selector expression:CSS选择器表达式 CSS表达式
Attribute:属性 要提取的元素的属性。示例:<input type="checkbox" name="colors" value="blue" id="blue">蓝色<br>,那么这里的属性就是value,因为我们要提取blue
Match No.(0 for Random):匹配数字 0随机一个,否则索引(从1开始)
Default Value: 缺省值 在无法提取内容的情况下放入变量的值。
CSS选择器或JQuery选择器是Jmeter支持的两种语法,下面对其两种语法进行简单介绍
1、新建测试计划,线程组下添加访问 博客园主页的取样器,如下图所示:
2、然后再添加CSS/JQuery提取器,如下图所示:
其中CSS选择器表达式就按如下图的方法获取,如下图所示:
3、接着再添加一个取样器 用来确认是否提取到我们要提取的东西,提取出来的值用来传参,如下图所示:
4、配置好以后,点击“保存”,运行JMeter,查看表格结果(可以看到提取的路径就是我们要提取博客园的新闻路径),如下图所示:
实例2
1、新建测试计划,线程组下添加随机变量和访问 JMeter主页的取样器,如下图所示:
线程组
随机变量
取样器
然后再添加CSS/JQuery提取器,如下图所示:
接着再添加一个取样器 用来确认是否提取到我们要提取的东西,提取出来的值用来传参,如下图所示:
配置好以后,点击“保存”,运行JMeter,查看表格结果(可以看到提取的路径就是我们要提取博客园的新闻路径),如下图所示:
5.8.2 json提取器
JSON 提取器可以使用JSON-PATH语法从JSON格式的响应中提取数据。
该后处理器与正则表达式提取器非常相似。必须将其放置为HTTP Sampler或具有JSON响应的任何其他取样器的子级,可以以非常简单的方式提取JSON文本内容。
1、我们先来看看这个JSON提取器长得是啥样子,路径:线程组 > 添加 > 后置处理器 > JSON提取器,如下图所示:
关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Update Once Per Iteration:标识是否每轮迭代更新一次元素;
Apply to(应用范围):
Main sample and sub-samples:应用于主sample及子sample
Main sample only:默认的是这个,应用于主sample
Sub-samples only:应用于子sample
JMeter Variable Name to use:应用于变量命名的内容
Name of created Variable:保存的变量名,后面使用${Variable names}引用
JSON Path Expression:json表达式
Match No.(0 or Random):匹配的值是哪一个,默认不填写是获取符合条件的第一个,这个与正则表达式的类似(0为随机、N为获取第N个、-1获取所有)
Compute comcatemation var(suffix_ALL):如果发现许多结果,插件将使用“,”分隔符将它们连接起来,并将其存储在名为<variable name>_ALL的var中
Default Values:当没有获取到参数值时的默认值
实例
新建测试计划,线程组下添加天气预报接口取样器,如下图所示:
然后再在取样器下添加JSON提取器,如下图所示:
紧接着再添加一个取样器 度娘,用来获取提取的status,提取出来的值用来传参,如下图所示:
配置好以后,点击“保存”,运行JMeter,查看表格结果,如下图所示:
度娘请求结果:
5.8.3JSR223 后置处理程序
我们先来看看这个JSR223 后置处理程序长得是啥样子,路径:线程组 > 添加 > 后置处理器 > JSR223 后置处理程序,如下图所示:
关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
parameter:要传递到脚本文件或脚本的参数列表;
file name:用于执行的脚本文件,若没有脚本文件,将执行脚本;
Script:传递给JSR223执行的脚本;如果提供了脚本文件,则执行脚本文件,否则执行脚本。
5.8.4调试后置处理程序
调试后置处理程序,使用正则表达式为从另一个HTTP请求中提取的HTTP参数指定动态值,配合regular expression extractor使用。暂时没找到好的例子,后面想到补充。。
1、我们先来看看这个调试后置处理程序长得是啥样子,路径:线程组 > 添加 > 后置处理器 > 调试后置处理程序,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Regular Expression Reference Name:调用的正则表达式提取器中的引用名称;
Parameter names regexp group number:用于提取参数名称的正则表达式的组编号;
Parameter values regex group number:用于提取参数值的正则表达式的组编号。
5.8.5JDBC 后置处理程序
JDBC 后置处理程序,实际上JIBC PostProcessor就是一个JDBC Request,它与JDBC Request功能相同,都可以执行SQL语句。在测试的过程中可能会遇到这样的测试场景:我们用JDBC Request修改了一些数据,当测试完成后,我们希望还原到原先状态,此时我们可以用JDBC PostProcessor来完成,当然用JDBC Request也可以完成。具体的JDBC PostProcessor的使用参考宏哥关于JDBC Request的这篇文章:Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)。
我们先来看看这个JDBC 后置处理程序长得是啥样子,路径:线程组 > 添加 > 后置处理器 > JDBC 后置处理程序,如下图所示:
5.8.6结果状态处理器
结果状态处理器,实际上在测试的时候我们也经常会遇到这样的测试场景:在一些测试用例失败之后我们需要进行一些操作,例如停止测试,这里可以使用结果状态处理器。
1、我们先来看看这个结果状态处理器长得是啥样子,路径:线程组 > 添加 > 后置处理器 > 结果状态处理器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Language:语言,开发脚本选择的语言,使用的JSR223语言,可根据需要选择;
Parameters:参数,传递给脚本的参数;
File Name:文件名,本地开发的脚本文件(会覆盖在JMeter里编写的脚本);
Script compilation caching:存储编译的脚本,默认勾选;
Script:要运行脚本。编写脚本的区域。
5.8.7XPath提取器
Xpath提取器,如果请求返回的消息为xml或html格式的,可以用XPath提取器来提取需要的数据。
1、我们先来看看这个 Xpath提取器长得是啥样子,路径:线程组 > 添加 > 后置处理器 > Xpath提取器,如下图所示:
2、关键参数说明如下:
APPly to:作用范围(返回内容的断言范围)
Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
Main sample only:仅作用于父节点的取样器
Sub-samples only:仅作用于子节点的取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
XML Parsing Options:要解析的XML参数
UseTidy:当需要处理的页面是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表达式。语法参考:XPath
匹配数字:取第几个匹配结果,0随机,-1全部,1代表第一个,2代表第二个,....以此类推
Default Value:参数的默认值。
实例:
1、新建测试计划,线程组下添加1个取样器 天气预报,如下图所示:
2、天气预报返回HTML,然后再添加xpath提取器,如下图所示:
举例://div[@class='w_city city_guonei']//a/@href
选取div下带有class属性为w_city city_guonei的href属性节点。
注释://div选取了div节点的所有子节点
@选取属性
/@href 从根节点选取所有的href属性
Xpath提取器设置
继续添加GetWeatherInfo取样器,获取xpath提取到的参数,如下图所示:
配置好以后,点击“保存”,运行JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔3s),如下图所示:
5.8.8XPath2 Extractor
Xpath2提取器,虽然JMeter官方文档说可以使用XPath2查询语言从结构化响应(XML或(X)HTML)中提取值,但目前测试只支持从XML响应中提取值;从HTML中提取会报错,这个可以通过查看结果树中选择XPath2 Tester来验证。
1、我们先来看看这个 Xpath2提取器长得是啥样子,路径:线程组 > 添加 > 前置处理器 > Xpath2提取器,如下图所示:
2、关键参数说明如下:
APPly to:作用范围(返回内容的断言范围)
Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
Main sample only:仅作用于父节点的取样器
Sub-samples only:仅作用于子节点的取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
Return entire XPath fragment of text content:返回文本内容的整个XPath片段;
Name of created variable:存放提取出的值的参数。
XPath Query:用于提取值的XPath表达式。
Match No 匹配数字:取第几个匹配结果,0随机,-1全部,1代表第一个,2代表第二个,....以此类推
Default Value:参数的默认值。
Namespaces aliases list:命名空间别名列表。就是这个功能,能让使用命名空间比使用旧的XPath提取器更方便。关于命名空间含义,可以看官方文档:XML 命名空间,但是写的不够详细,详细的参考这里:XML 命名空间(XML Namespaces)介绍以及节点读取方法。由于XPath2对于表达式的要求比较严格,对于带命名空间的XML(包括默认的命名空间),使用不带命名空间前缀的表达式是查询不到结果的。
5.8.9BeanShell 后置处理程序
BeanShell 后置处理程序,如果请求返回的消息为xml或html格式的,可以用XPath2提取器来提取需要的数据。这个估计是JMeter5.0新加的吧,具体用法和Xpath提取器的应该差不多的,可以参考上边Xpath提取器的用法。
1、我们先来看看这个 BeanShell 后置处理程序长得是啥样子,路径:线程组 > 添加 > 后置处理器 > BeanShell 后置处理程序,如下图所示:
2、关键参数说明如下:
Reset bsh.Interpreter before each call: 每次迭代是否重置解释器
Reset Interpreter :false
Parameters to be passed to BeanShell(=>String Parameters and String []bsh.args) 参数传递,字符串或者数组
Parameters:
Script file(overrides script): 脚本文件
File Name:
Script(variables:ctx vars props prev data log): 脚本编辑()
实例:
列举一个简单的例子,响应结果中有中文乱码,使用BeanShell 后置处理程序来处理中文乱码。
1、新建测试计划,线程组下添加1个取样器 访问度娘,如下图所示:
https://www.cnblogs.com/du-hong/p/13217399.html
然后再添加BeanShell 后置处理程序,设置脚本:prev.setDataEncoding("UTF-8"); ,如下图所示:
3、配置好以后,点击“保存”,运行JMeter,禁用BeanShell 后置处理程序,查看表格结果(中文乱码),如下图所示:
(1)禁用BeanShell 后置处理程序,查看表格结果(有中文乱码)
(2)启用BeanShell 后置处理程序,查看表格结果(无中文乱码)
5.9断言 (Assertions)
断言时自动化测试中最重要且绕不开的一个概念,让自己的程序尽可能像人一样去做判断,这是自动化测试需要实现的重要功能
JMeter中的断言用于检查测试中得到的响应数据等是否符合预期,Assertions一般用来设置检查点,用以保证性能测试过程中数据交互与预期一致(它的作用和LoadRunner中的检查点类似)
JMeter中断言的原理:在Request的返回层面,增加一层判断机制,因为Request成功了,并不代码结果一定正确
一个Sampler可以添加多个断言,根据你的检查需求来添加相应的断言,多个断言属于并的操作。当Sampler下所有的断言都通过了,那么才算是请求成功
JMeter自带的断言,如下图所示:
5.10监听器(Listener)
JMeter中的监听器,是对测试结果进行处理和可视化 展示的一系列组件,能够显示取样器请求和响应的细节以及请求结果,包括消息头,请求的数据,响应的数据
常用的监听器有图形结果、查看结果树、集合报告等
1. 监听器放的位置不同,查看的结果也不同。 在线程组下添加监听器,查看线程组下所有请求的结果; 放在具体某个请求下,只查看此请求的结果; 若放在某个控制器节点下,则查看此控制器下节点执行的结果;
2. 该监听器推荐做调试用,在实际运行压测时,应该禁用。因为大量 请求时,启用监听器时打印的日志比较多,会造成大IO消耗,影响 压力机性能。
3. 不同的监听器,通过不同的方式,展示服务器响应信息,但是它们 原始结果数据都是一样的。
4. JMeter监听器有两种方式存储监听记录:
1)默认保存方式:CSV格式。占用磁盘比较少,推荐使用这种方式 保存。
2) 保存方式:保存数据最全面,但是占用内存大。 JMeter自带的监听器,如下图所示:
JMeter自带的监听器,如下图所示
5.10.1 察看结果树
察看结果树,显示取样器请求和响应的细节以及请求结果,包括消息头,请求的数据,响应的数据。
(1)察看结果树,放的位置不同,查看的结果也不同。在线程组下添加察看结果树,查看线程组下所有请求的结果;放在具体某个请求下,只查看此请求的结果;若放在某个控制器节点下,则查看此控制器下节点执行的结果;
(2)该监听器推荐做调试用,在实际运行压测时,应该禁用,因为大量请求时,启用该监听器时打印的日志比较多,会造成大IO消耗,影响压力机性能。
1、我们先来看看这个 察看结果树 长得是啥样子,路径:线程组 > 添加 > 监听器 > 察看结果树,如下图所示:
2、关键参数说明如下:
名称:控制器的描述性名称,显示在左边节点上,并用于命名事务
注释:控制器注释信息,非必填项
文件名:载入文件名
Log/Display Only: 仅日志错误、Success ;勾选中显示对应的日志信息
Configure:定义report中自己所关心的数据项。
取样器结果:
Thread Name: 线组名称
Sample Start: 启动开始时间
Load time: 加载时长
Latency: 等待时长
Size in bytes: 发送的数据总大小
Headers size in bytes: 发送头大小
Body size in bytes: 发送数据的其余部分大小
Sample Count: 发送统计
Error Count: 错误统计
Response code: 返回码
Response message: 返回消息
Response headers:返回头信息
请求
数据获取方式、路径、地址等以及传递的参数、cookie
响应数据
响应加载的页面html
3、作用
1)查看请求结果,请求成功的测试通常为绿色;红色则代表失败。
注:在没有对请求断言的情况下,显示绿色并不一定是成功,只代表响应码是200或300系列,显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。
2)查看对应Sampler的测试结果的请求、响应数据。
-
-
- 取样器结果:显示的是取样器相关参数(客户端参数与响应参数)
- 请求:发送请求的具体内容
- 响应数据:服务器返回的相应参数
-
5.10.2 汇总报告
汇总报告,为测试中的每个不同命名的请求创建一个表行。这与聚合报告类似,只是它使用更少的内存。提供了最简要的测试结果信息,同时可以配置将相应的信息保存至指定的文件中(支持xml、csv格式的文件)。
单击Configure按钮,可以配置结果保存各种选项,具体这里不做说明了。
该监听器是笔者在调试jmeter项目时常用的监听器之一。
1、我们先来看看这个 汇总报告 长得是啥样子,路径:线程组 > 添加 > 监听器 > 汇总报告,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Label 取样器别名,如果勾选Include group name ,则会添加线程组的名称作为前缀
# Samples 取样器运行次数
Average 请求(事务)的平均响应时间
Min 请求的最小响应时间
Max 请求的最大响应时间
Std. Dev 响应时间的标准方差
Error % 事务错误率
Throughput 吞吐量 也就是TPS
Received KB/sec 每秒收到的千字节
Sent KB/sec 每秒发送的千字节
Avg. Bytes 响应平均流量
5.10.3聚合报告
聚合报告,记录这次性能测试的总请求数、错误率、用户响应时间(中间值、90%、最少、最大)、吞吐量等,用以帮助分析被测试系统的性能。在聚合报告中,各个响应时间不能超过客户的要求,就是合格,例如不能超过响应时间2s,大于2s就是不合格的.
聚合报告应该是最详细的报告了,也是最为常用的报告。是大家在压测过程中最常用的监听器。
该监听器对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,中位数、90%、95%、错误率,吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量。
单击Configure按钮,可以配置结果保存各种选项,具体这里不做说明了。
1、我们先来看看这个 聚合报告 长得是啥样子,路径:线程组 > 添加 > 监听器 > 聚合报告,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Label :每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples :表示测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里就显示对应的 HTTP Request的执行次数是100
Average :平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
Median :50%用户的响应时间
90%Line :90%用户的响应时间
Min :最少响应时间
Max :最大响应时间
Error% :本次运行测试中出现错误的请求的数量/请求的总数
Throughput :吞吐量,默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
接收/发送)KB/sec :每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
5.10.4 后端监听器
后端监听器,是一个异步侦听器,可以将数据推入到数据库中,提供了InfluxDB,graphite选项
1、我们先来看看这个 后端监听器 长得是啥样子,路径:线程组 > 添加 > 监听器 > 后端监听器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Backend Listener implementation:BackendListenerClient类的实现,Jmeter默认提供如下两种实现,因为我们使用的influxdb作为持久存储
org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient
org.apache.jmeter.visualizers.backend.graphite.InfluxdbBackendListenerClient 因为我们使用的influxdb作为持久存储,所以后续只介绍InfluxdbBackendListenerClient
Async Queue size:异步队列大小 队列值包含异步处理时的度量标准。除非有一些特定的性能问题,否则最好不要从默认的5000。
3、我们使用InfluxdbBackendListenerClient
-
-
- influxdbMetricsSender:org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender
- influxdbUrl:influx数据库的url。example : http://influxHost:8086/write?db=jmeter
- application:被测试的应用名称。此值也作为名为“application”的标记存储在“events”中
- measurement:使用默认的”jmeter“就行
- summaryOnly:为true的情况下,只输出所有请求的集合数据报告,为flase的情况下,输出每条数据的详情报告、
- samplersRegex:正则表达式将与样本名称匹配并发送到后端。默认匹配所有
- testTitle:测试名称。默认的设置为 Test name。该值作为名为“text”的字段存储在“事件”度量中。 JMeter在测试的开始和结束时自动生成一个注释,其值以'started'和'ended'结尾
- percentiles:要发送到后端的百分位数,多个值已
;
分割 - TAG_WhatEverYouWant:自定义标签。您可以根据需要添加任意数量的自定义标签。对于它们中的每一个,只需创建一个新行并在其名称前加“TAG_”
-
5.10.5汇总图
汇总图,我们可以看到表格显示的结果与图形结果,看着挺复杂,其实稍微翻译一下就知道,绝大多数都是对图形的设置。
1、我们先来看看这个 汇总图 长得是啥样子,路径:线程组 > 添加 > 监听器 > 汇总图,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Column settings
-
-
- Columns to display 选择要在图表中显示的列
- Rectangles color 单击右侧颜色矩形打开弹出对话框,选择自定义颜色。(就是点击
)
-
-
-
- Foreground color 允许更改值文本颜色
- Value font 允许定义文本的字体设置
- Draw outlines bar? 在条形图上绘制或不绘制边界线
- Show number grouping? 是否显示Y轴标签中的数字分组
- Value labels vertical? 更改值标签的方向。(默认为水平)
- Column label selection 按结果标签过滤
-
Title
图表的头部定义图表的标题
Graph size
根据当前JMeter窗口大小的宽度和高度计算图形大小。使用“ 宽度”和“ 高度”字段定义自定义大小。单位是像素。
X Axis settings
定义X轴标签的最大长度(以像素为单位)
Y Axis settings
为Y轴定义自定义最大值。
Legend
定义图表图例的放置和字体设置
5.10.6断言结果
断言结果,对相应的请求添加断言。对取样器进行断言后,我们希望知道断言结果;此元件可以帮助我们显示断言结果(察看结果树元件中也可以看到)。消耗了大量资源(内存和CPU),性能测试时候不建议使用。
作用:用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致,一般与结果树结合使用。
1、我们先来看看这个 断言结果 长得是啥样子,路径:线程组 > 添加 > 监听器 > 断言结果,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。
5.10.7比较断言可视化器
比较断言可视化器,和比较断言配合使用。
1、我们先来看看这个 比较断言可视化器 长得是啥样子,路径:线程组 > 添加 > 监听器 > 比较断言可视化器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。
5.10.8生成概要结果
生成概要结果,该测试元素可以放置在测试计划中的任何位置。生成到目前为止对日志文件和/或标准输出的测试运行的摘要。显示了运行总计和差异总计。在适当的时间边界每n秒(默认为30秒)生成一次输出,因此将同步在同一时间运行的多个测试。
1、我们先来看看这个 生成概要结果 长得是啥样子,路径:线程组 > 添加 > 监听器 > 生成概要结果,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。
5.10.9 图形结果
图形结果,通过图形展示出本次性能测试数据的分布。 图形结果一般作为聚合报告的分析辅佐
1、我们先来看看这个 图形结果 长得是啥样子,路径:线程组 > 添加 > 监听器 > 图形结果,如下图所示:
2、关键参数说明如下:
名称:控制器的描述性名称,显示在左边节点上,并用于命名事务
注释:控制器注释信息,非必填项
文件名:载入文件名
Throught:吞吐量,可以理解成TPS(TPS表示每秒通过的事物数,QPS表示每秒查询接口数。jmeter中如果只有单接口,那么TPS=QPS。如果是多接口的混合场景,只有在事物控制器下执行,才能将其理解为TPS)
-
-
-
样本数目。在这里,我们可以把样本数量简单理解成是jmeter一共向服务器发起了多少次请求;
-
最新样本。jmeter最后一次发送请求的响应时间。单位是毫秒;
-
平均。所有请求响应时间的平均值。单位是毫秒;
-
偏离。标准方差,学过统计学的同学应该知道这个概念。如果你对这个概念一无所知也没有关系,偏离越小就代表测试的总体结果与平均值越接近;
-
吞吐量。被测系统每分钟能处理的请求个数,这是判断服务器性能好坏的重要指标(也可以说是最重要的指标)。在上面的图形结果报表里我们可以看到系统的吞吐量是138.985每分钟,这就代表着系统每分钟可以处理138.985个请求;
-
中值。就是响应时间的中间值,学术一点中值指的是有50%的值大于这个值,另外50%的值小于这个值。蒙圈了吧?实际上中值指的是如果有9个数,那么我们从小到大排列这些数,排在第5个的数就是这一组数的中值。那么如果有10个数呢?10个数的话第5个和第6个数的平均值就是这组数字的中值;
-
-
5.10.10 JSR223 Listener
SR223 Listener,允许将JSR223脚本代码应用于示例结果。
1、我们先来看看这个 SR223 Listener 长得是啥样子,路径:线程组 > 添加 > 监听器 > JSR223 Listener,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Label 取样器别名,如果勾选Include group name ,则会添加线程组的名称作为前缀
# Samples 取样器运行次数
Average 请求(事务)的平均响应时间
Min 请求的最小响应时间
Max 请求的最大响应时间
Std. Dev 响应时间的标准方差
Error % 事务错误率
Throughput 吞吐量 也就是TPS
Received KB/sec 每秒收到的千字节
Sent KB/sec 每秒发送的千字节
Avg. Bytes 响应平均流量
5.10.11邮件观察仪
邮件观察仪, 如果测试运行从服务器收到太多失败的响应,则可以将邮件程序可视化工具设置为发送电子邮件,这个不错,起到及时通知效果,下面我使用的是163 SMTP进行测试。可以实现。
1、我们先来看看这个 邮件观察仪 长得是啥样子,路径:线程组 > 添加 > 监听器 > 邮件观察仪,如下图所示:
2、配置好以后,点击“Test Mail”,提示发送邮件成功。如下图所示
3、去收件箱查看,如下图所示:
5.10.12响应时间图
响应时间图,响应时间图形监听器。有点和我们之前介绍的Aggregate Graph类似
1、我们先来看看这个 响应时间图长得是啥样子,路径:线程组 > 添加 > 监听器 > 响应时间图,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
2.1 Graph setting 图片设置
2.2 Interval:横坐标的刻度
2.3 Title 标题 默认
2.4 Line setting 线条设置 默认
2.5 Graph size 图片尺寸 默认
2.6 X Axis 横坐标 默认
2.7 Y Aixs 纵坐标
2.8 Scale maximum value 纵坐标长度
2.9 increment scale 纵坐标的刻度 ;Legend 字体设置 默认
- Interval (ms) X轴间隔的时间(以毫秒为单位)
- Sampler label selection 按结果标签过滤。可以使用正则表达式
- Title 在图表的头部定义图表的标题
- Line settings 定义线条的宽度
- Graph size 根据当前JMeter窗口大小的宽度和高度计算图形大小。使用“ 宽度”和“ 高度”字段定义自定义大小。单位是像素。
- X Axis settings 自定义X轴标签的日期格式
- Y Axis settings 为Y轴定义自定义最大值(以毫秒为单位)
- Legend 定义图表图例的放置和字体设置
5.10.13保存响应到文件
保存响应到文件,我们可以看到表格显示的结果与图形结果,看着挺复杂,其实稍微翻译一下就知道,绝大多数都是对图形的设置。
1、我们先来看看这个 保存响应到文件 长得是啥样子,路径:线程组 > 添加 > 监听器 > 保存响应到文件,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
文件名称前缀:设置响应文件所在路径(路径必须已存在)和文件前缀
Save Failed Responses only:只保存失败的响应
Save Successful Responses only:只保留成功的响应
Don't add number to prefix:不添加数字到文件名前缀
Don't add suffix:不添加文件后缀,即扩展名(注:默认情况下,jmeter会根据服务器返回的结果自动生成合适类型的文件,比如服务器返回json格式的内容,jmter会自动生成.json文件)
Add timestamp:添加时间戳到文件前缀
Minimum Length of sequence number :最小序列号,不填默认从1开始。
5.10.14简单数据写入器
简单数据写入器,对用来记录取样器响应结果,不会以图形方式显示。配合NON GUI模式使用。
1、我们先来看看这个 简单数据写入器 长得是啥样子,路径:线程组 > 添加 > 监听器 > 简单数据写入器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。
5.10.15用表格查看结果
用表格查看结果,这个listener用来显示每个请求的响应头信息,我觉得它最好用的一点就是可以按先后顺序显示每个请求的开始时间、耗时、响应状态等,方便进行结果分析。
1、我们先来看看这个 用表格查看结果 长得是啥样子,路径:线程组 > 添加 > 监听器 > 用表格查看结果,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。
Sample # : 一个系列号,我们线程用户设置了5,这里就有5个号
Start Time:每个用户的开始时间,我们设置了1秒进5个用户,所以,每个用户进入时间不同,这里精确到毫秒。
Thread Name:线程名称,注意1-1,1-5,第一个1我也不知道表示什么,后面的1到5很好理解,就是用户1到用户5.
Label:就是Http reques的名称
Sampler Time:运行这个Sampler所消耗的时间,有时候也等于Duration time
Status:执行结果标记,成本绿勾,失败红叉。
Bytes:请求的响应文件大小
Sent Byte:发送HTTP请求的数据包大小
Latency:这个字面意思是潜伏时间,不是延迟,暂时不好理解和解释。一个网络术语
Connet Time: 连接到服务器消耗的时间。
5.10.16BeanShell Listener
BeanShell Listener,通过BeanShell 监听器可以访问JMeter提供的属性和变量
1、我们先来看看这个 BeanShell Listener 长得是啥样子,路径:线程组 > 添加 > 监听器 > BeanShell Listener,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空。