链接: https://pan.baidu.com/s/1lOHFVQyad6WNT9CEJsJvhQ 提取码: 8z1x
第一章 零基础掌握Http基础协议和解析实战
第1集 浏览器的B/S架构和C/S架构你知道多少
简介:浏览器的B/S架构和C/S架构你知道多少
-
什么是CS架构 客户机-服务器,即Client-Server(C/S)结构 但是缺少通用性,系统维护、升级需要重新设计和开发,增加了维护和管理的难度
-
什么是BS架构 B/S架构即浏览器和服务器架构模式,是WEB兴起后的一种网络架构模式 WEB浏览器是客户端最主要的应用软件 统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用
第2集 HyperText Transfer Protocol 超文本传输协议
简介:什么是Http超文本传输协议
-
协议
-
协议是⼀种约定,规定好⼀种信息的格式,如果发送⽅按照这种请求格式发送信息,那么接 收端就要按照这样的格式解析数据,这就是协议
-
json协议
{ "name":"jack", "age":23 }
-
xml协议
<user> <name> jack </name> <age> 234 </age> <pwd> 2342423</pwd> </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,服务器挂了或者不 可⽤
-
发展历史
- http0.9-》http1.0-》http1.1-》http2.0
- 不多优化协议,增加更多功能
-
和https的关系
- Hyper Text Transfer Protocol over SecureSocket Layer
- 主要由两部分组成:HTTP + SSL / TLS
- 比 HTTP 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性,增加破解成本
- 缺点:相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加额外的计算资源消耗,增加 10%到 20%的耗电等;不过利大于弊,所以Https是趋势,相关资源损耗也在持续下降
- 如果做软件压测:直接压测内网ip,通过压测公网域名,不管是http还是https,都会带来额外的损耗导致结果不准确
第3集 超文本传输协议Http消息体拆分讲解
简介:讲解Http协议消息体拆分讲解
-
Http请求消息结构
- 请求行
- 请求方法
- URL地址
- 协议名
- 请求头
- 报文头包含若干个属性 格式为“属性名:属性值”,
- 服务端据此获取客户端的基本信息
- 请求体
- 请求的参数,可以是json对象,也可以是前端表单生成的key=value&key=value的字符串
- 请求行
- Http响应消息结构
- 响应行
- 报文协议及版本、状态码
- 响应头
- 报文头包含若干个属性 格式为“属性名:属性值”
- 响应正文
- 响应报文体,我们需要的内容,多种形式比如html、json、图片、视频文件等
- 响应行
第4集 HTTP的九种请求方法和响应码介绍
简介: HTTP的九种请求方法和响应码介绍
- 浏览器请求方法
- http1.0定义了三种:
- GET: 向服务器获取资源,比如常见的查询请求
- POST: 向服务器提交数据而发送的请求
- Head: 和get类似,返回的响应中没有具体的内容,用于获取报头
- http1.1定义了六种
- PUT:一般是用于更新请求,比如更新个人信息、商品信息全量更新
- PATCH:PUT 方法的补充,更新指定资源的部分数据
- DELETE:用于删除指定的资源
- OPTIONS: 获取服务器支持的HTTP请求方法,服务器性能、跨域检查等
- CONNECT: 方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户,网页开发基本不用这个方法,如果是http代理就会使用这个,让服务器代理用户去访问其他网页,类似中介
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- http1.0定义了三种:
-
Http响应码
- 浏览器向服务器请求时,服务端响应的消息头里面有状态码,表示请求结果的状态
-
分类
-
1XX: 收到请求,需要请求者继续执行操作,比较少用
-
2XX: 请求成功,常用的 200
-
3XX: 重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取;
- 好处:网站改版、域名迁移等,多个域名指向同个主站导流
- 必须记住
- 301:永久性跳转,比如域名过期,换个域名
- 302:临时性跳转
-
4XX: 客户端出错,请求包含语法错误或者无法完成请求
- 必须记住
- 400: 请求出错,比如语法协议
- 403: 没权限访问
- 404: 找不到这个路径对应的接口或者文件
- 405: 不允许此方法进行提交,Method not allowed,比如接口一定要POST方式,而你是用了GET
- 必须记住
-
5XX: 服务端出错,服务器在处理请求的过程中发生了错误
- 必须记住
- 500: 服务器内部报错了,完成不了这次请求
- 503: 服务器宕机
- 必须记住
-
第5集 Http请求头知识点讲解
简介:讲解http常见请求头讲解
- http请求分为三部分:请求行,请求头, 请求体
- 请求头
- 报文头包含若干个属性 格式为“属性名:属性值”,
- 服务端据此获取客户端的基本信息
- 常见的请求头
- Accept: 览器支持的 MIME 媒体类型, 比如 text/html,application/json,image/webp,/ 等
- Accept-Encoding: 浏览器发给服务器,声明浏览器支持的编码类型,gzip, deflate
- Accept-Language: 客户端接受的语言格式,比如 zh-CN
- Connection: keep-alive , 开启HTTP持久连接
- Host:服务器的域名
- Origin:告诉服务器请求从哪里发起的,仅包括协议和域名 CORS跨域请求中可以看到response有对应的header,Access-Control-Allow-Origin
- Referer:告诉服务器请求的原始资源的URI,其用于所有类型的请求,并且包括:协议+域名+查询参数; 很多抢购服务会用这个做限制,必须通过某个入来进来才有效
- User-Agent: 服务器通过这个请求头判断用户的软件的应用类型、操作系统、软件开发商以及版本号、浏览器内核信息等; 风控系统、反作弊系统、反爬虫系统等基本会采集这类信息做参考
- Cookie: 表示服务端给客户端传的http请求状态,也是多个key=value形式组合,比如登录后的令牌等
- Content-Type: HTTP请求提交的内容类型,post提交时才需要设置,比如文件上传,表单提交、json等
- form表单提交:application/x-www-form-urlencoded
- json方式提交:application/json
第6集 Http响应头知识点讲解
简介:讲解Http响应头知识点
- 响应头
- 报文头包含若干个属性 格式为“属性名:属性值”
- 常见的响应头
- Allow: 服务器支持哪些请求方法
- Content-Length: 响应体的字节长度
- Content-Type: 响应体的MIME类型
- Content-Encoding: 设置数据使用的编码类型
- Date: 设置消息发送的日期和时间
- Expires: 设置响应体的过期时间,一个GMT时间,表示该缓存的有效时间
- cache-control: Expires的作用一致,都是指明当前资源的有效期, 控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据,优先级高于Expires,控制粒度更细,如max-age=240,即4分钟
- Location:表示客户应当到哪里去获取资源,一般同时设置状态代码为3xx
- Server: 服务器名称
- Transfer-Encoding:chunked 表示输出的内容长度不能确定,静态网页一般没,基本出现在动态网页里面
- Access-Control-Allow-Origin: 定哪些站点可以参与跨站资源共享
第7集 Http常见请求/响应头content-type内容类型讲解
简介:讲解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: 表单中需要上传文件的文件格式类型
-
Http知识加深文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP
第二章 性能测试工具Jmeter实战和接口环境准备
第1集 性能测试分类和常见工具
简介:性能测试分类和常见工具
-
性能测试分类
-
性能测试:
- 对系统不断施压,验证系统在资源范围内【是否达到性能指标】
- 通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试
-
压力测试
- 超过安全负载后对系统不断施压,直到系统崩溃,得出【系统最大承受能力】
- 通过在一定的负荷条件下,长时间连续运行系统给系统性能造成的影响
-
-
负载测试
-
对系统不断施压,当1项以上指标达到临界值后继续加压,看【系统处理能力变化】
-
稳定性测试
- 确定软硬件配置情况下,对系统分配一定的业务压力运行一段时间,检查【系统是否稳定】
-
- 常见工具
- LoadRunner
- 性能稳定,压测结果及细粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多
- Apache AB(单接口压测最方便)
- 模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载, 简单DDOS攻击等
- Webbench
- webbench首先fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。
- Jmeter (GUI )
- 开源免费,功能强大,在互联网公司普遍使用
- 压测不同的协议和应用
- Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
- FTP
- Database via JDBC
- Message-oriented middleware (MOM) via JMS
- Mail - SMTP(S), POP3(S) and IMAP(S)
- TCP等等
- 使用场景及优点
- 功能测试
- 压力测试
- 分布式压力测试
- 纯java开发
- 上手容易,高性能
- 提供测试数据分析
- 各种报表数据图形展示
- LoadRunner
第2集 性能测试工具Jmeter基本介绍和使用场景
简介 性能测试工具Jmeter基本介绍和使用场景
-
什么是Jmeter
- 是 apache 公司基于 java 开发的一款开源性能测试工具
- 地址: https://jmeter.apache.org/
- 特点
- 开源免费功能强大,在互联网公司普遍使用
- 压测不同的协议和应用
- Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
- FTP
- Database via JDBC
- Message-oriented middleware (MOM) via JMS
- Mail - SMTP(S), POP3(S) and IMAP(S)
- 使用场景及优点
- 支持功能测试、单机和分布式压力测试
- 纯java开发
- 上手容易,高性能
- 提供测试数据分析
- 各种报表数据图形展示
- 缺点
- 不支持html、js渲染操作,不能做UI功能测试
-
注意
-
JMeter 不是浏览器,它在协议级别工作
-
对于 Web 服务和远程服务而言,JMeter 看起来像一个浏览器
-
JMeter 并不执行浏览器支持的所有操作,不像浏览器那样呈现 HTML 页面,不执行 HTML 页面中的 JS
-
第3集 多环境快速安装Jmeter5.x和汉化
简介: 多环境快速安装Jmeter5.x和汉化
- 文件资料(Jmeter5.x,jdk8)
https://atgfwacnz-my.sharepoint.com/:f:/g/personal/gtfonedriver_365vip_eu_org/EhKpOAKTM19DpgozZU1AXScBzIN6jpzdzQ045QM7Qw-lzg?e=yqv06z
- 压测工具本地快速安装Jmeter5.X
- 需要安装JDK8 以上(每个人系统不一样,参考指引)
- 建议安装JDK环境,虽然JRE也可以,但是压测https需要JDK里面的 keytool工具
- 快速下载 https://jmeter.apache.org/download_jmeter.cgi
- 文档地址:http://jmeter.apache.org/usermanual/get-started.html
- 注意
- 要安装 JDK8,因为后续有服务端接口运行需要JDK8,不要安装最新的JDK17、JDK21等
- 常规企业基本都是JDK8 或 JDK11
-
Jmeter目录
bin:核心可执行文件,包含配置 jmeter.bat: windows启动文件(window系统一定要配置显示文件拓展名) jmeter: mac或者linux启动文件 jmeter-server:mac或者Liunx分布式压测使用的启动文件 jmeter-server.bat:window分布式压测使用的启动文件 jmeter.properties: 核心配置文件 extras:插件拓展的包 lib:核心的依赖包
-
Jmeter语言版本中英文切换
- 控制台修改 menu -> options -> choose language
-
配置文件修改
- bin目录 -> jmeter.properties
- 默认 #language=en
- 改为 language=zh_CN
第4集 后端HTTP接口运行环境和部署实战
简介:后端HTTP接口运行环境和启动实战
-
测试没接口和文档怎么办
-
公司里面 多数都是前后端分离,项目启动后开发人员应该先定义接口文档
-
测试人员应该尽早拿到接口文档进行编写测试用例
-
没文档怎么办?
-
老旧系统:找你上司或者接手的开发人员进行获取;实在没法就只能抓包
- 如果是后端直接返回页面+数据,一次性渲染好,则没法做接口测试
- app:通过客户端app抓包
-
如果里面参数涉及复杂的加密逻辑且开发人员不能协助,这个就基本没戏了
-
新系统:找开发人员先定义接口,按照流程规范走,找技术负责人协调
-
-
-
学习Jmeter没接口怎么办?
-
我们这边提供了后端程序,直接本地启动运行即可
-
命令行进入程序所在路径启动(win、mac、linux命令自行参考下)
java -jar class-edu.jar
-
后端接口说明
- 端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get
-
-
注意
- 登录账号密码,程序里面只提供一个,所以需要按照上面进行操作
- 常规就是get、post压测,1个接口到100个接口都类似
- java -jar class-edu.jar 启动不能关闭,是运行程序
第5集 Jmeter5.X基础功能组件+线程组和Sampler
简介:Jmeter5.X基础功能组件+线程组和Sampler
-
什么是线程组
- 就是一组线程,并发执行,每个线程可以认为是一个请求
-
添加->threads->线程组(控制总体并发)
线程数:虚拟用户数。一个虚拟用户占用一个进程或线程
准备时长(Ramp-Up Period(in seconds)):全部线程启动的时长,比如100个线程,20秒,则表示20秒内 100个线程都要启动完成,每秒启动5个线程
循环次数:每个线程发送的次数,假如值为5,100个线程,则会发送500次请求,可以勾选永远循环
- 线程组->添加-> Sampler(采样器) -> Http (一个线程组下面可以增加几个Sampler)
名称:采样器名称
注释:对这个采样器的描述
web服务器:
默认协议是http
默认端口是80
服务器名称或IP :请求的目标服务器名称或IP地址
路径:服务器URL
- 查看测试结果
线程组->添加->监听器->察看结果树
线程组->添加->监听器->聚合报告
位置:
放在http采集器级别,获取兄弟节点数据
放在http采样器下面,获取当前http采样器数据
- 存储
- 保存jmx性能测试脚本
- 打开已有jmx性能测试脚本
第6集 完成你的Jmeter第一个性能测试接口实战
简介:完成你的Jmeter第一个性能测试接口实战
-
性能测试实战
- 打开Jmeter压测http的get接口
-
报告分析
- 察看结果树
-
查看结果树,响应乱码问题解决
- Jmeter的bin目录下,找到jmeter.properties文件
#sampleresult.default.encoding=ISO-8859-1的注释去掉, 改成:sampleresult.default.encoding=UTF-8, 重启jmeter即可
第7集 特殊的线程组setUP-tearDown和调度器实战
简介:特殊的线程组setUP-tearDown和调度器实战
-
特殊线程组
- setUP:最先执行,前置工作
- 线程组:中级执行,常规处理
- tearDown:最后执行,收尾工作
-
案例实战
-
线程组里面的调度器
第8集 Http采样器复用和Http请求头管理实战
简介:Http采样器复用和Http请求头管理
-
需求
-
如果有多个接口,每个接口都需要重复配置http协议、ip、端口等相同参数,维护起来麻烦
-
可以通过配置 http请求默认值 进行默认配置,那对应的线程组则不用重复配置
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get -
-
Http请求头管理
- 多数HTTP接口请求需要添加HTTP Header请求头,如何添加?
- 通过HTTP信息头管理器即可
Content-Type: application/json
第三章 Jmeter聚合报告分析和多案例断言实战
第1集 Jmeter实战之压测结果聚合报告分析
简介: Jmeter实战之压测结果聚合报告分析
-
性能测试的关键点
-
TPS
- Transactions Per Second 每秒事务数, 可以是一个接口、多个接口、一个业务流程
- 包括增删改操作
-
QPS
- Queries Per Second, 每秒查询数, 指一台服务器每秒能够响应的查询次数
- QPS 只是一个简单查询的统计,不能描述增删改等操作
- 如果只是查询操作 TPS = QPS
-
RT
- 响应时间
-
-
新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)
-
参数配置:500线程数,20秒持续压测
-
参数配置:3000线程数,20秒持续压测
-
如何得出最佳性能指标
- 500线程 和 3000线程,500线程每次增加300个线程,持续压测得出最佳的吞吐量,此时线程数就是最佳
-
参数解读
lable: sampler的名称
Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100
Average: 平均响应时间
Median: 中位数,也就是 50% 用户的响应时间
90% Line : 90% 用户的响应不会超过该时间 (90% of the samples took no more than this time. The remaining samples at least as long as this)
95% Line : 95% 用户的响应不会超过该时间
99% Line : 99% 用户的响应不会超过该时间
min : 最小响应时间
max : 最大响应时间
Error%:错误的请求的数量/请求的总数
Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps
KB/Sec: 每秒接收数据量
第2集 Jmeter实战压测结果之响应断言
简介: 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连接
-
- 案例实战
- http响应码断言
- 响应文本断言
第3集 高并发业务下Jmeter压测之持续时间断言
简介: 高并发业务下Jmeter压测之持续时间断言
-
什么是持续时间断言Duration to assert
-
用于判断服务器的响应时间,作用对象是服务器
-
Duration in milliseconds:响应时间设置(单位毫秒),如果响应时间大于设置的响应时间,断言失败,否则成功
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get
-
-
应用场景
- 高并发下的,接口响应时间增加,如果超过一定时间则认为是超时
-
建议
- 断言类型很多,常规Duration Assertion与Response Assertion基本就足够使用了
- 常规业务里面会有状态码断言,还有RT响应时间要求,这样的话聚合报告的异常错误率就会更满足业务需求
第四章 CSV可变参数实战和互联网大厂标准压测流程
第1集 Jmeter用户自定义变量实战
简介:Jmeter用户自定义变量实战
-
需求背景
- 企业开发里面一般都是有多环境开发
- 项目中有变量会根据环境变化而变化
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get -
解决方式
- 可以使用自定义变量,在一处定义四处使用,改的时候只要改一次即可
-
案例实战
- 线程组->add -> Config Element(配置原件)-> User Definde Variable(用户定义的变量)
- 引用方式${XXX},在接口中变量中使用
-
- 看结果树
第2集 Jmeter性能测试之CSV多个可变参数压测实战
**简介:Jmeter性能测试之CSV多个可变参数压测实战 **
-
需求
- 业务开发里面参数一般不是固定方式,而是采用可变参数进行压测
- 比如压测商品详情,查看id从1~100 的商品详情
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get -
解决方案 CSV可变参数
- 线程组—>添加—>配置原件—>CSV Data Set Config
- 提前准备好一批id, 直接使用jmeter压测
- CSV参数读取配置
- 请求应用
第3集 互联网公司标准压测流程和压测脚本JMX讲解
简介: 互联网公司标准压测流程和压测脚本JMX讲解
-
互联网公司常规压测流程
- 多环境区分
- 本地开发环境生成脚本,上传压测机器
- 内网环境,非GUI下压测
- 停止其他无关资源进程
- 压测机和被压测机器隔离
- 避免资源争夺:内存、CPU、磁盘IO、网络IO
-
Jmeter执行压测核心是JMX脚本
- 打开方式sublime,或者xml编辑器
- 常规修改项
- 请求地址修改
- 参数化文件路径修改
第4集 【重点】高并发业务下Jmeter集合点应用实战
简介: 高并发业务下Jmeter集合点应用实战
-
性能测试
- 是多用户并发测试,但真正的并发其实是不存在的,用工具模拟并发
- 前面的测试“线程数”是并发用户数,启动需要时间,不是并发同一时刻访问
- 常规压测需要模拟全部用户同一时刻访问,比如 秒杀 案例场景
- 需求:先让全部请求 同时集合在一起,然后再一起访问,实现真正的并发
-
解决方式 :Jmeter的同步定时器
-
将多个请求同步并发操作,同步定时器又可称之为“集合点”
-
将需要做并发的请求集合在一起后再进行请求
-
注意事项
-
设置的值不能大于线程组 数量
-
最好的情况是 【线程组】 可以被 【用户组】整除
-
超时时间以毫秒为单位:指定人数 多少毫秒没集合到算超时
-
超时时间是0则无限等待,如果是大于0,则未达到集合的【用户组】数量,会在超时后执行
-
后端接口说明,端口 8080
-
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get -
第五章 【高级】Jmeter二次开发之BeanShell实战
第1集 Jmeter性能测试里面BeanShell作用
简介: Jmeter性能测试里面BeanShell作用
-
什么是BeanShell
- 用Java写成的 小型、免费的Java源代码解释器
- 可以执行标准Java语句和表达式,完全符合java语法的java脚本语言(需要会javase语言)
- 包括一些脚本命令,有自己的一些语法和方法,是一种松散类型的脚本语言(这点和JS类似)
- 用于一些复杂的个性化需求,使用更灵活,功能更强大
- 官网地址:http://www.beanshell.org
-
使用场景
- 需要在jmeter里面对数据的二次处理,定制自己的业务逻辑
- 对参数进行加密、base64编码、时间格式化、文件操作、自定义断言等
- 属于Jmeter二次开发
- Jmeter里面开启【日志查看】方便调试
- 需要在jmeter里面对数据的二次处理,定制自己的业务逻辑
-
BeanShell常用分类
- 采样器BeanShell
- 前置处理器 BeanShell PreProcessor:提前对参数处理比如加密编码
- 后置处理器 BeanShell PostProcessor :对返回结果做处理
- 断言 BeanShell Assert :验证请求接口是否满足要求
-
外观样式调整
-
BeanShell内置对象,可以直接使用
SampleResult, ResponseCode, ResponseMessage, IsSuccess, Label, FileName, ctx, vars, props, log
第2集 BeanShell开发核心知识点应用实战
简介: BeanShell开发核心知识点应用实战
- 使用Bean shell内置对象vars对【变量】进行存取操作,作用在当前线程组,类似java里面的map
- vars.put(“name”,“jack”);数据存到jmeter变量中
- vars.get(“name”);从jmeter中获得变量值
- 使用Bean shell内置对象props 对【属性】进行存取操作,作用在跨线程组使用
- props.get(“language”); //jmeter.properties里面定义的属性
- props.put(“language”,“zh_CN”);
- 案例
- 使用BeanShell采样器 或 前置处理器 BeanShell PreProcessor 即可
String name = "Jmeter最佳实践";
log.info(name);
String lang = props.get("language");
log.info("language="+lang);
vars.put("id","1111");
vars.put("title","java教程");
-
Http采样器和BeanShell组合应用实战
-
定义Http采样器
-
BeanShell里面定义变量 var
-
读取var变量
${id}、${title}
-
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get 第3集 BeanShell响应JSON处理和自定义断言实战
简介: BeanShell基于响应结果自定义断言实战
-
需求
- 根据业务结果,自定义响应断言
-
步骤
- 新增BeanShell断言
- 核心变量
String data = prev.getResponseDataAsString() //获取响应信息 prev.getResponseCode() //获取响应code Failure = false //表示断言成功, Failure = true //表示断言失败
-
使用JSON工具
- jar包放入jmeter目录下的 \lib\ext 中( 本章本集资料包里面)
- 更多api参考 https://stleary.github.io/JSON-java/org/json/JSONObject.html
import org.json.*; String data = prev.getResponseDataAsString(); //获取响应信息 String responseCode = prev.getResponseCode(); //获取http响应码 log.info("responseCode="+responseCode); JSONObject jsonobj = new JSONObject(data); //转json对象 log.info(jsonobj.toString()); int code = jsonobj.getInt("code"); log.info("code="+code); if(code==1){ Failure=false; }else{ Failure=true; FailureMessage="失败"; }
-
拓展
- 有些项目会有需要对参数进行加密,比如MD5,则可以这样操作
import org.apache.commons.codec.digest.DigestUtils; String signs = DigestUtils.md5Hex("1111"); log.info("md5==="+signs); vars.put("title",(signs.toString()).toUpperCase());
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get
第4集 Jmeter压测post方式接口和关联接口场景《上》
简介: Jmeter压测post方式接口和关联查询场景
-
需求
- 常规接口需要登录后才可以压测,这个怎么处理
- 使用接口关联进行压力测试????
-
案例操作
- 登录接口压测 post方式
- 个人信息接口压测 get方式
-
误区
- 个人信息接口需要登录才可以访问,为了压测这个接口,则需要先压测登录获取token
- 访问了A接口,再访问了B接口,那你怎么断定是哪个接口影响了性能?哪个接口QPS多少?
-
正确方式
- 第一接口:参数化批量请求接口,获取相关响应,提取数据保存文件,作为下个接口的入参
- 第二接口:通过参数化,读取第一个接口的文件进行操作
-
实操
- 批量参数化操作调用登录接口生成token
- post方式提交json数据,参数化时候整行是一个变量
第5集 Jmeter压测post方式接口和关联接口场景《下》
简介: Jmeter压测post方式接口和关联查询场景
-
存储第一个登录接口结果
- BeanShell提取登录结果,写入到本地文件
import org.json.*; //String responseCode = prev.getResponseCode(); String data = prev.getResponseDataAsString(); //获取响应信息 JSONObject jsonobj = new JSONObject(data); //转json对象 log.info(jsonobj.toString()); int code = jsonobj.getInt("code"); if(code == 0 ){ FileWriter fstream = new FileWriter("/Users/gaotengfei/Desktop/tokens.txt",true); BufferedWriter out = new BufferedWriter(fstream); out.write(jsonobj.get("data")+"\n"); out.close(); fstream.close(); }else{ }
-
第二步:压测需要登录的接口,用第一步得到的文件参数化操作
第6集 BeanShell使用外部Java文件实战
简介: BeanShell使用外部Java文件实战
-
需求
- 常规beanshell里面写代码,适合简单的逻辑
- 工作里面还会用到更多方法逻辑,需要在idea编辑器里面写,然后进行调用
- 方式
- jar包:放到的lib目录或ext目录下,前面演示过json工具类操作
- java文件
-
步骤
- 使用 source加载源码,路径可以是绝对路径和相对路径
- 加载源文件后可以直接使用 类名.方法名(参数)
source("/Users/gaotengfei/Desktop/CommonUtil.java"); String randomCode = CommonUtil.getRandomCode(4); String uuid = CommonUtil.generateUUID(); log.info("randomCode====="+randomCode); log.info("uuid====="+uuid);
- java文件
import java.util.Random; import java.util.UUID; public class CommonUtil { /** * 获取验证码随机数 * @param length * @return */ public static String getRandomCode(int length) { String sources = "0123456789"; Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int j = 0; j < length; j++) { sb.append(sources.charAt(random.nextInt(9))); } return sb.toString(); } /** * 生成uuid * * @return */ public static String generateUUID() { return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); } }
第六章 Jmeter性能测试之html可视化压测报告实战
第1集 Jmeter-html可视化压测报告实战
简介: Jmeter-html可视化压测报告讲解
-
测试报告
- 聚合报告(前面讲过)
- 有收集到性能数据,但显示比较单一
- Jmeter 可以生成 HTML 性能测试报告
- 聚合报告(前面讲过)
-
步骤
- 保存jmx到本地
- 进到jmeter的bin目录下
./jmeter -n -t /Users/gaotengfei/Desktop/goods.jmx -l /Users/gaotengfei/Desktop/goods_1.jtl -e -o /Users/gaotengfei/Desktop
- 参数说明
- -n 非gui方式运行jmeter
- -t :jmx 脚本路径
- -l :result.jtl 运行结果保存路径,注意:.jtl 文件名不能重复,文件夹需要存在
- -e :在脚本运行结束后生成 HTML 报告
- -o :用于存放 HTML 报告的目录,文件夹需要存在
-
实操
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get
第2集 Jmeter压测生成多维度图形化HTML测试报告讲解
简介: Jmeter压测生成多维度图形化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:响应时间分布图
第3集 异常场景下的多维度图形化HTML测试报告
-
简介: 异常场景下的多维度图形化HTML测试报告
第七章 【高级】 linux下非GUI压测和性能优化案例
第1集 linux下非GUI压测实战需求和环境说明
简介:linux下非GUI压测实战需求和环境说明
-
前言
-
前面内容适合Jmeter快速入门,本章内容是高级篇幅,需要一定的技术栈
-
掌握:linux、jvm
-
高级测试工程师 就是 测试开发工程师,需要达到中高级后端开发水平
-
知道性能瓶颈所在,才可以做性能优化,性能瓶颈存在哪里;
-
-
需求
-
常规图形下压测会影响相关性能指标
-
实际工作里面压测会在linux压测,才更加准确
-
性能测试后,会做部分轻量级性能优化提升吞吐量
-
-
相关准备
- 两个接口的jmx脚本(集合点500并发,持续2分钟)
- linux服务器(推荐使用阿里云服务器)CentOS 7.8
- 安装jdk8、文件上传下载工具 (看【环境安装视频】)
- mac: filezilla、item2
- win: winscp、putty
-
后端接口说明,端口 8080
接口介绍 接口路径 参数和备注 method 商品列表 /api/v1/product/list 不用参数 get 登录接口 /api/v1/user/login post 用户信息 /api/v1/user/info 需要登录,http的header里面加入token字段 get 秒杀接口 /api/v1/product/second_kill 不用参数,用于测试接口耗时情况 get 商品详情 /api/v1/product/detail 用于可变参数压测,参数: id 和 title get
第2集 Linux CentOS服务器安装JDK8环境
简介:Linux服务器安装JDK8
-
安装JDK8环境
-
官方地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
-
本地上传JDK1.8到服务器(课程提供安装包,对应章集的资料里面)
-
配置全局环境变量
- 解压:tar -zxvf jdk-8u181-linux-x64.tar.gz
- 重命名
- vim /etc/profile
- 配置
JAVA_HOME=/usr/local/software/jdk8 CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH
-
-
环境变量立刻生效
- source /etc/profile
- 查看安装情况 java -version
- Jmeter上传和jmx脚本
- yum install unzip
- jmeter解压重命名
第3集 Linux服务器非GUI压测实战和报告下载
简介: Linux服务器非GUI压测实战和报告下载
-
压测实战
- 上传应用程序,启动应用程序
- 调整jvm内存,方便后续性能优化对比
#守护进程方式,退出终端,进程依旧再 nohup java -jar class-edu.jar & java -jar -Xms128m -Xmx128m -Xss228k nohup java -jar -Xms128m -Xmx128m -Xss228k class-edu.jar & Xms 堆内存初始大小 Xmx 堆内存最大值 xss 线程栈大小
-
上传JMX脚本
-
调整相关参数
- IP和端口
- 参数化路径
-
执行压测(进到Jmeter目录,测试报告目录需要先创建好)
jmeter -n -t /usr/local/software/linux_load_test.jmx -l /usr/local/software/temp/jtl/result.jtl -e -o /usr/local/software/temp/result
- -n 非gui方式运行jmeter
- -t :jmx 脚本路径
- -l :result.jtl 运行结果保存路径,注意:.jtl 文件名不能重复,文件夹需要存在
- -e :在脚本运行结束后生成 HTML 报告
- -o :用于存放 HTML 报告的目录,文件夹需要存在
-
下载测试报告
- 上传应用程序,启动应用程序
第4集 Jmeter压测后的性能优化-提升吞吐量
简介: Jmeter压测后的性能优化-提升吞吐量
-
上一集问题Bug
- 由于系统配置高,查看优化前后测试报告不明显
- 重新压测,调整jmx并发改为4000线程,集合点2000重新压测
-
性能优化( 阿里云服务器内网压测,4核8G )
- 调整JVM参数
#通过这个参数,压测后,服务直接不可用 nohup java -jar -Xms128m -Xmx128m -Xss228k class-edu.jar & #通过这个压测,可以承载这个流量,但是响应时间变长了 nohup java -jar -Xms2048m -Xmx2048m -Xss300k class-edu.jar &
-
压测
-
执行压测(进到Jmeter目录,测试报告目录需要先创建好,之前有内容记得删除)
jmeter -n -t /usr/local/software/linux_load_test.jmx -l /usr/local/software/temp/jtl/result.jtl -e -o /usr/local/software/temp/result
-
-
下载测试报告
第八章 Jmeter性能压测总结和性能提升学习路线
第1集 Jmeter性能测试课程总结和关注点
简介:Jmeter性能测试课程总结
-
课程总结
-
性能优化涉及范围广,这个就需要达到高级开发水平
-
硬件:CPU、内存、带宽、磁盘、机房网络
-
程序:应用程序调优、代码逻辑调优
-
中间件
- 分布式缓存
- 消息队列
- 线程池、连接池
- 异步
- 数据库
- 数据库索引是否合理
- 慢查询是否解决
- 连接数是否够
- 单表是否数量过大
- 单表自动是否过多
- 是否需要进行分库分表
…
-