【博学谷学习记录】超强总结,用心分享|软件测试第六阶段性能测试day06
目录
- 性能测试
- 1. 性能测试Day06
- 1.1 昨日回顾
- 1.2 今日目标
- 1.3 性能测试脚本编写
- 常用的Jmeter元件:
- 编写脚本:
- 1.4 性能测试环境准备
- 1.5 执行测试脚本
性能测试
这篇文章总结了一下我学习的性能测试部分的第六天的部分知识, 文章包含昨日回顾,今日目标,性能测试脚本编写, 性能测试环境准备和执行测试脚本(只展示了登录部分的并发测试)。不足之处希望大佬指正!
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 + iusername = "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、修改指定商品的库存量,库存量改大(保证在性能测试的过程中不能库存耗尽)
加入购物车脚本:…
结算并下订单脚本:
准备工作:为每个用户创建对应的收货地址
执行测试脚本:…
业务流程的测试:…
稳定性测试:…
【博学谷学习记录】超强总结,用心分享|软件测试第六阶段性能测试day06相关推荐
- [博学谷学习记录]超强总结,用心分享|第07节 常用的API-----笔记篇
目录 1.API 1.1 API概述-帮助文档的使用 1.2 键盘录入字符串 2. String类 2.1 String概述 2.2 String类的构造方法 2.4 创建字符串对象的区别对比 2.5 ...
- {博学谷学习记录} 超强总结,用心分享|狂野架构师-前置互联网架构演变过程
本章以系统架构,数据架构,两种维度来进行讲解 目录 1 系统架构 1,1 单体架构 1.2 中台战略 2 数据库架构 2,1 单体架构 2.2 主从读写 2.3 分库分表 3 总结 1 系统架构 1, ...
- [博学谷学习记录]超强总结,用心分享|架构 Nacos入门
提示:学习笔记 欢迎指点 文章目录 前言 一.Nacos安装 二.Nacos服务注册与发现 1.服务提供者Provider 2.服务消费者Consumer 三.Nacos作为配置中心 前言 Nacos ...
- [博学谷学习记录]超强总结,用心分享|架构 敏捷 - 开发管理之道
提示:学习笔记 欢迎指点 文章目录 1.敏捷开发思想之道 2.面向对象开发之道 3.敏捷学习之道 1.敏捷开发思想之道 一名敏捷开发者,敏捷思想的掌握自然首当其冲.在敏捷开发实施的过程中,我们虽然不是 ...
- [博学谷学习记录]超强总结,用心分享|第16节 集合续-----笔记篇
目录 1.HashSet集合 1.1HashSet集合概述和特点[应用] 1.2HashSet集合的基本应用[应用] 1.3哈希值[理解] 1.4哈希表结构[理解] 1.5HashSet集合存储学生对 ...
- [博学谷学习记录] 超强总结,用心分享|陌陌综合案例
注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flin ...
- [博学谷学习记录]超强总结,用心分享|Hive的压缩格式
压缩格式 工具 算法 文件扩展名 是否可切分 DEFAULT 无 DEFAULT .deflate 否 Gzip gzip DEFAULT .gz 否 bzip2 bzip2 bzip2 .bz2 是 ...
- [博学谷学习记录]超强总结,用心分享|软件测试之计算机基础(一)
本周开始学习软件测试,而我也即将开始在平台记录我的学习之路.我会把我的个人心得及掌握的知识发布在此平台,俗话说最好的输入就是输出,希望在输出的同时能有更多的收获,也希望与大家多多交流. 为了更好的学习 ...
- [博学谷学习记录]超强总结,用心分享|人工智能机械学习基础知识线性回归总结分享
1.线性回归的核心是参数学习,线性回归和回归方程(函数)有关 2.线性回归是目标值预期是输入变量的线性组合 3.欠拟合的产生原因是学习到数据的特征过少 4.多元线性回归中的"线性" ...
最新文章
- 为什么自动化对于IT工程师是必须的?
- 【 Vivado 】输入延迟约束(Constraining Input Delay)
- pandas语法乱、API多?你需要整理一下!|知乎讨论
- 手把手教你搭建用户画像,数据分析效率提升百倍
- QT qml---- loader使用方法
- Spring Boot,@ EnableWebMvc和常见用例
- Linux C++ 实现线程池
- python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
- iOS开发 字符串的转化 小技巧
- 用viewpager实现图片轮播
- 让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑.
- android 支付宝接口开发,android 实现支付宝wap接口编程
- Houdini学习笔记003
- WinFR 界面版 - 免费好用的数据恢复软件,误删文件轻松找回
- [BZOJ3993] [SDOI2015]星际战争(最大流+二分)
- 20分钟掌握前端编写 CLI 工具
- Zeepelin系列(一)Zeepelin安装和配置以及对Hive的基本使用
- type-c速度测试软件,速度篇—Type-C/USB3.0接口到底谁快_固态硬盘评测-中关村在线...
- Python3飞机大战全代码(亲测OJBK)
- 计算机节能认证技术规范产品目录,CQC节能产品认证目录.doc
热门文章
- 【学习提升】elasticsearch-head无法页面新建索引且无法展示数据
- 阿里某员工的苦恼:来阿里虽然涨了工资,但却不快乐,每天很压抑
- 软考—程序员(软件生存周期)
- Linux系统之部署Yearning SQL审核平台
- spring core之Ioc介绍
- 【C++基础语法】03 C++ 程序逻辑结构、分支 if 及关系表达式
- 智能手机出厂需要软件测试吗,智能手机出厂前做了哪些可靠性测试?
- 记一次 电脑重装系统 Windows 10 x64 系统“我们无法创建新的分区,也找不到现有的分区”
- [转] unity功能开发——实名认证
- 2022年医药新零售行业发展分析及前景预期