性能测试
这篇文章总结了一下我学习的性能测试部分的第六天的部分知识, 文章包含昨日回顾,今日目标,性能测试脚本编写, 性能测试环境准备和执行测试脚本(只展示了登录部分的并发测试)。不足之处希望大佬指正!
1. 性能测试Day06
1.1 昨日回顾
(1)Jmeter图表(Jmeter第三方插件)
- 安装插件管理器
- 从Jmeter官网上下载Plugins-manager.jar的包
- 将JAR包放到LIB/ext目录
- 打开Jmeter,就可以使用插件管理器
- 安装插件
- 打开Jmeter,选项 —— Plugins Manager
- 进入 available plugins,搜索并选中指定的插件
- 右下角有一个安装按钮(Install and restart),点击会自动下载安装
- 常用插件:
- TPS:每秒事务数
- Throughout Byte per second:每秒上传下载的子节点
- PerForm插件:监控服务器上的所有资源指标
- 下载ServerAgent的软件包
- 在需求监控的服务器上安装——解压缩
- 在需要监控的服务器上运行,执行startAgent.bat(windows)、startAgent.sh(linux)
- 进入Jmeter,添加PerForm插件,配置需要监控的资源指标
- 启动脚本运行,资源指标会自动监控
(2)Jmeter并发数的计算
通过运营数量来统计(日活量、请求量。。。。)
- 第一种计算方法:TPS = 一段时间内总的请求量 / 总时间
- 第二种计算方法(二八原则):
- TPS = 一段时间总请求量 * 80% / 总时间 *20%(一段时间可以是一天、一小时、10分钟,时
间维度越小并发量的值越准确) - 该结果可以用于稳定性测试的TPS并发量
- TPS = 一段时间总请求量 * 80% / 总时间 *20%(一段时间可以是一天、一小时、10分钟,时
- 第三种计算方法:
- TPS = 峰值时间段的总请求量 / 峰值时间 * 系数(系数可以是2、3、6、10,取决于项目组自
己的要求) - 该结果可以用于压力测试的TPS并发量
- TPS = 峰值时间段的总请求量 / 峰值时间 * 系数(系数可以是2、3、6、10,取决于项目组自
3)轻商城的项目
- 熟悉项目(功能架构、技术架构、数据库的关键表、项目部署)
- 项目需求分析
- 确定性能测试的需求指标(客户/产品给需求;通过运营数据分析)
- 确定性能测试的测试点(业务功能——用的多/重要的/特殊时间节点/主流程发生变化、技术
——资源消耗多的) - 确定目的:
- 单个接口的性能需求指标
- 多个接口组合(按照用户的业务场景)的性能需求指标
- 模拟用户的业务场景,进行长时间的稳定性测试
- 编写性能测试计划
- 测试目的—— 对应需求分析中的测试目的
- 测试范围——对应需求分析中的测试点
- 测试策略——对于性能的测试点,使用什么样的方法能达成对应的测试目的
- 时间、人力、进度的安排
- 编写性能测试用例
- 根据测试目的和测试点来进行编写
- 单个接口的性能需求指标(针对每个测试点分别写一个测试用例)
- 多个接口组合(按照用户的业务场景)的性能需求指标(针对每个业务场景写一个测试
用例) - 稳定性测试(稳定性的测试用例)
- 根据测试目的和测试点来进行编写
1.2 今日目标
- 性能测试脚本编写
- 准备性能测试环境和数据
- 运行性能测试脚本,并监控数据指标
1.3 性能测试脚本编写
常用的Jmeter元件:
编写脚本:
基础元件:
1、HTTP信息头管理器 —— 对请求消息的消息头进行修改
2、使用HTTP请求默认值写入协议、域名、端口、编码格式,在HTTP请求取样器中只需要写入路径、
请求方法、参数即可。好处是:在测试时,如果换了测试环境,直接修改HTTP请求默认值即可,不需
要修改所有脚本
3、编写脚本时,每个用例一个独立的线程组
线程组名称建议修改为用例名称
HTTP请求取样器的名称修改为用户名称
每个HTTP请求需要添加断言
如果请求URL中的参数可能为中文,建议将参数放入到下面参数列表中,并将中文参数勾选“编码”
4、当脚本涉及到登录及后续相关操作时,需要使用提取器将登录后的token信息提取出来,在后续请求
中加上token信息,这样后续请求才是登录状态
5、编写jmeter脚本的过程,如果HTTP请求之前调试过,可以直接拷贝(ctrl+c —— ctrl+V)到新的线
程组使用
6、结算下订单的脚本编写:
对于结算的操作:涉及到两个接口 —— 勾选商品,结算按钮
在结算下订单脚本测试前,需要准备好测试数据——购物车中需要有现成的商品
7、编写脚本的过程中,常用的静态数据,可以先写到用户定义的变量中,在脚本中进行引用。好处
是:后续如果脚本修改数据,可以直接修改变量,不需要去每个脚本中进行修改
8、业务流程的脚本:只需要将前面单接口脚本调通,按照业务流程的接口顺序将前面的接口脚本拷贝
过来即可
1.4 性能测试环境准备
特点:
- 性能测试的环境独立使用 —— 其他测试人员不可用使用该环境
- 性能测试的环境要求与用户真实使用的环境完全一致
- 硬件环境:包括硬件服务器的台数、硬件服务器的配置、网络环境
- 软件环境:
- 软件版本:所有的操作系统、数据库、被测程序、第三方软件等软件
- 软件配置:所有的操作系统、数据库、被测程序、第三方软件等软件
- 使用场景的一致性
- 测试数据:数据量必须与用户环境一致
- 业务场景:发送请求的负载量与用户环境一致
如何达成性能测试环境与生产环境一致:
- 硬件环境 —— 找运维人员申请
- 软件环境 —— 所有的软件版本和配置可以找开发人员要,然后自己安装
- 使用场景一致性
- 测试数据:需要测试自己构造(通过python脚本构造相同数量级的数据)
- 业务场景:通过需求分析和运营数据获取主要的业务操作和对应的并发指标
测试数据的准备(插入10万条数据):
在性能测试时,相同的SQL语句在不同的数据库数据的基础,执行时间不同,因此需要构造与用户实际
环境相同数量级的数据
#导包
import pymysql
#建立连接
conn = pymysql.connect(host="192.168.80.132",user="root",password="xxxxxx",database="litemall",port=3306,charset='utf8')
#建立游标
cursor = conn.cursor()
#编写SQL语句
#goods_sql这条语句并不正确 (这里只需理解代码的流程就行)
goods_sql = "第一条sql"
goods_attr_sql = "第二条sql"
goods_product_sql = "第三条sql"
goods_spec_sql = "第四条sql"
#循环执行SQL语句并提交事务
goods_start = 200000
for i in range(100000):
goods_id = goods_start + i;
print("插入第{}条数据,ID为{}".format(i+1,goods_id))
sql = goods_sql.format(goods_id,goods_id,goods_id)
cursor.execute(sql)
sql = goods_attr_sql.format(goods_id)
cursor.execute(sql)
sql = goods_product_sql.format(goods_id)
cursor.execute(sql)
sql = goods_spec_sql.format(goods_id)
cursor.execute(sql)
conn.commit()
#关闭游标
cursor.close()
#关闭连接
conn.close()
select * from litemall_goods where id = ‘1181000’
在插入数据前的查询时间:0.003
在插入数据后的查询时间:0.009
1.5 执行测试脚本
执行测试脚本的测试机:
执行性能测试前,需要根据要模拟的业务负载量来选择适当的测试机
- 单机执行
- windows:图形化界面、操作简单;资源使用低,能模拟的并发数低
- linux:命令行操作,操作难度高;资源使用率高,能模拟的并发数高
- 分布式执行
- 如果单台测试机(无论windows或linux)都无法满足负载量要求时,需要使用分布式的方
法,使用多台测试机一起来模拟特定负载量的业务
- 如果单台测试机(无论windows或linux)都无法满足负载量要求时,需要使用分布式的方
性能测试脚本执行:
登录脚本:
1、在性能测试时需要模拟不同的用户进行登录操作,因此需要提前构造用户数据
#导包
import pymysql
#创建连接
conn = pymysql.connect(host="192.168.80.132",user="root",password="xxxxxx",database="litemall",port=3306,charset='utf8')
#创建游标
cursor = conn.cursor()
#添加用户的SQL语句
user_sql = "INSERT INTO `litemall`.`litemall_user` (`id`, `username`, `password`, `gender`, `birthday`, `last_login_time`, `last_login_ip`, `user_level`, `nickname`, `mobile`, `avatar`, `weixin_openid`, `session_key`, `status`, `add_time`, `update_time`, `deleted`) VALUES ('{}', '{}', '$2a$10$SrnVvS/D6N0XNd4MHNjQR.W3VUfJhOdBylPC3Ika0zTvmxyiJ52AS', '0', NULL, '2020-08-14 12:00:58', '192.168.91.1', '0', 'xiaoh', '{}', 'https://yanxuan.nosdn.127.net/80841d741d7fa3073e0ae27bf487339f.jpg?imageView&quality=90&thumbnail=64x64', '', '', '0', '2020-08-12 14:14:37', '2020-08-14 12:00:58', '0');"
#循环插入数据
user_start = 100000
for i in range(100000):
user_id = user_start + i
username = "test" + str(user_id)
mobile = "13012" + str(user_id)
print("插入第{}条数据ID为{}".format(i+1,user_id))
sql = user_sql.format(user_id,username,mobile)
cursor.execute(sql)
conn.commit()
#关闭游标
cursor.close()
#关闭连接
conn.close()
2、修改对应的Jmeter脚本
将登录时用户名密码进行参数化,确保每次执行登录请求时,使用不同的用户名进行登录
{“username”:“test${__Random(100000,200000,)}”,“password”:“xxxxxx”}
3、监控服务器的资源配置
- 将ServerAgent程序;压缩包上传到待监控的服务器
- 进入到linux服务器,对ServerAgent程序进行加压缩,并赋权限
- 运行代理监控程序: ./startAgent.sh
- 在Jmeter中添加监听器——PerForm图表,并配置
4、模拟5个用户并发执行,记录对应的性能指标
从当前指标来看,5个用户并发时TPS为18.3,响应时间为271ms;
由于响应时间在需求许可范围内,但TPS达到需要要求的TPS(20),因此需要进一步加大负载量测试
系统性能
资源指标在里面先忽略(因此当前虚拟机资源不足,未执行性能测试时内存使用率就已经达到80%)
5、模拟10个用户并发执行,记录对应的性能指标
当前系统的TPS为19.5(接近20),响应时间为506ms(满足需求<3s)
问题是:资源使用率中CPU达到96%,内存达到82%,说明当前系统资源不足,需要提升系统配置
进入首页脚本:
添加购物车—查看购物车—商品结算—下订单—查看订单脚本:
准备工作:
1、5个用户、10个用户。。。。,用相同/不同的账号密码来登录?
2、与前面登录脚本一样,使用随机用户名进行登录?例如:前缀test + random(100000,200000)
3、修改指定商品的库存量,库存量改大(保证在性能测试的过程中不能库存耗尽)
加入购物车脚本:…
结算并下订单脚本:
准备工作:为每个用户创建对应的收货地址
执行测试脚本:…
业务流程的测试:…
稳定性测试:…