性能测试

78 阅读9分钟

性能测试的流程

  • 性能测试的需求分析
  • 测试用例设计
  • 性能分析和调优

性能测试的指标

  • 响应时间
    • 概念:从客户端发送请求,到客户端收到服务器响应的总时间
    • 组成:网络传输时间,服务器(应用服务器处理+数据库服务器处理)处理时间
  • 并发数
    • 概念:某一时间同时向服务器发送请求的用户数
      • 系统用户数 系统注册的总用户数
      • 在线用户数 某段时间内访问过系统的用户数 这些不一定同时向系统提交请求
      • 并发用户数 某段时间同时向服务器发起请求的用户
      • 参考数据的来源来自系统线上运行之后运营人员搜集的数据
  • 吞吐量
    • 单位时间内处理客户端请求数量,直接体现软件系统的性能承受能力
    • RPS每秒请求数 控制服务器每秒处理的指定请求的数量
    • TPS每秒事务数 服务器每秒钟能处理业务数量
  • 错误率
    • 指系统在负载情况下,失败业务的概率
    • 错误率=(失败业务数/业务总数)*100%
    • 错误率是一个性能指标(必须有负载),不是功能上的随机bug
    • 10万用户发送1个请求,成功99990个,失败10个---》错误率=(10/100000)*100%=0.01%
    • 1个用户发送10个请求,成功9个,失败1个---》这是一个随机功能bug(没有负载)
  • 资源使用率
    • 是指各种资源的使用情况,一般用:资源的使用量/总的资源可用量*100%形成资源利用率的数据
    • CPU:75%-85%
    • 内存:80%
    • 磁盘I/O读写:90%
    • 网络:不超过带宽80%

性能测试接口响应时间参考

  • 项目什么指标都没有,可以参考以下指标确定响应时间,然后测试出来其他指标,作为一个参考的指标
    • 通用接口响应时间分布情况:
      • 100ms为优良
      • 500ms为及格
      • 1000ms以上为不可忍受
    • 金融接口响应时间的分布情况:
      • 100ms为优良
      • 200ms为及格
      • 300ms以上为不可忍受
    • 业务场景的响应时间的各项指标是多少
      • 1/3/5排除网络时间和前端增加时间
      • 2/4/6加上网络时延,并发很严重的情况下6s
    • 资源:
      • cpu:不能超过80%
      • 内存:不能超过80%
    • 错误率:0.05%

一、秒杀场景(下单业务)的性能用例设计和执行

1.设计性能测试用例

1.并发测试【重点】

  • 概念
在极短的时间内,发送多个请求,来验证服务器对并发的处理能力
  • 作用
极短的时间内,发送大量请求,系统的并发处理能力达标后,才能上线
  • 练习

    - 需求: 50用户同时下单参与秒杀,观察是否出现超卖现象。
    - Case1(超卖问题) : 秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20% 
    

2.用例设计

​ Case1(超卖问题) : 秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20%

2.编写测试脚本(下单业务)

如何解决模拟不同用户登录,使用对应的用户登录token和地址下单问题?

1.CSV参数化【重点】

  • 作用:让不同用户在多次循环时,可以从数据文件中取到不同的值

  • 位置:测试计划 --> 线程组--> 配置元件 --> CSV 数据文件设置

  • 参数:

image.png

2.完成脚本准备

1. 定义CSV数据文件
   —— 准备好 用户登录成功后的token值 和 与之匹配的地址ID
2. 添加线程组,设置线程数和循环次数
3. 添加CSV数据文件设置
4. 添加HTTP请求 – 添加购物车
5. 添加信息头管理器
6. 添加HTTP请求 – 结算
7. 添加HTTP请求 – 下订单
8. 添加查看结果树
  • 通过代码获取登录token,写入csv文件
# 1-导包
import requests

# 2-打开文件,将地址id与对应的登录token名称写入csv文件
with open(file='login.csv', mode='a', encoding='utf-8') as f:
    f.write('add_id,token\n')  # 写入字段名称,要换行

    # 3-执行循环登录50个用户,获取对应的token,与地址id一起写入csv文件
    for i in range(100001, 100051):
        # 3-执行轻商城登录请求
        req_url = "http://www.litemall360.com:8080/wx/auth/login"  # 请求url
        req_data = {"username": "user" + str(i), "password": "user123"}  # 请求参数
        resp = requests.post(url=req_url, json=req_data)  # 获取响应
        # print(resp.json())
        token = resp.json().get("data").get('token')  # 提取token
        # print(token)

        str1 = str(i) + ',' + str(token) + '\n'  # 合并地址id和token值,要换行
        f.write(str1)  # 写入文件

print("登录数据获取完成啦!")

3.模拟多用户同时请求-同步定时器【重点】

  • 作用:阻塞线程(累积一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。

  • 位置:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer

  • 参数介绍:

    Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量。
    若设置为0,等于设置为线程组中的线程数量
    Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数;
    如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。
    如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0
    
    
  • 练习:模拟20个用户同时发送访问百度首页的HTTP请求

3.准备测试环境

# 清空购物车
TRUNCATE table litemall_cart; 
# 查询构造的库存数据
SELECT * FROM litemall_goods_product lgp WHERE goods_id >=100001 and goods_id <=200000;
#  修改构造商品的库存
UPDATE litemall_goods_product lgp set number = 1000000000 WHERE goods_id >=100001 and goods_id <=200000;
# 查看商品库存
SELECT * FROM litemall_goods_product lgp WHERE id=2;

4.性能测试指标监控 — 已完成

5.设置运行场景并分析结果

  • 案例需求

    秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20%
    
  • 执行记录

image.png

二、稳定运行场景的性能用例设计和执行

1.设计稳定运行场景下的性能测试用例

1.稳定性测试

  • 概念

    • 在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试,并最终保证服务器能满足线上的业务需求
  • 如何获取稳定性指标

    什么是用户正常的业务负载?
    	系统日常运行时,用户所进行的主要业务操作
    	系统日常运行时,每种业务操作的并发/负载量
    
    长时间测试?
    	1天-1周不等
    

2.用例设计

  • 目标需求:所有业务按照日常场景运行12小时,响应时间满足各业务要求,成功率达到99.95%以上,资源使用率不能高于80%

image.png

2.编写测试脚本(所有业务)

image.png

3.准备测试环境 —已完成

4.性能测试指标监控 — 已完成

5.设置运行场景并分析结果

  • 运行步骤

    所有的脚本同时执行(解除前后依赖,取消勾选测试计划-》独立运行线程组)
    每个脚本都是一个事务/业务 —— 事务控制器
    在请求下添加常数吞吐量定时器,控制请求发送速率(每个用户1个请求/每秒,只有此线程)
    按照要求设置虚拟用户数和运行时间(参考TPS+用户定义变量)
    执行稳定性测试并监控
    
  • 运行结果

image.png

三、补充:如何生成html测试报告

  • 作用

    • JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息
  • 命令和参数说明(在cmd或终端执行哦)

image.png 【案例演示】通过cmd执行测试生成html测试报告

  • jmeter html测试报告介绍

image.png

  • 注意:

    在执行时,需要删除对应目录下的report文件和report.jtl文件,否则运行生成html报告的命令会报错

  • 报告汉化和参数说明参考

https://blog.csdn.net/smooth00/article/details/100769262
https://blog.csdn.net/qq_22200671/article/details/108641119

注意:
1-解压后将对应版本的report-template目录复制并替换apache-jmeter-x.x\bin\report-template目录即可,新生成的报告就被汉化了
2-如果生成的html报告显示中文乱码,自行将模板文件转存合适的编码格式
(Windows可以将\bin\report-template下的index.html.fmkr和\content\pages下所有的.fmkr文件都另存为ANSI/ASCII格式即可)

四、扩展:jmeter如何排错

jmeter接口测试排错思路【查看结果树+调试取样器】:
	1.通过查看结果树查看接口的响应状态码和响应数据,根据提示排错
	2.通过查看结果树查看接口实际的请求方法、URL、参数是否正确【不正确再查看对应的配置信息】
	3.对于关联数据可以通过【调试取样器】查看提取的值是否成功,如果显示正常说明提取正确,否则就是提取有问题

绝招【借鉴一个对的请求】:
	操作软件对应的功能,通过抓包获取一个执行正确的请求数据,与发送的数据对比【或者直接使用抓包的数据发送请求】,查看是哪里不一样

【本质】:
接口请求不管使用任何工具,不管什么错误,都逃不出以下内容:
	请求行:请求方法、URL
	请求头:请求数据类型、token/session认证
	请求体:请求参数是否正确、关联数据是否取的正确

【如何描述一个错误】:
提交bug或者请求别人帮助时,提供如下信息,提高效率,显得专业:
	请求内容:方法、url、请求头、请求体
	响应的结果:响应状态码、响应体
	其他:关联数据、参数化数据、断言
1-http请求默认值-域名出错
2-信息头管理器-空格
3-http取样器-路径出错
4-响应断言-测试字段出错
5-json断言-路径出错
6-计数器-计数值出错
7-结算-地址id出错