[jmeter-商城测试]
项目准备
项目介绍
- 背景 : 电商平台,主要测试接口性能,给出优化建议,保证2-3年满足用户使用需求
- 技术架构 :
- 支持微信小程序,web访问,采用前后端分离的架构设计
- 前端 : 以node.js为核心的vue.js前端技术框架
- 后端 : springboot+springcloud+springMVC+springData(spring全家桶)+mysql+redis
项目数据库
- 熟悉方法 :
- 1 : 借助navicat工具,表名-右键-设计表查看
- 2 : 使用show create table 表名; 查看表的设计信息
项目环境
-
什么是搭建项目环境 : 准备项目工作所需要的软件(linux+应用服务器(nginx)+数据库(mysql)+项目代码)
-
如何获取项目环境 : 通过开发(项目经理,测试主管)获取指定版本的项目环境 /开发运维协助搭建
-
搭建环境常用命令(linux)
- 查看当前网络 : ifconfig(linux),ipconfig(win)
- 测试网络 : ping 目标ip 地址(局域网测试时,防火墙必须关闭)
- 修改文件(目录)权限:
- chmod 777 文件名
- chmod a+x 文件名 给文件添加执行权限
- chmod -R 777 目录名 -R : 递归访问文件的所有子内容
- 压缩,解压缩:
- zip : unzip xxx.zip
- tar :
- tar -zcvf xxx.tar.gz 打包的文件/目录 (压缩命令)
- tar -zxvf xxx.tar.gz -C 指定解压的位置(解压缩命令)
- 查看系统中进程
- ps aux | grep 关键字
- 查询的结果必须是两条以上,才表示有响应的进程运行在系统中
- ps aux | grep 关键字
- 指定进程杀死
- kill -9 进程id
- 启动脚本 :
- bash xxx.sh
- 添加执行权限后启动 : ./xxx.sh
- scp 超级拷贝 (需要依赖ssh)
- 语法 : scp -r 待拷贝的文件名/目录名 目录主机用户名@目标主机ip地址 : 绝对路径存储位置
- eg : scp -r ServerAgent.zip root@172.16.28.5:/home/admin/test
- 语法 : scp -r 待拷贝的文件名/目录名 目录主机用户名@目标主机ip地址 : 绝对路径存储位置
-
轻商城项目启动步骤
- 将litemall商城虚拟机压缩包,解压缩到系统中
- 使用VM工具 打开解压缩目录中 .vmx
- 点击’未列出’,输入用户名和密码
- 登录成功后 linux服务器需要时间启动nginx和mysql服务器的程序
- 获取linux的ip地址,保证windows能够ping通linux
- 修改C:\Windows\System32\drivers\etc\hosts 下的hosts文件
- 写入 : 服务器IP地址 : www.litemall360.com
- 建议不要在目录中改,先拷贝,后改正覆盖原文件
- 成功启动页面:

项目实战
性能测试流程
- 性能测试需求分析
- 性能测试测试计划和方案
- 编写性能测试用例
- 搭建测试环境
- 编写测试脚本
- 服务器性能监控
- 分析和调优
- 生成测试报告和总结
性能测试常用指标
- 响应时间 (网络时间+用用服务器处理时间------查看聚合报告 : 平均值 , 95%)
- 并发数
- 吞吐量(设置常数吞吐量定时器----查看聚合报告吞吐量)
- 错误率(看聚合报告: 吞吐量)
- 服务器资源利用率(CPU,磁盘,网络,内存)
性能测试需求分析
- 目的 :
- 熟悉待测项目,找出性能测试的目标
- 挑选性能测试的模块:
- 用户频繁使用的模块
- 项目的核心业务/复杂度较高的模块
- 修改过的核心模块,频繁使用模块

- 确定核心指标和预期值:
- 有文档看需求文档
- 没有文档,参考历史数据/竞品数据

测试计划与方案
- 测试什么?
- 测试背景
- 测试目的
- 测试范围
- 怎么测试?
- 基准测试,负载测试(分别模拟1,5,10,30,50,100用户进行负载,看各项指标是否符合需求),稳定性测试(验证系统是否存在内存溢出等问题)
- 谁来测试?
- 测试人员工作进度,内容安排
- 其它
- 风险的预估和解决方案(环境风险,数据风险-构造数据时间太长,交付风险)
- 交付清单
- 准入准出准则
测试用例设计
- 编写性能测试用例

- 根据给出需求,写入用例描述
- 采用逐步加压的方式,扩大并发用户数,查看TPS和响应时间
- 当测到预设的目标时,一般会继续加大压力,找出性能的最大负载
- TPS借助常数吞吐量定时器修改对应数据进行测试
- 测试 服务器资源利用率,在服务器中添加监听工具ServerAgent,jmeter中使用插件PerfMon监听.
编写测试脚本
- http请求默认值(配置元件中):
- 作用 : 测试计划中的所有请求,均可以共用http请求默认值中设置的内容(请求方法,url,端口号)
登录
- 使用的端口号为8080
- 使用url为:http://www.litemall360.com:8080/wx/auth/login
- 步骤:
- 新建http请求默认值填入http://www.litemall360.com

- http信息头管理填入数据类型content-type:application/json;charset=UTF-8
- 在http请求中填入请求方法post,路径名,请求参数

- 运行后查看结果树是否登陆成功返回相应的值

- 新建http请求默认值填入http://www.litemall360.com
进入首页
- 首页url : http://www.litemall360.com:8080/wx/home/index
- 方法GET
- 复写登录线程组,执行结果显示各项产品数据

搜索商品
- 搜索商品url : http://www.litemall360.com:8080/wx/goods/list?keyword=蔓越莓曲奇 200克&page=1&limit=10&categoryId=0
- 请求方法 : GET
- 运行线程组获得响应数据

查看商品详情
- 查看商品详情url : http://www.litemall360.com:8080/wx/goods/category?id=1005000
- 请求方法 : get
- 填入http请求并获取响应数据

添加购物车
- 获取url请求方法为 : http://www.litemall360.com:8080/wx/cart/add

- 填入请求体数据


- 加入购物车需要登录,线程组中登录通过json提取器提取登录token的值,将token的值添加到http信息头管理器中方便添加购物车下一步使用


- 启动线程查看结果(我这里总是报参数错误),实际数据应与响应中的一致
查看购物车
- 与加入购物车一致(需先登录提取token)
- 启动后结果

商品结算,提交订单,我的订单等步骤同理
- 商品结算url : http://www.litemall360.com:8080/wx/cart/checkout?cartId=0&addressId=0&couponId=0&grouponRulesId=0

业务流程

测试用例(一般一个是1-3min)
用户并发数与事务响应
- 一般实际工作中,一条测试用例,一般测试1-3分钟,测试3-5轮取平均值,记录到测试用例中
- 测试数据 : 设置常数吞吐量定时器,假设目标吞吐量为20TPS , 每分钟吞吐量为20*60=1200 , 吞吐量值 = 每分钟吞吐量/线程数
- 期望性能测试结果总结 : 当线程并发数为30时,TPS的值达到20.2,平均响应时间为384ms,小于预设的性能指标,通过本次性能测试


查看相对应的聚合报告

并发用户数与应用服务器

- 查看服务器资源利用率:
- 在服务器安装启动配合jmeter监听的工具(serveragent)
- 在jmeter中添加组件,监听CPU,内存,磁盘,网络使用率
- 将serveragent导入linux可以更改虚拟机设计开启共享文件夹即可

- 添加perfmon

- 方便监听,单独使用组件进行测试.填入本机ip与辅助监听工具serveragent的端口号

- 总结:预设的性能指标,通过本次性能测试,当并发线程数为50时,cpu的使用率为100%,超出了预设的80%,性能测试未通过
- 应用服务器与数据服务器存储在同一主机,省略测试过程
分析与调优
调优原则
按照由易到难:
- 硬件资源(CPU,内存,磁盘)
- 网络资源
- 中间件(应用服务器),数据库配置
- 源代码,数据库脚本
- 系统架构设计
硬件资源监控
工具
- 结合服务器安装的Serveragent工具,配合jmeter的组件perfmon,实现服务器硬件资源监听
命令
- top(当前linux系统中,实时查看cpu,内存的命令,类似于win下的资源管理器),q退出

free
- 作用 : 查看系统内存使用情况
- -m是以MB为单位,-g是以G

vmstat
- 作用 : 查看cpu和内存的使用情况
- r : 等除cpu时间片的进程数,如果这个数量长期大于逻辑cpu的数量,需要考虑增加cpu
- b : 等除cpu以外的其它资源的进程数

sar
- sar -n DEV 1 1 查看网络设备的使用情况,1s1次,共发送一次
- sar -n EDEV 1 1 : 查看网络发送,接收数据包过程中丢包,坏包情况
- txpck是发送数据包

iostat
- 查看系统中磁盘读写使用情况

应用服务器,数据库配置
- 应用服务器
- Apache : 默认最大连接数256
- Nginx : 默认最大连接数1024 受linux系统默认打开的最大文件个数限制(ulimit -n)
- Tomcat : 默认最大连接数200
- 能够定位性能瓶颈是由 应用服务器的默认最大连接数限制即可
- 数据库
- MySQL : 默认最大连接数是151
慢查询
- 由于数据库中数据量较大,对应字段没有设置能提高效率的手段,容易导致查询慢等
- 实现步骤 :
- 开启mysql慢查询 开关(默认关闭off)
- 设置慢查询 阈值(默认阈值为10s)
设置与开启
- 查看mysql慢查询开关状态及日志位置
- show variables like ‘slow_query%’;
- 使用SQL语句,开启MySQL慢查询开关
- set global slow_query_log = ‘ON’;
- 查看mysql默认的慢查询阈值(默认是10)
- show variables like ‘long_query_time’
- 修改 慢查询阈值
- set global long_query_time=1;
- mysql带有缓存命中率的机制,对于相同数据的反复查询,可以借助缓存提高查询效率,一旦内存被清理,查询速度依然慢
- 查询日志文件命令 : tail -f 日志文件名.log
JVM
代码常见问题
- 内存泄露(memory leak) : 内存不释放,代码需要使用内存,进行申请,使用结束后没有释放或释放不及时
- 内存溢出(out of memory) : 内存不够用内存使用不当,导致系统的剩余内存不足以运行 应用程序
配置JVM监控工具
- 什么是JVM
- 是java虚拟机
- 监控jvm的工具(监控栈)
- jvisual VM 能监控JVM(java虚拟机)
java -jar
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.73.154
-Dcom.sun.management.jmxremote.port=10086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
litemall-all-0.1.0-exec.jar
------------------------------------
真正运行拼一行
java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.73.154 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false litemall-all-0.1.0-exec.jar
1. 添加参数,启动litemall服务器先确认win与linux系统间能够ping通使用ps aux | grep litemall 查询当前轻商城项目的服务器 使用kill -9 杀死原有服务器使用带参数的命令,重启litemall借助浏览器填入地址查看服务器是否重启成功
2. 在jdk安装bin目录下,找到JvisualVM.exe文件
3. 双击远程,写入litemall服务器ip地址
4. 在新生成的项目中,添加JMX连接
5. 弹出的页面中,设置端口号
6. 双击选择监视标签,看到堆的数据
-
步骤

- 安装目录中打开jvisualVM

- 填入自己linux的ip地址

- 添加JMX的连接

- 填入端口

- 终端运行命令
java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.73.154 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false litemall-all-0.1.0-exec.jar
- 打开连接的的JMX页面

- 进入轻商城页面,看是否能正常打开

- 安装目录中打开jvisualVM
内存溢出演示



- 数据如果再大一些可能会出现内存溢出的问题
测试报告
- 包含性能测试目的,目标,计划和实施情况
- 编写的测试用例,脚本
- 分析和调优的过程
- 总结和经验
