一 、 性能理论
-
性能测试理论
- 什么是性能测试
- 初始
- 服务器崩溃,宕机
- 客户机性能
- 概念: 利用脚本或者工具对于被测系统进行一定的负载测试,观察性能指标是否满足用户需求、得到相关性能指标,并优化
- 性能测试的目的 : 不是完全为了找bug。是为了验证系统的性能是否满足用户的需求或者做出系统的性能瓶颈、性能指标。
- 测试手段:主要使用工具
- JMeter:基于线程
- loadrunner 基于线程
- locust :基于协程 python的第三方库,用于压力测试
- 初始
- 什么是性能测试
-
为什么做性能测试
- 稳定性\可靠性
- 查找bug
- 可用性:是否满足用户需求,达到客户体验
- 承载压力多大、负载能达到
- 大压力情况下,成功率、错误率是否达到要求
- 相应时间
- 并发用户数
- 节约资源开销
- 服务器资源 ——通过性能测试去验证服务器资源是否满足需求
- 节约资源开销
-
分类
- 负载测试
- 概念:一定的软硬件、网络环境下,向系统改变负载方式、增加负载观察系统的性能指标,是否存在性能瓶颈
- 目的:得到最佳用户数、最大用户数
- 场景:功拱形场景
- 指标计算
- 压力测试
- 概念:在一定的软件硬件和环境下,向被测系统添加大量的负载(最佳用户数、最大用户数)进行长时间的观察性 能指标,得到性能瓶颈
- 目的:找到性能瓶颈
- 场景:门形场景
- 容量测试
- 概念:在一定的负载和网络环境下,向被测系统的储存设备构造大量的不同的数据,添加一定的负载进行长时间的运行,观察性能指标
- 目的:得到存储设备的容积
- 场景
- 并发测试
- 概念:在一定的软件硬件及网络环境下,向被测系统某个功能模块一次性添加大量的负载,并长时间运行,观察系统的性能指标
- 目的:慢sql,线程锁,锁表
- 集合点:
- 基准测试
- 概念:在一定的软件硬件及网络环境下,向被测系统添加单个或多个负载进行性能测试,验证性能测试环境、性能测试脚本是否存在问题
- 目的:验证性能测试环境、性能测试脚本,得到基础数据
- 稳定性测试
- 概念:在一定的软件硬件及网络环境下,向被测物体系统添加一定时间的负载并模拟用户真实操作时间(2x24\ 7x24)运行,观察系统性能指标
- 目的:稳定性(尽可能模拟真实用户真实场景:环境,环境、长时间)慢sql,内存溢出、宕机
- 配置测试
- 概念:在一定的负载下,通过调整软件、硬件环境让被测系统性能指标最优,得出被测系统软件、硬件配置最佳
- 目的 :得出被测系统软件、硬件最佳配置
- 软件:Tomcat\tedis\mysql
- 硬件:服务器
- 负载测试
-
怎么做性能测试
- 关注点
- 是否满足用户性能需求
- 性能指标
- 最佳用户数和最大业务量
- 慢sql
- 系统内存、线程的合理回收、利用
- 是否可以长时间运行
- 出现问题导致崩溃以后是否可以恢复
- 关注点
-
什么时候做性能测试?
- 项目时间节点
- SIT以后,大部分bug修复完成,保证未修复的bug不会对性能测试产生影响
- 系统声明周期
- 新产品
- 满足用户需求
- 得到性能数据(最大用户数、最佳用户数)
- 扩容
- 用户增减
- 优化
- 生产出现性能问题
- 分析可能会出现性能问题
- 新产品
- 项目时间节点
二、 性能测试流程
-
流程
- 系统测试流程:分析、设计、实现、执行
- 需求分析 —— 由产品经理提供
- 分析被测系统有没有必要进行性能测试
- 分析测试系统的那些功能需要进行性能测试
- 需要的数据(测试数据、指标数据)支撑
- 老产品
- 运维提供(埋点)
- 每个功能模块用户访问量多少?以及访问用户的趋势
- 得出系统现阶段、未来某个时间点用户体量
- 新产品
- 市场竞品
- 参考竞品
- 老产品
- 常见的性能测试场景
- 能力验证
- 在要求平均响应时间小于2秒的前提下,如何判断系统是否能够支持50万用户/天的访问量?
- 基准测试、负载测试、压力测试(可选)
- 规划能力
- 某系统计划在一年内获取用户量达到100w,系统到时候能不能支持怎么多用户量?如果不能需不需要做测试?
- 基准测试、负载测试、配置测试
- 性能调优
- 某某系统上线一段时间以后,相应速度越来越慢,此时应该怎么办?
- 基准测试,配置测试
- 缺陷发现
- 某些曲线只能在高负载的情况下才能暴露出来,如线程锁,内存溢出
- 并发测试、压力测试、稳定性测试
- 应用场景 —— 团购/秒杀
- 基准测试、并发测试、压力测试
- 集合点
- 能力验证
- 需求分析 —— 由产品经理提供
- 系统测试流程:分析、设计、实现、执行
-
设计
- 测试方案
- 测试目的
- 测试范围
- 组织架构
- 测试环境
- 性能测试环境更接近于真实环境
- I\O密集型
- 文件服务器-专门用于存放文件、视频的
- 业务逻辑—— CPU、内步要求比较高
- 测试准备(准备数据)
- 测试设计
- 业务场景分析
- 根据业务需求去设计场
- 根据场景选装测试类型
- 业务建模
- 系统一般情况用户访问量最大的是什么时段
- 二八原则
- 80%的业务量集中在20%的时间段内
- 性能测试关注百分之二十的时间段
- 漏斗模型
- 百分之百的人会登录软件,最后只有百分之20的人会下单购买产品
- 确定测试类型
- 测试工具
- jmeter
- lodarunner
- 启动\结束\暂停\再启动 准则
- 测试 输出
- 业务场景分析
- 测试方案
-
实现
- 脚本的实现
- 基于脚本的调试
- 单用户多迭代:一个线程只循环一次
- 单用户单迭代:一个线程循环多次
- 多用户单迭代:多个线程循环一次
- 多用户多迭代:多个线程循环多次
- 根据场景、业务模型选择对应的工具 实现性能测试的脚本
- 模拟用户真实场景
- 构造多用户
- 模拟用户的界面访问(除去接口HTML意外的js、图片、css请求)
- 等待时间
- 模拟并发数
- 参数化
- 网络带宽
- 数据的容量(容量测试、稳定性测试)
- 是否使用缓存
- 请求数据大小
- 发送请求的客户端与web的服务器不能在同一台电脑上
-
执行
- 搭建测试环境
- 被测系统测试环境
- 测试监控环境
- 测试数据的准备
- 执行性能测试脚本
- 收集性能测试结果
- 如果测试环境无法达到真实环境要求,应当如何开展性能测试?
- 指标换算法
- 利用深夜、维护时间到生产环境做性能测试
- 搭建测试环境
-
结果分析
- 根据执行数据结果进行性能分析,得出性能指标的结果,找出瓶颈
- 存在性能瓶颈,等开发优化,再次运行-分析
- 出性能测试的报告
- 测试目的
- 测试结果
- 测试过程及分析
- 风险说明
三、性能指标
1. RT(respose time) 响应时间 (用户最直观的感受)
- 反应的服务器(被测系统、服务器)处理处理请求的快慢
- 请求或者某个操作从发出的时间到服务器响应的时间的差值就是响应时间
- 服务器进行业务的逻辑处理时间 + 数据(请求数据、响应时间)传输时间
2. TPS(transaction per second) - 每秒事物数:反应了服务器处理的能力 web、数据库处理能力
- 单位时间内服务器处理事物的数量
- 事物:一个请求,或者一组请求
- 计算公式: 用户数(负载)/ (等待时间+RT)
3.QPS(query per second) 每秒查询数:针对数据库而言的
4.FPS(from per second) 每秒发送帧数
5. Throughtput(吞吐量)
- 单位时间内服务器处理请求的量(请求数、字节数)
- 网络带宽
- 网络带宽&计算存储单位
1. 分类
1. Throughtput in - TI 吞: 进入服务器的请求
2. Throughtput out -TO 吐:服务器返回量(响应)
6. HPS 每秒点击数 反应了客户端向服务器刚发送请求的能力
7. 服务器资源使用率
- cpu 使用率建议70%——80%
- 内存:临时存放数据 建议70%——80%
- 硬盘:磁盘队列,磁盘利用率建议不超过80%
- 网络: 影响网络传输速度
1.数据库
命中率
8. 错误率: 0.6%~5%
9. 并发数
1. 用于并发操作用户数量
2. 计算:
- 估算: 最大用户在线数 * (8% — 12%)
- 公式估算
- 使用tps计算
10. PV(page view) 页面浏览量
11. UV(Unique visitor) 独立访客
6.其他
- 性能指标数据 90%的用户、95%的用户满足
四、 jmeter工具
1.初认
- jmeter是apache公司开发的免费软件,java语言开发的
- 基于多线程
- 默认jvm内存设置可以模拟300-500个用户,最大可达到1千个用户
- loadrunner:最大可模拟6.5万个用户;
- jmeter可支持Windows、linux等多个平台运行;可对 程序做功能\回归测试,
2.Jmeter 启动
- 运行:bin目录下 jmeter.bat
3.常见组件
1. 创建http请求结构
-
测试计划 —> 线程组 -> http请求 ->查看结果数
-
- 测试计划 —>添加 —>线程(用户)—线程组
-
- 线程组 —>取样器 —>HTTP请求(配置http请求)
-
- 线程组—>监听器—>汇总报告
2.线程组
3. HTTP请求
4.断言
目的:判断实际输出和预期输出是否一致
- 如果针对的具体http请求的断言,需要通过Http请求选择断言
响应断言- 断言代码体、断言代码状态
大小断言 - 判断响应代码内容、长度
持续时间断言- 判断运行时间是否符合预期
单位 毫秒
5. 三种定义变量的方式
- 用户定义遍的变量
- 用户参数
- 针对多用户,不同的取不同的值,超出后循环取值;
- CSV文件设置
- 用于批量传数据
6. 参数化- 函数
计数器 counter
随机数 Random
时间戳 time
将函数复制到需要用到的地方
7.连接数据库
- 需要添加jar包
选择路径
查询数据库
1调用 JDBC Request
2.编辑sql
3.添加 调试取样器 查看结果
五、进阶
1. if逻辑控制器
将http请求放在控制器下
控制器即可判断
符合条件即运行,不符合条件即跳过
2. foreach 逻辑控制器(循环遍历)
3.循环逻辑控制器
独立控制某个测试项目循环多少次,
相比于线程组更加灵活
4.Xpath 提取器
1.正则表达式
5. 跨越线程组传值_函数
类比约等于设置全局变量
1.使用函数记录:setProperty
2.使用BeanShell取样器存储
3.使用函数 调用:Property
${__setProperty(输出变量,输入变量(如果是个变量记得加¥{}),)}
6.聚合报告—性能测试查看结果
查看统计程序性能
##7.常数吞吐量定时器——设置访问频率