性能测试知识点
1.性能测试概念:
通过自动化测试工具模拟多种正常,峰值以及异常负载条件来对系统的各项性能指标进行测试
2.性能测试条件
- 系统基础功能测试验证完成
- 系统趋于稳定
3.性能测试基本流程
- 需求分析
(1)系统信息调研
(2)业务信息调研
(3)性能需求评估
判断是否进行性能测试主要从下面两个方面进行思考:
业务角度:
系统是公司内部 or 对外?系统使用的人数的多少?此时可进行性能测试来排查问题。
系统角度:系统又可以从以下3个方面进行分析
a.系统架构:
如果一个系统采用的框架是老的系统框架(通常大公司都有自己的统一框架),只是在此框架上增加一些应用,其实是没有必要做性能测试,因为老框架的使用肯定是经过了验证的。如果一个系统采用的是一种新的框架,可以考虑做性能测试。
b.数据库要求:
很多情况下,性能测试是大数据量的并发访问、修改数据库,而瓶颈在于连接数据库池的数量,而非数据库本身的负载、吞吐能力。这时,可以结合DBA的建议,来决定是否来做性能测试。
c.系统特殊要求:
从实时性角度来分析,某些系统对响应时间要求比较,比如证券系统,系统的快慢直接影响客户的收益,这种情况就有作并发测试的必要,在大并发量的场景下,查看这个功能的响应时间。从大数据量上传下载角度分析,某些系统经常需要进行较大数据量的上传和下载操作,有必要进行性能测试,确定系统能处理的最大容量
(4)确定性能测试点
(5)确定性能指标
- 测试准备
(1)测试环境准备:
a)系统运行环境:这个通常就是我们的测试环境,有些时候需求比较多,做性能测试担心把环境搞跨了影响其它的功能测试,可能需要重新搭建一套专门用来做性能测试的环境。
b)执行机环境:这个就是用来生成负载的执行机,通常需要在物理机上运行,而物理机又是稀缺资源,所以我们每次做性能测试都需要提前准备好执行机环境。
(2)测试场景设计:根据性能需求分析来设计符合用户使用习惯的场景,场景设计的好不好直接影响到性能测试的效果。
(3)性能工具准备:
a)负载工具:根据需求分析和系统特点选择合适的负载工具,比如LR、Jmeter或galting等
b)监控工具:准备性能测试时的服务器资源、JVM、数据库监控工具,以便进行后续的性能测试分析与调优。
(4)测试脚本准备:如果性能测试工具不能满足被测系统的要求或只能满足部分要求时,需要我们自己开发脚本配合工具进行性能测试。
(5)测试数据准备:
a)负载测试数据:并发测试时需要多少数据?比如登录场景?
b)DB数据量大小:为了尽量符合生产场景,需要模拟线上大量数据情况,那么要往数据库里提前插入一定的数据量。这可能需要花费一些时间,特点是关联系统较多,逻辑复杂的业务可能同时涉及多张表。
(6)其它:如果需要其它其它关联系统或专业人士如DBA配合的,也需要提前进行沟通。
- 测试执行
(1)人工边执行边分析
(2)无人值守执行性能测试
- 结果分析与调优
- 报告与总结
自动化测试工具Jmeter
jmeter能够完成功能:
- 用于对服务器,网络或对象模拟巨大负载
- 通过创建带有断言的脚本来验证程序是否能返回预期的结果
优缺点:
优点:开源,跨平台,支持多协议 小巧且功能强大
缺点:不支持IP欺骗 无法验证JS程序和UI界面
工具使用:
参照项目点餐系统(MVC框架,RESTfull风格)进行测试
(一)添加协议及接口相关配置信息
(1)添加http请求
(2)新增监听器,查看测试结果
(二)线程组
设置属性:
(1)线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
(2)Ramp-Up时间(秒)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
(3) 循环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10x100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
(4)Delay Thread creation until needed:直到需要时延迟线程的创建。
(5)调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)
持续时间(秒):测试持续时间,会覆盖结束时间
启动延迟(秒):测试延迟启动时间,会覆盖启动时间
启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。
结束时间:测试结束时间,持续时间会覆盖它。
(三)并发和顺序执行
并发执行
顺序执行
(四)特殊线程组
- setUp线程组:最优先执行的线程组
- tearDown线程组:最后执行的线程组
(五)http请求默认值
http请求默认值的设置,将被复用的内容进行封装
(六)信息头管理器
新增修改实现时 所提交数据都为json格式 需要说明所提交数据类型
(七)参数化
动态获取,设置或生成数据,满足多次大量提交,避免每次测试都要修改
实现参数化:
- 用户定义的变量
- CSV数据文件设置
步骤:
1使用CSV文件存储测试数据
2编写被复用的菜单新增脚本模板
3关联脚本与数据(将文件数据导入脚本)
- 用户参数
步骤:
1编写被复用的菜单新增脚本模板
2使用用户参数存储测试数据
3将数据导入脚本模板
4设置执行次数
- 函数
(1)计数器函数:_counter
TRUE:每个用户都有自己的计数器
FALSE:所有用户共用一个计数器
(2)随机数函:_Randm
参数1:取值范围最小值
参数2:取值范围最大值
(3)时间函数:_time
无参:获取距离1970/1/1 00:00:00的毫秒值
参数格式:yyyyMM_dd HH:mm::ss
(八)断言
断言:程序代替人工判断响应结果是否符合预期
步骤:
1编写测试脚本
2为判断的取样器添加断言组件
3直接运行查看结果 断言通过:无提示 断言失败:给出错误
分类:
响应断言:断言状态码和响应体
大小断言:判断响应内容的字节长度
断言持续时间:判断响应时间
(九)逻辑控制器
测试完整的业务逻辑或流程
- if逻辑控制器
给定一个变量值,根据变量值是否一致判断 请求是否需要被执行
如果条件满足 则执行:
如果不满足 则不执行:
- ForEach逻辑控制器
- 循环逻辑控制器
(十)关联
上一个请求的响应结果和下一个请求的数据有关系
将A网址title获取并传递给B网站(Baidu.com)作为关键字搜索
(十一)跨越线程组关联
局部变量可直接传递:
非全局变量无法跨线程传递:
借助函数生成器完成 全局变量传递:
(十二)高并发
同一时刻 100个用户访问
(十三)高频率
一个用户以20QPS频率访问 持续15秒
QPS:每秒查询量 每秒访问多少次服务器
(十四)分布式
多机协作,集群方式完成测试任务,提高测试效率
角色划分:
- 控制机:负责任务分配
- 执行机:负责任务实现
流程:
- 控制机需要制定测试任务,并下发到执行机
- 执行机执行任务并返回结果到控制机
- 控制机结果汇总