Jmeter5.X性能测试

时间:2024-11-06 07:12:10

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的字符串
      在这里插入图片描述

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提取器)来捕获这些值,并将其保存为变量,以便在后续的请求中使用

实现步骤简述

  1. 构建测试计划:在JMeter中创建一个测试计划,设置好虚拟用户数、迭代次数等参数。
  2. 配置HTTP请求:为每个接口配置一个HTTP请求取样器,指定正确的URL、请求类型(GET/POST)、参数等。
  3. 添加依赖处理逻辑:使用Beanshell/Groovy脚本或JMeter内置的逻辑控制器来处理接口间的依赖关系。
  4. 添加监听器:添加监听器来记录测试结果,如查看结果树、聚合报告等。
  5. 运行测试:执行测试计划,监控系统表现。
  6. 分析结果:根据测试结果分析系统的性能瓶颈,并提出改进建议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、BeanShell使用外部Java文件

  • 需求

  • 常规beanshell里面写代码,适合简单的逻辑

  • 工作里面还会用到更多方法逻辑,需要在idea编辑器里面写,然后进行调用

  • 方式

    • jar包:放到的lib目录或ext目录下,前面演示过json工具类操作
    • java文件
  • 步骤

    • 使用 source加载源码,路径可以是绝对路径和相对路径
    • 加载源文件后可以直接使用 类名.方法名(参数)
  1. 编写Java类:首先,编写一个Java类,比如 MyUtils.java,并编译成 .class 文件
// MyUtils.java
public class MyUtils {
    public static String getHello(String name) {
        return "Hello, " + name;
    }
}
  1. 编译Java类:使用命令行或IDE编译上述Java文件
javac MyUtils.java
  1. 将编译后的类添加到JMeter的类路径:

    • 将编译好的 .class 文件复制到 JMeter 的 lib 目录下,或者将其打包成 .jar 文件,然后将 .jar 文件放入 lib/ext 目录下
      重启JMeter以加载新的类
  2. 在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:每秒发送的数据量
  • 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:响应时间分布图