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,如果数据敏感不能做导出,可以确认数据库表的数据格式,创造测试数据
Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834软件测试初中高全栈精品系列课程https://edu.csdn.net/course/detail/39095
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在每次循环的第一次迭代时均会被执行
Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834软件测试初中高全栈精品系列课程https://edu.csdn.net/course/detail/39095
八、转换控制器(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个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序
十四、随机