有效的性能测试能给研发、运维团队提供有效的容量规划能力、系统风险识别、系统瓶颈识别、性能调优指导。
1、性能测试基础知识回顾
1.1 需求分析与测试设计(性能需求目标 + 业务模型拆解)
1、根据具体的性能测试需求,确定测试类型以及压测的模块(web/mysql/redis/系统整体)
2、前期要与相关人员充分沟通,初步确定压测方案与具体性能指标
3、QA 完成性能测试设计后,需产出测试方案文档发送邮件到项目组,并且再次与相关人员沟通(或者组织性能测试评审),确认是否满足需求
1.2 环境设计与搭建
1.3 测试数据准备(基于模型的数据准备)
1、接口请求参数:自己构造/日志获取/上下关联;
2、数据表的数据填充;
3、如果是多接口,则需结合业务场景设计请求比例。
1.4 性能指标预期(性能需求目标)
1、每秒请求数(QPS)
2、请求响应时间(最小、最大、平均)
3、错误率
4、机器性能:cpu idle 30%、memory 无剧烈抖动或者飙升
5、压测过程中接口功能是否正常
不同性能测试方式下指标预期会有差异
1.5 发压工具配置及脚本编写(压力策略)
1、JMeter 工具介绍
(1)集成包,解压即可使用,Windows、Linux 通用(依赖 java 环境)
(2)jmx 脚本为 xml 文件,Win、Linux 环境均可直接运行
(3)多线程并发
(4)运行完脚本会生成 jtl 日志,可在 Win 环境界面工具中查看、统计
2、脚本的编写
(1)http 请求
(2)其他
3、命令:(1)启压:./jmeter -n -t hb.jmx -l hb.jtl
1.6 测试过程(预计的前置准备过程,和压测时间点规划)
压测过程说明/共识
1、测试前环境检查:记录机器参数
2、起压:根据被压情况,调节并发量到合适的情况
3、查看记录各项性能指标
(1)nginx 日志查看每秒请求数
(2)查看 nginx 错误请求
(3)查看机器参数:cpu idle、mem 等
(4)查看 db、cache 等数据是否写入正常
(5)访问接口,查看功能是否正常
1.7 结果分析与测试报告
1、根据测试过程中记录的各项参数,结合压测工具产生的日志,对测试结果进行分析,并产出测试报告
2、测试完成后,及时与相关人员沟通,确认是否满足需求
3、发送测试报告邮件
电商系统梳理拆解
性能项目按目标场景分类:
新上线系统性能测试:要求容量测试,系统最大容量。
系统升级性能测试类:和基线版本对比,性能不下降。
新系统性能优化类:伴随调优目标的性能测试。
在本次实战中
我们可以定义为新系统上线的容量测试。
目标为获取系统最大容量
测试场景:基准场景(单交易容量场景)
容量场景(递增场景、最大 TPS、最快响应时间场景)
测试工具选型
压测场景:单接口/复杂事物 => JMeter 场景构造
压力需求:< 1000 QPS or 万级以上 => JMeter 分布式支持
是否周期性:JMeter Jmx 场景文件,数据驱动,结果落库
二次开发需求:JMeter 开源插件化思想,支持 Thrift,Dubbo 等多种协议。可以快速平台化。
问题支持:JMeter 开放社区,广泛使用。
- | JMeter | LoadRunner |
---|---|---|
开发语言 | 纯 Java 开发 | 使用 C 语言开发 |
支持应用 | 对 Java 为主的系统支持较好 | 支持比较全面 |
是否收费 | 开源免费 | 商业软件 |
学习成本 | 应用简单,上手快,Java 自定义测试计划 | 功能复杂,学习成本高 |
协议支持 | 支持常见的 HTTP/FTP/SMP等 | 支持较全面 |
自定义测试 | 支持使用 Java 编写 Sample | 使用完善的组件进行定制化测试 |
组件功能 | Thread Group,Samplers,Listeners,Pre&Post processors | 一套完整的测试组件,比如 VU Generator,Contr Load generator,Load calculator 和 protocol |
被测系统分析
整体服务存储分为:
Mysql:关系型数据存储,商品、订单等数据
Redis:魂村+部分存储,例如验证码
MongoDB:例如用户关注品牌等存储
在压测过程中,对不同方式存储需不同关注
压测目标预估
流量预估模型,常见方式:
取出生产数据并统计
从生产环境取数据,可取出秒、分、时、天、月、年。
如下图所示,取从2018年3月30日到2018年4月23日。
再从如上图中取出业务量相对高的一天,查看一天内的业务趋势。如下图所示:
1、普通日的比例场景
以天为单位计算每天的总业务量比例。
实际中也可以直接取 nginx 配置
巧用 Shell 技巧
cat var/log/nginx/access.log | awk '{print $7}'| sort | uniq -c | sort -k 1 -nr | grep -v css | grep -v js | grep -v swagger
# sort 把相同的url聚合在一起
# uniq -c 统计每个请求的数量
# sort -k 1 按照第一列结果排序
# r 倒序
电商系统性能方案拆解
模块级性能方案 -> 登陆场景测试
基础的Jmeter UI 功能配置演示:
HTTP Default Header,Header 信息获取和设置
HTTP Default 做 IP/HOST 统一,便于替换
CSV 参数化。请求的 IP/HOST 以及 用户名/密码做参数化数据驱动
参数传递,后置处理器使用传递验证码到注册接口
使用前置处理器自动生成规范内测试手机号
Cookie 验证结果保存做数据构造