Jmeter5.X性能测试
文章目录
- Jmeter5.X性能测试
- 一、掌握Http基础协议
- 1.1 浏览器的B/S架构和C/S架构
- 1.2 HyperText Transfer Protocol 超文本传输协议
- 1.3 超文本传输协议Http消息体拆分讲解
- 1.4 HTTP的九种请求方法和响应码介绍
- 1.5 Http请求头/响应头
- 1.6 Http常见请求/响应头content-type内容类型
- 二、性能测试工具Jmeter使用
- 2.1 Jmeter5.X基础功能组件+线程组
- 2.2 Jmeter聚合报告分析和多案例断言
- 2.3 CSV可变参数实战
- 2.4 高并发业务下Jmeter集合点应用实战
- 三、Jmeter二次开发之BeanShell实战
- 3.1 BeanShell的作用
- 3.2 BeanShell的使用
- 3.3 BeanShell响应JSON处理和自定义断言
- 3.4 Jmeter压测post方式接口和关联接口场景
- 四、BeanShell使用外部Java文件
- 五、Jmeter性能测试之html可视化压测报告
一、掌握Http基础协议
1.1 浏览器的B/S架构和C/S架构
-
什么是CS架构 客户机-服务器,即Client-Server(C/S)结构 但是缺少通用性,系统维护、升级需要重新设计和开发,增加了维护和管理的难度
-
什么是BS架构 B/S架构即浏览器和服务器架构模式,是WEB兴起后的一种网络架构模式 WEB浏览器是客户端最主要的应用软件 统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用
- 什么是URL(统⼀资源定位符,获取服务器资源的一种)
标准格式: 协议://服务器IP:端⼝/路径1/路径N ? key1=value1 & key2=value2
https://editor.****.net/md/?articleId=142419810
1.2 HyperText Transfer Protocol 超文本传输协议
什么是Http超文本传输协议
协议是⼀种约定,规定好⼀种信息的格式,如果发送⽅按照这种请求格式发送信息,那么接 收端就要按照这样的格式解析数据,这就是协议
JSON
{
"name":"xiaoming",
"age":23
}
xml协议
<user>
<name> xiaoming </name>
<age> 12 </age>
</user>
http超文本传输协议
- 什么是http协议
即超⽂本传送协议(Hypertext Transfer Protocol ),是Web联⽹的基础,也是⼿机PC联⽹常⽤的协议之⼀,HTTP协议是建⽴在TCP协议之上的⼀种应⽤
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,从建⽴连接到关闭连接的过程称为“⼀次连接”
HTTP请求-HTTP响应
- 响应码:
1xx:信息
2xx:成功 200 OK,请求正常
3xx:重定向
4xx:客户端错误 404 Not Found 服务器⽆法找到被请求的⻚⾯
5xx:服务器错误 503 Service Unavailable,服务器挂了或者不 可⽤
- 和https的关系
Hyper Text Transfer Protocol over SecureSocket Layer
主要由两部分组成:HTTP + SSL / TLS
比 HTTP 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性,增加破解成本
缺点:相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加额外的计算资源消耗,增加 10%到 20%的耗电等;不过利大于弊,所以Https是趋势,相关资源损耗也在持续下降
如果做软件压测:直接压测内网ip,通过压测公网域名,不管是http还是https,都会带来额外的损耗导致结果不准确
1.3 超文本传输协议Http消息体拆分讲解
Http请求消息结构
- 请求行
- 请求方法
- URL地址
- 协议名
- 请求头
- 报文头包含若干个属性 格式为“属性名:属性值”,
- 服务端据此获取客户端的基本信息
- 请求体
- 请求的参数,可以是json对象,也可以是前端表单生成的key=value&key=value的字符串
- 请求的参数,可以是json对象,也可以是前端表单生成的key=value&key=value的字符串
Http响应消息结构
- 响应行
- 报文协议及版本、状态码
- 响应头
- 报文头包含若干个属性 格式为“属性名:属性值”
- 响应正文
- 响应报文体,我们需要的内容,多种形式比如html、json、图片、视频文件等
1.4 HTTP的九种请求方法和响应码介绍
浏览器请求方法
- http1.0定义了三种:
- GET: 向服务器获取资源,比如常见的查询请求
- POST: 向服务器提交数据而发送的请求
- Head: 和get类似,返回的响应中没有具体的内容,用于获取报头
- http1.1定义了六种
- PUT:一般是用于更新请求,比如更新个人信息、商品信息全量更新
- PATCH:PUT 方法的补充,更新指定资源的部分数据
- DELETE:用于删除指定的资源
- OPTIONS: 获取服务器支持的HTTP请求方法,服务器性能、跨域检查等
- CONNECT: 方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户,网页开发基本不用这个方法,如果是http代理就会使用这个,让服务器代理用户去访问其他网页,类似中介
- TRACE:回显服务器收到的请求,主要用于测试或诊断
Http响应码
- 浏览器向服务器请求时,服务端响应的消息头里面有状态码,表示请求结果的状态
-
分类
-
1XX: 收到请求,需要请求者继续执行操作,比较少用
-
2XX: 请求成功,常用的 200
-
3XX: 重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取;
- 好处:网站改版、域名迁移等,多个域名指向同个主站导流
- 必须记住
- 301:永久性跳转,比如域名过期,换个域名
- 302:临时性跳转
-
4XX: 客户端出错,请求包含语法错误或者无法完成请求
- 必须记住
- 400: 请求出错,比如语法协议
- 403: 没权限访问
- 404: 找不到这个路径对应的接口或者文件
- 405: 不允许此方法进行提交,Method not allowed,比如接口一定要POST方式,而你是用了GET
- 必须记住
-
5XX: 服务端出错,服务器在处理请求的过程中发生了错误
- 必须记住
- 500: 服务器内部报错了,完成不了这次请求
- 503: 服务器宕机
- 必须记住
-
1.5 Http请求头/响应头
- HTTP请求头(Request Headers)
-
请求头包含在HTTP请求的消息头部分,用于向服务器提供客户端的请求上下文和其他相关信息。请求头的一些常见字段包括:
- Accept: 表示客户端可以接受的内容类型。例如,Accept: text/html 表示客户端可以接收HTML格式的内容
- Accept-Language: 表示客户端首选的语言。例如,Accept-Language: en-US 表示客户端首选语言是美国英语
- Accept-Encoding: 表示客户端支持的编码方式。例如,Accept-Encoding: gzip, deflate 表示客户端支持GZIP和DEFLATE压缩编码
- Authorization: 包含用于认证的信息。例如,在使用Basic认证时,会包含一个Base64编码的用户名和密码
- Content-Length: 表示请求体的长度(单位为字节)。例如,Content-Length: 1024 表示请求体长度为1024字节
- Content-Type: 表示请求体的MIME类型。例如,Content-Type: application/json 表示请求体是JSON格式的数据。
- Cookie: 包含客户端的cookie信息,用于识别客户端的身份
- User-Agent: 描述发送请求的应用程序的信息。例如,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) - AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 描述了发送请求的浏览器信息
- If-Modified-Since: 请求资源是否自某个日期以来已被修改
- Referer: 请求的来源页面的URL
-
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
- HTTP响应头(Response Headers)
-
响应头包含在HTTP响应的消息头部分,用于向客户端提供服务器的响应上下文和其他相关信息。响应头的一些常见字段包括:
- Content-Type: 表示响应体的MIME类型。例如,Content-Type: text/html 表示响应体是HTML格式的数据
- Content-Length: 表示响应体的长度(单位为字节)
- Content-Encoding: 表示响应体使用的编码方式。例如,Content-Encoding: gzip 表示响应体经过GZIP压缩。
- Date: 服务器生成响应的日期和时
- Server: 服务器软件的名称和版本
- Set-Cookie: 用于设置客户端的cookie
- Expires: 响应过期的日期和时间
- Cache-Control: 控制缓存的行为,如Cache-Control: no-cache 表示不允许缓存
- Last-Modified: 资源最后一次被修改的时间
- Location: 用于重定向的情况,提供新的URL
- Content-Disposition: 指示客户端如何处理响应体,如Content-Disposition: attachment; filename=“example.pdf” 表示响应体应当作为附件下载
- Content-Language: 响应体的语言
- Vary: 表示响应的内容可能因请求中的某些头字段而变化
-
HTTP/1.1 200 OK
Date: Fri, 25 Oct 2019 13:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 1778
Connection: close
Set-Cookie: session_id=d41d8cd98f00b204e9800998ecf8427e; Path=/; HttpOnly
Last-Modified: Wed, 23 Oct 2019 11:45:33 GMT
Expires: Thu, 26 Oct 2019 13:00:00 GMT
Cache-Control: max-age=86400
1.6 Http常见请求/响应头content-type内容类型
- Content-type: 用来指定不同格式的请求响应信息,俗称 MIME媒体类型
- 常见的取值
- text/html :HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
- application/json:JSON数据格式
- application/pdf :pdf格式
- application/octet-stream :二进制流数据,一般是文件下载
- application/x-www-form-urlencoded:form表单默认的提交数据的格式,会编码成key=value格式
- multipart/form-data: 表单中需要上传文件的文件格式类型
二、性能测试工具Jmeter使用
2.1 Jmeter5.X基础功能组件+线程组
什么是线程组
- 就是一组线程,并发执行,每个线程可以认为是一个请求
特殊线程组
- setUP:最先执行,前置工作
- 线程组:中级执行,常规处理
- tearDown:最后执行,收尾工作
Sampler(采样器)
查看测试结果
查看结果树
位置:
放在http采集器级别,获取兄弟节点数据
放在http采样器下面,获取当前http采样器数据
Http采样器复用和Http请求头管理
- 需求
- 如果有多个接口,每个接口都需要重复配置http协议、ip、端口等相同参数,维护起来麻烦
- 可以通过配置 http请求默认值 进行默认配置,那对应的线程组则不用重复配置
Http请求头管理
- 多数HTTP接口请求需要添加HTTP Header请求头,如何添加?
- 通过HTTP信息头管理器即可
2.2 Jmeter聚合报告分析和多案例断言
性能测试的关键点
-
TPS
- Transactions Per Second 每秒事务数, 可以是一个接口、多个接口、一个业务流程
- 包括增删改操作
-
QPS
- Queries Per Second, 每秒查询数, 指一台服务器每秒能够响应的查询次数
- QPS 只是一个简单查询的统计,不能描述增删改等操作
- 如果只是查询操作 TPS = QPS
-
RT
- 响应时间
- 响应时间
Jmeter实战之压测结果响应断言
-
什么是断言assert
-
指期望用户指定的条件满足,它是当用户定义的约束条件不满足时触发异常
-
简单说:**判断程序结果是否符合预期 **
-
什么时候应该用断言
-
多数情况都可以,但是推荐使用较为简单的断言,比如响应断言
-
复杂断言会消耗压测机器的性能
-
-
- 测试字段(选择哪些字段进行断言)
- 响应文本 Text response: 响应服务器返回的文本内容
- 响应代码 Response Code: 断言Http 响应码是否符合预期,比如 200
- 响应消息 Response Message : 验证响应消息是否按预期显示
- 响应标头 Response Headers : 断言查看特定的 HTTP 标头是否存在
- 文档(文本)Document (text): 基本不用,高负载可能会占用大量内存导致OOM
- URL样例 URL Sampled : 针对请求的 URL 使用以确保它符合预期
- 模式匹配的规则
-
包括 Contains: 响应内容【包含】需要匹配,支持正则表达式。
-
匹配 Matches: 响应内容要【完全匹配】需要匹配代表响应成功,大小写不敏感,支持正则表达式。
-
相等 Equals: 响应内容要【完全等于】需要匹配代表响应成功,大小写敏感,内容是字符串
-
字符串Substring: 响应内容【包含需要匹配】的内容才代表响应成功,大小写敏感,内容是字符串
-
不相等 Not: 取反操作,不相等
-
OR: 应用 OR 组合中的每个断言,将多个断言模式进行OR连接
-
高并发业务下Jmeter压测之持续时间断言
-
什么是持续时间断言Duration to assert
- 用于判断服务器的响应时间,作用对象是服务器
- Duration in milliseconds:响应时间设置(单位毫秒),如果响应时间大于设置的响应时间,断言失败,否则成功
-
应用场景
- 高并发下的,接口响应时间增加,如果超过一定时间则认为是超时
-
建议
- 断言类型很多,常规Duration Assertion与Response Assertion基本就足够使用了
- 常规业务里面会有状态码断言,还有RT响应时间要求,这样的话聚合报告的异常错误率就会更满足业务需求
2.3 CSV可变参数实战
Jmeter性能测试之CSV多个可变参数压测实战
-
需求
- 业务开发里面参数一般不是固定方式,而是采用可变参数进行压测
- 比如压测商品详情,查看id从1~100 的商品详情
解决方案 CSV可变参数
2.4 高并发业务下Jmeter集合点应用实战
-
性能测试
- 是多用户并发测试,但真正的并发其实是不存在的,用工具模拟并发
- 前面的测试“线程数”是并发用户数,启动需要时间,不是并发同一时刻访问
- 常规压测需要模拟全部用户同一时刻访问,比如 秒杀 案例场景
- 需求:先让全部请求 同时集合在一起,然后再一起访问,实现真正的并发
解决方式 :Jmeter的同步定时器
- 将多个请求同步并发操作,同步定时器又可称之为“集合点”
- 将需要做并发的请求集合在一起后再进行请求
注意事项
- 设置的值不能大于线程组 数量
- 最好的情况是 【线程组】 可以被 【用户组】整除
- 超时时间以毫秒为单位:指定人数 多少毫秒没集合到算超时
- 超时时间是0则无限等待,如果是大于0,则未达到集合的【用户组】数量,会在超时后执行
三、Jmeter二次开发之BeanShell实战
3.1 BeanShell的作用
什么是BeanShell
- 用Java写成的 小型、免费的Java源代码解释器
- 可以执行标准Java语句和表达式,完全符合java语法的java脚本语言(需要会javase语言)
- 包括一些脚本命令,有自己的一些语法和方法,是一种松散类型的脚本语言(这点和JS类似)
- 用于一些复杂的个性化需求,使用更灵活,功能更强大
- 官网地址:http://www.beanshell.org
BeanShell常用分类
- 采样器BeanShell
- 前置处理器 BeanShell PreProcessor:提前对参数处理比如加密编码
- 后置处理器 BeanShell PostProcessor :对返回结果做处理
- 断言 BeanShell Assert :验证请求接口是否满足要求
-
BeanShell内置对象,可以直接使用
SampleResult, ResponseCode, ResponseMessage, IsSuccess, Label, FileName, ctx, vars, props, log
3.2 BeanShell的使用
使用Bean shell内置对象vars对【变量】进行存取操作,作用在当前线程组
使用Bean shell内置对象props 对【属性】进行存取操作,作用在跨线程组使用
使用Bean shell内置对象log
-
Http采样器和BeanShell组合应用实战
-
定义Http采样器
-
BeanShell里面定义变量 var
-
读取var变量
${id}、${title}
-
3.3 BeanShell响应JSON处理和自定义断言
步骤
- 新增BeanShell断言
- 核心变量
使用JSON工具
- jar包放入jmeter目录下的 \lib\ext 中
import org.json.*;
String data = prev.getResponseDataAsString(); //获取响应信息
String httCode = prev.getResponseCode(); //获取响应code
log.info("data="+data);
JSONObject jsonobj = new JSONObject(data); //转json对象
log.info(jsonobj.toString());
int code = jsonobj.getInt("code");
log.info("code="+code);
3.4 Jmeter压测post方式接口和关联接口场景
背景
假设你正在负责一款在线购物平台的性能测试工作。该平台的核心功能包括用户注册、登录、浏览商品、加入购物车、下单支付等。为了保证平台在高并发访问下的稳定性,需要对关键业务流程中的各个接口进行性能测试
业务流程:
用户注册:新用户通过注册页面提交个人信息
用户登录:已注册用户通过登录页面提交用户名和密码
浏览商品:用户在主页浏览商品列表,并点击进入商品详情页
加入购物车:用户将喜欢的商品添加至购物车
下单支付:用户从购物车结算,填写订单信息并完成支付
接口描述:
注册接口:通过POST请求提交用户的姓名、邮箱、密码等信息
登录接口:通过POST请求提交用户的登录凭证
商品列表接口:通过GET请求获取商品列表
商品详情接口:通过GET请求获取具体商品的信息
加入购物车接口:通过POST请求将商品ID添加至用户的购物车
订单提交接口:通过POST请求提交订单信息,包括商品清单、收货地址等
测试目标:
负载测试:评估系统在一定并发用户数下的响应时间和吞吐量
稳定性测试:检测系统在长时间高负载情况下的表现,确保没有内存泄漏等问题
容量测试:确定系统可以处理的最大并发用户数
压力测试:超过最大容量限制,观察系统崩溃点及其恢复能力
关联接口需求
在这个场景中,有些接口之间存在依赖关系
例如:
登录接口的响应可能包含了后续请求所需的token或session ID,这些信息需要在后续的请求中使用
因此
需要在JMeter中设置相应的提取器(如正则表达式提取器或JSON提取器)来捕获这些值,并将其保存为变量,以便在后续的请求中使用
实现步骤简述
- 构建测试计划:在JMeter中创建一个测试计划,设置好虚拟用户数、迭代次数等参数。
- 配置HTTP请求:为每个接口配置一个HTTP请求取样器,指定正确的URL、请求类型(GET/POST)、参数等。
- 添加依赖处理逻辑:使用Beanshell/Groovy脚本或JMeter内置的逻辑控制器来处理接口间的依赖关系。
- 添加监听器:添加监听器来记录测试结果,如查看结果树、聚合报告等。
- 运行测试:执行测试计划,监控系统表现。
- 分析结果:根据测试结果分析系统的性能瓶颈,并提出改进建议
四、BeanShell使用外部Java文件
-
需求
-
常规beanshell里面写代码,适合简单的逻辑
-
工作里面还会用到更多方法逻辑,需要在idea编辑器里面写,然后进行调用
-
方式
- jar包:放到的lib目录或ext目录下,前面演示过json工具类操作
- java文件
-
步骤
- 使用 source加载源码,路径可以是绝对路径和相对路径
- 加载源文件后可以直接使用 类名.方法名(参数)
- 编写Java类:首先,编写一个Java类,比如 MyUtils.java,并编译成 .class 文件
// MyUtils.java
public class MyUtils {
public static String getHello(String name) {
return "Hello, " + name;
}
}
- 编译Java类:使用命令行或IDE编译上述Java文件
javac MyUtils.java
-
将编译后的类添加到JMeter的类路径:
- 将编译好的 .class 文件复制到 JMeter 的 lib 目录下,或者将其打包成 .jar 文件,然后将 .jar 文件放入 lib/ext 目录下
重启JMeter以加载新的类
- 将编译好的 .class 文件复制到 JMeter 的 lib 目录下,或者将其打包成 .jar 文件,然后将 .jar 文件放入 lib/ext 目录下
-
在BeanShell中调用:
- 在BeanShell Sampler、PreProcessor、PostProcessor或Assertion中,你可以直接调用这个类的方法
// BeanShell Sampler 示例
import com.example.MyUtils; // 假设包名为com.example
String result = MyUtils.getHello("World");
log.info(result);
五、Jmeter性能测试之html可视化压测报告
-
测试报告
- 聚合报告(前面讲过)
- 有收集到性能数据,但显示比较单一
- Jmeter 可以生成 HTML 性能测试报告
- 聚合报告(前面讲过)
-
步骤
- 保存jmx到本地
- 进到jmeter的bin目录下
jmeter -n -t <test_plan.jmx> -l <output_file.jtl> -e -o <report_folder>
其中,<test_plan.jmx> 是你的测试计划文件,<output_file.jtl> 是输出结果文件,<report_folder> 是生成报告的目录
参数说明
- -n 非gui方式运行jmeter
- -t :jmx 脚本路径
- -l :result.jtl 运行结果保存路径,注意:.jtl 文件名不能重复,文件夹需要存在
- -e :在脚本运行结束后生成 HTML 报告
- -o :用于存放 HTML 报告的目录,文件夹需要存在
- dashboard讲解
- Test and Report informations
- Source file:jtl文件名
- Start Time :压测开始时间
- End Time :压测结束时间
- Filter for display:过滤器
- Lable:sampler采样器名称
- APDEX(Application performance Index)
- apdex:应用程序性能指标,范围在0~1之间,1表示达到所有用户均满意
- T(Toleration threshold):可接受阀值
- F(Frustration threshold):失败阀值
- Requests Summary
- OK:成功率
- KO:失败率
- Statistics 统计数据
- lable:sampler采样器名称
- samples:请求总数,并发数*循环次数
- KO:失败次数
- Error%:失败率
- Average:平均响应时间
- Min:最小响应时间
- Max:最大响应时间
- 90th pct: 90%的用户响应时间不会超过这个值
- 95th pct: 95%的用户响应时间不会超过这个值
- 99th pct: 99%的用户响应时间不会超过这个值 (存在极端值)
- throughtput:Request per Second吞吐量 qps
- received:每秒从服务器接收的数据量
- send:每秒发送的数据量
- Test and Report informations
- charts讲解
- Over Time(随着时间的变化)
- Response Times Over Time:响应时间变化趋势
- Response Time Percentiles Over Time (successful responses):最大,最小,平均,用户响应时间分
- Active Threads Over Time:并发用户数趋势
- Bytes Throughput Over Time:每秒接收和请求字节数变化,蓝色表示发送,黄色表示接受
- Latencies Over Time:平均响应延时趋势
- Connect Time Over Time :连接耗时趋势
- Throughput
- Hits Per Second (excluding embedded resources):每秒点击次数
- Codes Per Second (excluding embedded resources):每秒状态码数量
- Transactions Per Second:即TPS,每秒事务数
- Response Time Vs Request:响应时间和请求数对比
- Latency Vs Request:延迟时间和请求数对比
- Response Times
- Response Time Percentiles:响应时间百分比
- Response Time Overview:响应时间概述
- Time Vs Threads:活跃线程数和响应时间
- Response Time Distribution:响应时间分布图
- Over Time(随着时间的变化)