性能测试
性能:软件质量属性中效率特性
概念:使用自动化工具,模拟不同场景,对软件各项性能指标进行测试评估
时间特性:系统处理用户请求的响应时间
资源特性:CPU、内存、磁盘IO
自动化工具
模拟不同场景
软件各项性能指标
基准测试
侠义:单个用户进行业务场景的测试,并统计性能的各项指标
广义:在某一时刻进行性能测试建立一个已知的性能水平,当软硬件发生变化时在测试,观察变化对其性能的影响
负载测试
通过逐步增加系统负载,测试系统性能的变化,在满足性能指标的前提下,系统所能承受的最大负载量的测试。
找到系统的最优负载和最大负载。最大负载一般项目组内部知晓,不会对外公布。普通用户看到的系统最大能力,一般是测试得的最优负载。
稳定性测试
在服务器稳定运行的情况下,进行长时间的测试,保证服务器正常运行。
长时间:1天、一周
JMeter
作用域的原理:
按照jmeter测试计划的树形结构来定义作用域(类似于python的缩进)
作用域的原则:
- 取样器是jmeter的核心,不作用于其他组件
- 逻辑控制器,只对子节点起作用
- 对于其他组件:如果父节点是取样器的话,只对父节点起作用。
jmeter第一个案例
- 启动jmeter
- 在"测试计划"下添加“线程组”
- 在“线程组”下添加“HTTP请求”取样器
- 填写“HTTP请求”的相关请求数据
- 在‘线程组’下添加‘查看结果树’监听器
- 点击‘启动’按钮运行,并查看结果
线程组的特点
- 模拟多人操作
- 线程组可以添加多个,多个线程组可以并行或串行
- 取样器(请求)和逻辑控制器必须依赖线程组才能使用
- 线程组下可以添加其他元件下组件
线程组分类
普通线程组:用于发送业务请求的线程组(受并行、串行配置的影响)
setup线程组:在所有的线程组之前执行(不受并行、串行配置的影响)
teardown:在所有线程组之后执行(不受并行、串行配置的影响)
线程组属性
线程数:需要模拟的虚拟用户数
ramp-up time:模拟的虚拟用户数全部启动所需的时间
- 模拟性能测试的场景,更接近用户的使用习惯(用户慢慢进入系统)
循环次数: - 设置为固定次数n时:配置脚步运行时发送请求的次数
- 设置循环次数为“永远”时,脚步会一直运行下去,不停止
调度器: - 一般与循环次数为“永远”配合使用
- 持续时间设置为n时:脚步的请求发送时间为n秒
线程数:代表并发用户数,体现服务器的负载量
循环次数:代表执行时间
Jmeter参数化
用户定义的变量
1.配置方法
- 添加路径:测试计划—线程组–配置元件–用户定义的变量
- 参数设置:
参数名:参数值
在HTTP取样器中应用:${参数名}
2.在测试计划中配置
某支付系统,需要用1000个不同的用户登录,并使用不同的测试金额数据访问支付接口?
答:1. 定义CSV数据文件,存放1000个不同的用户账号密码
2.定义线程组,将线程组的线程数设置为1000
3.添加CSV数据文件设置,读取CSV数据文件中的账号密码
4添加HTTP请求(用户登录的请求),在请求中引用CSV数据文件设置中的用户账号、密码参数
5添加HTTP请求(支付请求),使用counter函数作为支付金额的参数
6添加查看结果数观察结果
JMeter断言:通过自动化的手段对请求的响应数据进行自动校验
响应断言(断言一定是在HTTP请求的子节点下)
性能:重点在于分析被测系统是否能满足特定的业务需求场景(时间、资源)
Jmeter初始化工作
- 创建测试用例结构
- 设置HTTP请求默认值
- 用户定义的变量
- 添加监听器-查看结果树
- 添加监听器-聚合报告
1.取样器-HTTP请求 发送HTTP请求
2.配置元件-HTTP请求默认值 设置HTTP请求的默认参数
3.配置元件-用户定义的变量 定义变量,可供后面引用
4.后置处理器-JSON提取器 提取JSON响应结果中的内容
5.断言-响应断言
6.断言-JSON断言 对响应结果进行断言
7.监听器-查看结果树 用于Jmeter脚本调试时查看运行日志
8.监听器-聚合报告 用于Jmeter性能测试时查看运行结果
1.Http信息头管理器–对请求消息的消息头进行修改
2.使用HTTP请求默认值写入协议、域名、端口、编码格式
3.编写脚本时,每个用例一个独立的线程组 ----改为名字、添加断言
4.当脚本涉及登录及后续相关操作时,需要使用提取器将登录后的token信息提取出来,在后续请求中加上token信息
- 通过Python脚步构造10W条数据
#导包
import pymysql
#创建连接
conn = pymysql.connect(host="192.168.85.139",user="root",password="Lagou@1234",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()
- 修改对应的Jmeter脚本,将登录时的密码进行参数化
{"username":"test${__Random(100000,149728)}","password":"123456"}
- 监控服务器的资源配置
将ServerAgent压缩包上传到待监控的服务器
对ServerAgent进行解压缩,并赋权限
运行代理监控程序: ./startAgent.sh
在Jmeter中添加监听器,并配置