软件测试第六阶段性能测试day06

性能测试

这篇文章总结了一下我学习的性能测试部分的第六天的部分知识, 文章包含昨日回顾,今日目标,性能测试脚本编写, 性能测试环境准备和执行测试脚本(只展示了登录部分的并发测试)。不足之处希望大佬指正!

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 = 峰值时间段的总请求量 / 峰值时间 * 系数(系数可以是2、3、6、10,取决于项目组自
      己的要求)
    • 该结果可以用于压力测试的TPS并发量

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)都无法满足负载量要求时,需要使用分布式的方
      法,使用多台测试机一起来模拟特定负载量的业务

性能测试脚本执行:
登录脚本:
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、修改指定商品的库存量,库存量改大(保证在性能测试的过程中不能库存耗尽)
加入购物车脚本:…
结算并下订单脚本:
准备工作:为每个用户创建对应的收货地址
执行测试脚本:…
业务流程的测试:…
稳定性测试:…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值