目录

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

3)轻商城的项目

  • 熟悉项目(功能架构、技术架构、数据库的关键表、项目部署)
  • 项目需求分析
  • 确定性能测试的需求指标(客户/产品给需求;通过运营数据分析)
  • 确定性能测试的测试点(业务功能——用的多/重要的/特殊时间节点/主流程发生变化、技术
    ——资源消耗多的)
  • 确定目的:
  • 单个接口的性能需求指标
  • 多个接口组合(按照用户的业务场景)的性能需求指标
  • 模拟用户的业务场景,进行长时间的稳定性测试
  • 编写性能测试计划
  • 测试目的—— 对应需求分析中的测试目的
  • 测试范围——对应需求分析中的测试点
  • 测试策略——对于性能的测试点,使用什么样的方法能达成对应的测试目的
  • 时间、人力、进度的安排
  • 编写性能测试用例
  • 根据测试目的和测试点来进行编写
  • 单个接口的性能需求指标(针对每个测试点分别写一个测试用例)
  • 多个接口组合(按照用户的业务场景)的性能需求指标(针对每个业务场景写一个测试
    用例)
  • 稳定性测试(稳定性的测试用例)

1.2 今日目标

  • 性能测试脚本编写
  • 准备性能测试环境和数据
  • 运行性能测试脚本,并监控数据指标

1.3 性能测试脚本编写

常用的Jmeter元件:

博学谷java移动应用 博学谷软件_性能测试

编写脚本:

基础元件:

博学谷java移动应用 博学谷软件_性能测试_02


1、HTTP信息头管理器 —— 对请求消息的消息头进行修改

2、使用HTTP请求默认值写入协议、域名、端口、编码格式,在HTTP请求取样器中只需要写入路径、

请求方法、参数即可。好处是:在测试时,如果换了测试环境,直接修改HTTP请求默认值即可,不需

要修改所有脚本

3、编写脚本时,每个用例一个独立的线程组

线程组名称建议修改为用例名称

HTTP请求取样器的名称修改为用户名称

每个HTTP请求需要添加断言

如果请求URL中的参数可能为中文,建议将参数放入到下面参数列表中,并将中文参数勾选“编码”

4、当脚本涉及到登录及后续相关操作时,需要使用提取器将登录后的token信息提取出来,在后续请求

中加上token信息,这样后续请求才是登录状态

5、编写jmeter脚本的过程,如果HTTP请求之前调试过,可以直接拷贝(ctrl+c —— ctrl+V)到新的线

程组使用

6、结算下订单的脚本编写:

对于结算的操作:涉及到两个接口 —— 勾选商品,结算按钮

在结算下订单脚本测试前,需要准备好测试数据——购物车中需要有现成的商品

博学谷java移动应用 博学谷软件_性能测试_03


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%)

博学谷java移动应用 博学谷软件_sql_04


5、模拟10个用户并发执行,记录对应的性能指标

当前系统的TPS为19.5(接近20),响应时间为506ms(满足需求<3s)

问题是:资源使用率中CPU达到96%,内存达到82%,说明当前系统资源不足,需要提升系统配置

博学谷java移动应用 博学谷软件_性能测试_05


进入首页脚本:

添加购物车—查看购物车—商品结算—下订单—查看订单脚本:

准备工作:

1、5个用户、10个用户。。。。,用相同/不同的账号密码来登录?

2、与前面登录脚本一样,使用随机用户名进行登录?例如:前缀test + random(100000,200000)

3、修改指定商品的库存量,库存量改大(保证在性能测试的过程中不能库存耗尽)