编辑推荐: |
本文主要介绍了Jmeter性能测试相关知识。希望对你的学习有帮助。
本文来自于CSDN,由火龙果软件Linda编辑、推荐。 |
|
前言
性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据。
测试流程:
需求分析→环境搭建→测试计划→脚本开发→执行与监控→缺陷管理→结果与报告
压力测试
1、线程组设置,这里的线程数与同步定时器的用户数量一样
2、添加HTTP cookie管理器
3、默认请求值
4、添加一个事务控制器,可以当作一个业务
5、在事务控制器下添加,同步定时器
设置用户数量,这里与线程组的线程数一样,超时时间可设置
6、添加脚本(http请求)
7、添加查看结果树
8、添加->监听器
9、在最后添加一个聚合报告,添加处:添加->监听器
负载测试实战
1、线程组的设置50个用户(持续时间:按秒计算,这里300=60*5,意思就是运行时长为5分钟)
2、添加HTTP cookie管理器
3、默认请求值
4、添加一个事务控制器,可以当作一个业务
5、在事务控制器下添加,高斯随机定时器
总的延时 = 固定延迟时间 + 高斯随机生成的偏差值(说明:单位都是毫秒,固定延迟300ms,偏差100ms,意思是时间延迟300-400ms之间)
6、添加脚本(http请求)
7、添加->监听器
8、在最后添加一个聚合报告,添加处:添加->监听器
第一章 Bug引发的又一次思考
1. 介绍
目录
性能测试认知主要内容
什么是性能测试?
性能测试分类
性能测试指标
性能测试的基本流程
jmeter性能测试工具
jmeter的介绍与组成
jmeter工具的多并发请求
jmeter工具脚本开发的精要技巧
linux与MySQL的性能理解
linux服务器性能监控指标与分析
MySQL数据库性能指标分析
学习目标
掌握性能测试的基本流程
掌握性能测试工具jmeter的基本使用
掌握性能指标所代表的的含义
掌握性能监控的基本命令
了解慢查询的含义
掌握海量数据下的数据库优化方案
2. 打开一个页面非常慢是Bug吗
打开一个页面非常慢是Bug吗
可能是,原因:网络慢、客户端运算能力不足、资源大到现有的网络无法承载、服务端资源响应时间过长。
页面打开慢的影响是什么?
用户体验不好,从而导致用户流失
用户流失会导致项目失败
项目失败可能会导致公司破产
3. 页面响应耗时可以提前预知吗?
在测试阶段是否能够发现页面响应慢
当然可以
如何在测试阶段发现页面响应慢?
模拟大量用户访问
监控每个请求的响应是否准确
监控服务器的资源使用
第2章 性能测试认知
1. 企业级软件为什么要做性能测试
历史上由于性能问题引发的事件
12306网站崩溃,用户购票失败
淘宝双十一网站崩溃
网站崩溃或慢对用户的影响
离开
企业为什么要做性能测试?
提升用户体验
细化性能测试的目的
预估软件性能瓶顶,预估软件优化时间
验证是否存在多并发的逻辑问题
2. 什么是性能测试? 
性能是用来描述产品除功能外的所具有的速度,效率和能力的综合能力评价
对产品或是物品的性能惊喜定性或是定量的量测过程
在这个过程中我们使用一些工具来进行场景的模拟,从而进行性能测试
3. 性能测试案例
测试需求:测试20个用户访问网站在负载达到30QPS时的平均响应时间
QPS:Query Per Second 每秒查询率。(一台查询服务器每秒能够处理的查询次数,作为域名服务器的性能经常用每秒查询率来衡量)
测试步骤
1、添加线程组(线程数+准备时长+循环次数)
1.1、线程数:虚拟用户数,一个虚拟用户占用一个进程或线程(设置多少个虚拟用户=设置多少个线程)
1.2、准备时长(s):设置的虚拟用户数需要多长时间全部启动。eg:线程数为20,准备时长为10,则说明需要10秒钟启动20个进程。
1.3、循环次数:每个线程发送请求的次数。eg:线程数为20,循环次数为5,那么每个线程发送5次请求,总请求数为20*5=100 
2、添加HTTP请求


3、设置QPS限制:控制给定的取样器发送请求的吞吐量


4、添加监视器-聚合报告、察看结果树



5、运行脚本 
6、聚合报告解析(响应时间单位:毫秒)
1)Label:每个Jmeter的element都有一个Name属性,这里显示的就是Name属性的值
2)#Sample:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
3)Average:平均响应时间-默认情况下是单个Request的平均响应时间当使用了Transaction
Controller 时,也可以以Transaction为单位显示平均响应时间
4)Median:中位数,50%用户的响应时间
5)90%Line:90%用户响应时间
6)Min:最小响应时间
7)Max:最大响应时间
8)Error%:本次测试中出现错误的请求的数量/请求的总数
9)Throughput:吞吐量-默认情况下白石每秒的请求数
10)KB/sec:每秒从服务器端接收到的数据量


4. 性能测试的分类
性能测试的分类
压力测试、负载测试、并发测试、稳定性测试
什么是压力测试?
压力测试也叫强度测试,它是指逐步给系统增加压力,测试系统的性能变化,使系统某些资源达到饱和或系统崩溃的边缘,从而确定系统所能承受的最大压力
举个例子:百米赛跑,逐步增加你的负重,直到你完不成百米的程度,也就是崩溃的边缘你所能承受的最大负重
什么是负载测试?
被测试系统正常服务的前提下,系统所能承担的最大服务负荷数量(即最大并发数量),最终分析出系统性能的瓶颈
举个例子:百米赛跑,设置必须15秒完成,负重奔跑(不断增加负重)
压力测试和负载测试的区别
压力测试要测试出系统即将崩溃时,能够承受的最大并发数
负载测试是满足系统指标要求的情况下,能够承受的最大并发数
什么是并发测试
举个例子:商场卖货,售后员根据库存表单记录表卖货
仓库管理员应该在出货时同时更新库存表单记录表,但由于用户过多,表单记录更新不及时
导致仓库已经没有货了,但是售货员看到库存表单记录表中还显示有库存,仍然在卖货,但已经发不出去货了
5. 性能测试场景剖析
电商秒杀、学习系统考试、12306抢票、新闻热点事件、
网络游戏运营、视频网站播放
6. 必知必会的性能测试指标
并发用户量:同一单位时间进行同一操作的用户数量
吞吐量:单位时间内系统成功传输的数据量,单位通常是MB、GB
吞吐率:又叫Throughput,单位时间内系统成功处理的请求数量,通常单位为(请求数量/每秒、req/s)
7. 性能测试基本流程
标准性能测试流程 
8. 简述 性能测试流程?
1.分析性能需求。挑选用户使用最频繁的场景来测试,比如:登陆,搜索,下单等等。确定性能指标,比如:事务通过率为100%,TOP99%是5秒,最大并发用户为1000人,CPU和内存的使用率在70%以下
2.制定性能测试计划,明确测试时间(通常在功能稳定后,如第一轮测试后进行)和测试环境和测试工具
3.编写测试用例
4.搭建测试环境,准备好测试数据
5.编写性能测试脚本
6.性能测试脚本调优。设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余脚本
7.设计测试场景,运行测试脚本,监控服务器,
8.分析测试结果,收集相关的日志提单给开发
9.回归性能测试
10.编写测试报告
第三章. JMeter测试工具篇
目录
JMeter介绍与安装
JMeter介绍与安装
JMeter的组成结构
第一个性能测试案例
JMeter模拟多用户同时发送请求
逻辑分支控制
配置管理
发送请求的设置
JMeter脚本开发精要技巧
关联、断言、参数化、数据监控
1. JMeter介绍与安装
JMeter介绍
JMeter是Apache组织开发的基于Java的压力测试工具。具有开源免费、框架灵活、多平台支持等优势。除了压力测试外,JMeter也可以应用的接口测试上。
JMeter下载、安装及启动
下载:
访问JMeter官网:https://jmeter.apache.org/download_jmeter.cgi

点击下载windows版本apache-jmeter-5.1.1.zip
安装:
解压到D盘即可使用,目录结构:
bin目录:启动命令
jmeter.bat 在Windows可启动的批处理文件
jmeter.sh 在Linux可执行的shell脚本
jmeter.properties: 核心配置文件(配置中文编码)
lib目录:存放Jmeter依赖的jar包,同时安装插件放于lib中的ext目录中

启动:
进入bin目录,双击jmeter.bat文件即可启动jmeter
(如果打不开,则说明其工作环境JDK没搭建好,原因:JMeter需要基于Java环境)
在dos中进入到apache-jmeter的bin目录中,然后执行命令:jmeter也可以启动
3、配置jmeter工作环境
方式:安装jdk并配置环境变量
1)安装jdk,要求是1.8级以上版本
在安装jdk的过程中,记得把路径复制一份,方便后面使用。
2)配置jdk的系统环境变量:
a》java_home:jdk的安装路径,(需要新建)
b》path:增加jdk的工作目录bin ( %java_home%\bin; )
(只需编辑,往里添加工作路径)
3)验证:
A、在dos中输入命令:javac,显示javac命令的格式及选项
B、启动bin目录中jmeter.bat能正常打开。
设置界面为简体中文,如下:

2、使用JMeter来做接口功能测试
过程:测试计划-》线程组-》http请求-》响应断言-》断言结果-》参看结果树!

其中测试计划是自带的。
测试计划:相当于项目,某某项目-测试计划
添加线程组:相当于功能点、或者接口,某某接口-线程组
在“测试计划”上右键–>添加–>线程(用户)–>线程组。

然后可以对线程组进行设置(一般在做性能测试时才需要去设置,接口几乎不用)
线程组参数详解:
名称:根据业务来设置合适名称,接口测试就是接口名称,性能测试就是功能点2. 遇错误的动作:默认“继续”,忽略错误继续完成请求3.
线程数:虚拟用户数,默认是1个,一个用户占用一个线程。多用户并发测试时就需要在这里设置并发用户数,也就是设置多少个线程数。
Ramp-Up 时间(秒):启动所有虚拟用户所需的时间。含义如下: 比如:如果线程数为10,启动时长为2秒,那就意味着2秒内需启动10个用户,平均下来就是每秒启动5个用户。启动时间为0,则代表同时启动
,并发。
循环次数:每个用户发送请求的次数,好比参数化。如果线程数为10,循环次数为5, 那么每个线程(用户)发送5次请求。总请求数为10*5=50
如果勾选了“永远”, 那么所有线程会一直发送请求,直到手动停止运行或者设置了调度器。
调度器:设置线程组启动的持续时间和延迟时间(调度器需勾选循环次数为永远才有效) 持续时间(秒):测试持续的时间:24小时=24*3600秒
启动延迟(秒):测试延迟启动的时间
添加HTTP请求:相当于测试用例中的测试步骤,某某-HTTP请求
在“线程组”上右键–>添加–>取样器–>HTTP请求 
设置HTTP请求信息:
基本》
2.1. Web服务器
协议:向目标服务器发送HTTP请求的协议,可以是HTTP或HTTPS,默认为HTTP
服务器名称或IP :HTTP请求发送到的目标服务器名称或IP ,比如:www.jd.com
端口号:目标服务器的端口号,默认值为80 ,可以不写,https为443。
注意: “ 服务器名称或IP”中不用输入http://, 请求时会自动加入 ;
2.2. Http请求
方法:发送HTTP请求的方法,包括GET、POST等。
路径:目标URL路径(服务器名称与参数之间的部分)
内容编码 :编码方式默认值为iso8859,改为utf-8支持中文。跟随重定向:当HTTP请求的响应是302/301时,JMeter会跟随重定向到目标页面。
使用keepAlive :jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信保持长
连接,减少连接的次数,进而缩短了连接时间****
2.3. 请求参数
A)参数: get请求所携带的数据列表,名值对 (同请求一起发送参数)
B)消息体数据: post请求所携带的请求数据是json格式数据,类似于字典
C)文件上传: post请求本地文件上传,文件类型一定是file说明:所添加的参数中有中文时需要勾选“编码”
Http请求 示例 : https://www.jd.com/,打开京东首页get请求

3. 添加响应断言
在“HTTP请求”上右键–>添加–>断言–>响应断言(检查请求后的响应是否正确)

需要设置的断言的内容:

包括:适用范围(那个请求),响应的字段,匹配规则以及添加要检查的测试模式
3.1、apply to: 表达的是断言那个请求,默认是只断言主请求(main sample only)
3.2、测试字段: 表达的是断言的内容,有响应文本,响应代码,响应信息等等,一般都是断言响应文本
3.3、模式匹配规则: 表达的是断言的方式,有包括、匹配、相等等等,一般使用包括或者相等
3.4、测试模式: 根据业务来编写,可以理解为我们的预期结果
4. 添加断言结果
在“HTTP请求”上右键 -> “添加”-> “监听器” -> “断言结果” ,查看断言的结果

【断言】又名:检查点
含义: 检查预期数据与实际数据是否匹配
方式: 先添加响应断言再添加断言结果,是一个组合
断言成功 : 断言结果只有一行,为请求的名称,则表示成功。
断言失败 :断言结果有两行,第二行显示失败的原因。
5. 察看结果树 目的是查看请求发送后 的结果:
在“HTTP请求”上右键–>添加–>监听器–>察看结果树

点击发送请求,结果如下:


第四章 JMeter模拟多用户同时发送请求
1、一个简单的压力测试实战
现有一个http请求接口http://localhost:8080/goods/to_list, 要使用Jmeter对其进行压测,测试步骤如下:
a.新建一个线程组。

b. 设置线程组参数。这里配置为:10个线程,同时启动,循环一次。

c. 新增http请求默认值。
在上一步创建的线程组上,新增http请求默认值,所有的请求都会使用设置的默认值,这设置协议为http,IP为localhost,端口为8080。


d. 添加要压测的http请求。

下图第一个红框内的协议、IP、端口不需要设置,会使用步骤c中设置的默认值,只需设置请求路径Path即可,这里填入/goods/to_list。

e. 新增监听器,用于查看压测结果。这里添加三种:聚合报告、图形结果、用表格查看结果,区别在于结果展现形式不同。

f.
点击运行按钮开始压测,并查看结果。

五、如何查看系统负载何性能瓶颈
服务器上执行以下命令:
如下图所示,可以看到系统负载load average情况,1分钟平均负载,5分钟平均负载,15分钟平均负载分别是1.58,
0.50, 0.23;同时可以看到最耗费资源的进程为mysql。

2、如何创建带参数的请求
1. 首先新建一个http请求。 
2.设置请求路径,并添加参数。 如下图所示,Path中填写请求路径,点击Add添加参数,有一个名为token的参数。

至此给带参数请求已创建完成,点击运行即可开始压测。
3、如何模拟设置多个变量,模拟多个用户请求接口
新建Csv Data Set Config设置。

2.新建配置文件config.txt,配置用户信息。 文件名随便写,里面数据每行有两个值,userId和userToken,中间用逗号隔开,我这里设置了两个用户的信息。

3.引用配置文件。
Csv Data Set Config中引用配置文件config.txt,并定义变量名为userId和userToken。

4.请求中引用配置文件中的变量。
在填写参数Value的地方不要将值写死,而是写为变量名这种格式,我这里想要引用配置文件中 u s e
r T o k e n 的值,所以写为 {变量名}这种格式,我这里想要引用配置文件中userToken的值,所以写为变量名这种格式,我这里想要引用配置文件中userToken的值,所以写为{userToken}。

至此配置完毕,点击运行按钮,即可开始压测。
3. jmeter模拟多用户并发
一. 100个真实的用户
一个账号模拟100虚拟用户同时登录和100账号同时登录
区别
1个账号100个人用,同时登录;
100个人100个账号,同时登录。
相同
两个都是100人同时登录,具体看项目需求。
账号来源
利用“注册”或“创建”账号接口,创建100个用户;
“查询”接口,保存100个账号的账号、密码到一个文件。
3、提取100个账号、密码的文件
meter脚本整体布局
线程组(一级)---->请求默认值、请求头、http请求、察看结果树(二级)----->正则表达式、BeanShell
后置处理程序(三级)。
HTTP请求默认值:是存放系统通用ip的位置(协议:http; 服务名称或ip:127.0.0.1);
HTTP信息头管理:接口请求之前需要带的信息,部分接口不带不能运行(Authorization、Content-Type、Accept、User-Agent),例如必须带的token就在信息头中存放;
登录请求:请求方法、请求路径、消息体;正则表达式提取token
创建请求:请求方法、请求路径、消息体;参数化用户名,创建多个用户;
查询账号:请求方法、请求路径、消息体;正则表达式提取用户名、密码;BeanShell 后置处理程序存储返回值到文件中

(2)查询请求中的正则表达式和BeanShell
后置处理程序
正则表达提取----->获取想要的字段内容
(详看:https://blog.csdn.net/belief_009/article/details/123051440)

BeanShell 后置处理程序---->将提取到的字段内容存储在指定文件 4.csv中
FileWriter fs=new FileWriter("D://近期//4.csv",true);
BufferedWriter out =new BufferedWriter(fs);
out.write(vars.get("username")+","+vars.get("id"));
//username、id为正则定义名称
out.write(System.getProperty("line.separator"));
//相当于"\n"自动换行
out.close();
fs.close();
|

线程组线程数设置数目等于提取到的条数,执行脚本得到100个用户的账号和密码

二、100个用户同时登录
设置线程组
线程数:并发用户数
Ramp-up时间(秒):启动所有线程所需要的时长
0---->代表同时并发;
100---->线程数100,时间100秒。代表每隔1s启动一个线程(100/100=1)
循环次数:Loop Count
默认值是1;
2---->线程数100,循环次数2。代表启动200个线程;
勾选“永远”,会一直执行,需要人工停止,一般配合调度器使用。

补充:同步定时器:
作用:阻塞线程,直到指定的线程数量到达后,在一起释放,可以瞬间产生很大的压力;
使用同步定时器时,循环次数要勾选为永远 
2. 模拟多用户登录
线程组下添加----->CSV 数据文件设置
将存储用户账号、密码的文件引入,并命名变量名称,在登录时调用。

调用,传参${name}
注释:本系统账号密码一致,所以只需要调用一列值
/api/v1/oauth/token?username=${name}&password=${name}&scope=all&grant_type=password
|
执行测试,查看结果
100用户同时登录 
第五章. jmeter脚本开发
1. 脚本开发方式大纲

1、badboy进行录制和导出
badboy下载地址:
链接:https://pan.baidu.com/s/18Po3RssrBRSnn_-xsHop1g
提取码:h4w4
直接解压就可以使用,在界面上输入对应录制的url进行操作,录制完成后导出为:export to jmeter,在jmeter中打开后即可对脚本进行优化
2、jmeter代理服务器

a、设置启动服务代理,在网络设置代理服务,如果为第三方服务器则写第三方服务器的IP而非本地IP(127.0.0.1)
b、打开jmeter,新建线程组,目的为了录制后的脚本有地方存放,目标控制器选择对应的主线程组,存放脚本,添加非测试元件:http代理服务器,点击启动后则可以进行录制,录制完成后停止,在线程组中回出现请求的录制脚本




c、可在http服务代理请求中排除模式使用正则表达式进行过滤

d、再次代理请求录制,已发现.png格式已被过滤掉了

3、进行fiddler抓包后导出jmx格式,在jmeter中打开后进行优化,抓包后选择对应的url进行备注,(选中url按M键备注)
下载fiddler插件后导出jmx
插件下载链接:
链接:https://pan.baidu.com/s/18uffy67lIfNatMGkjnC_2g
提取码:iy20


在jmeter中打开导出的文件,可以看到对应的备注url,进行录制脚本优化


工具是测试中的辅助并非必需品。
总结:
通过以上介绍的性能测试的思路和工具,我们基本上可以完成一次性能测试以及部分问题的性能定位,但是往往性能问题总是隐藏得很深的,并且受各种条件的影响,比如,各个环节的配置参数,网络情况,机器情况,性能测试的工具等等,所以,性能测试的结果往往不能脱离某个环境单独比较,不同的配置,环境,应用的性能都会呈现出不同的结果,出现问题时,也需要我们从前到后,从上到下仔细分析每一个流程的执行情况,逐步通过工具协助定位,才能最终找到瓶颈。总之,性能测试是一门考验耐心,细心,知识广度,
深度的活,每次遇到问题多问几个为什么,多做几次分析和验证,并尝试解决,优化它,一定会让你对系统有更多不一样的认识。
|