关于如何准备性能测试数据,可能出现不少的问题,比如:

  • 数据量不足
    导致性能表现非常好,忽略了一些潜在性能问题
  • 数据分布不合理
    导致测试结果与线上差异较大,又要推到重来

总结下经验,把测试数据准备分为两类数据:铺底数据和参数化数据

  • 什么是铺底数据?
    一般情况下,产品上线后数据量是不断增加和累计的过程。刚上线时,数据量较少,数据库查询及更新速度快,服务响应及时性较好。 随着数据量的累积,数据量不断增加和膨胀,系统的操作响应时间会随着数据量的不断增加而变得越来越长。 所以,在性能测试模拟时,要考虑一定规模数据量情况下的性能是否能满足预期,比如考虑半年或一年的业务量

  • 什么是参数化数据?
    在压力测试时,通常模拟不同的用户行为,或者业务行为,从系统所提供的API来看,需要参数化用户账号等数据,如考拉海淘产品,压测下单场景时,要参数化用户数据,哪些用户进行下单,参数化商品数据,这些用户购买什么产品等

一、铺底数据准备

1.1 铺底数据有目的

铺底数据目的是让性能测试环境与线上保持一致,或者说接近线上真实情况

  • 保证待测系统有一定的规模,比如半年或一年后的用户规模
  • 为压测做准备,准备每个要压测的请求需要使用到的数据,这部分数据涉及到具体的业务,对性能测试结果影响比较大

根据以上两点,将铺底数据划分为两块:

  1. 只做铺底,在压测中不会访问到的数据

    这部分数据是为了使数据库达到一定的规模,以发现数据库查询、更新等性能瓶颈,如忘记建立索引,查询SQL不合理等问题

    只为铺底,压测时不会用到的这部分数据,在预设的过程中就比较随意了,不用考虑数据是否合理,也不用考虑业务关联关系,只要符合数据库设计规则,能插入数据库即可

  2. 在压测时要用到的数据

    比如API要传参过去的数据,或者请求响应数据。这部分数据在铺底的时候就要精细化的设计,包括数据大小,数量,分布等

1.2 铺底数据量多少合适

完全根据产品的规模来预估

比如产品预计半年后注册用户数达到100w,则铺底的时候需要铺底100w用户账号

如果是已上线产品,根据线上数据库数据量进行预估,可以根据用户规模的比列进行铺底,如线上注册用户数一千万,线下铺底注册用户数100w,则总体数据规模为线上的十分之一左右

实际情况下,这里会略微复杂,比如还要考虑线上数据库集群和测试集群的硬件差异等,需做适当的调整

二、参数化数据准备

如果从系统接口调用角度来看的话,参数化数据包括两类:

  • 一类是要传参给接口调用的数据

    比如用户账号ID,商品ID等

  • 一类是接口返回的结果数据

    如获取商品详情时,需要返回商品的数量、颜色、描述信息等,这些数据必须是事先准备好

在进行参数化数据准备时,对于已经上线的产品,可以统计不同铺底数据的分布规律

从网易宝和之前的timeline的两个产品的数据统计来看,大多数数据的分布接近2/8原则。比如活跃用户数占注册用户数的比例为20%,非活跃或者欠活跃的用户占比为80%左右。针对具体业务,80%的业务是由20%的活跃用户产生,20%的业务是由80%的非活跃用户产生。所以参数化测试账号时,对这20%的用户账号需要进行精心铺底

2.1 测试账号准备

注册用户数是产品用户规模的衡量指标,一般会先铺底一定规模的用户账号

铺底多少测试账号? 根据产品本身的特点、参考竞品的用户量、以及产品的推广计划,预估半年后要推广到100w用户。那这100w是指注册用户数。一般互联网产品活跃用户是注册用户的10%~20%,不同类型的产品略有差异。 那么在准备数据的时候,会考虑铺底100w用户,其中80%左右的用户是非活跃用户,用户相关数据会比较随意的铺底,保证铺底主表及关联表即可,其中20%左右的用户是活跃用户,是压测时要用到的数据,这20%的用户信息,比如好友关系、发表的微博数量等,都需要设计进行铺底

2.2 读请求数据准备

读请求一般即为GET请求,影响GET请求性能的主要有两部分:

  • GET请求返回的数据量的多少
  • GET请求传入参数的数据量多少

一个常见的读请求定义为:

URI: /video/details?deviceId=123456
Method:GET
Reurn:{"message": "success",
"timeline": {"list": [
{ "from": -23261042219000, "to": -23261042199000 },
{ "from": 1388523600000, "to": 1388523921000}
]},
"code": 200
}

其中:

  • deviceId:接口调用时要传的参数,这里是指设备Id
  • Reurn:指该接口的返回数据,返回数据内容为该设备的详情信息

那么在铺底数据的时候,要铺底deviceID来虚拟出若干设备,同时这些设备的详情信息不能为空,也需要进行铺底,这就涉及到接下来要介绍的,读请求返回数据量准备和传入参数deviceId的数据量准备

2.2.1 读请求返回的数据量准备

读请求返回的数据量大小要与实际情况基本一致:

  • 返回数据量不能太大

    太大会偏离实际情况,增加数据库压力,网络传输时延等,导致测试结果比实际情况差的多

  • 返回数据量不能太小

    比如获取一篇博文,博文不能全部返回空,会比实际情况好,导致遗漏一些性能风险点

如示例中的RETRUN内容为2条信息左右,通常情况下用户的设备详情信息在210条左右,这里铺底就要考虑铺底随机210条

返回数据量的多少取决于预设的数据量

例如测试活动页的性能,预设10个商品和200个商品时,得到的性能测试数据不一样,发现的问题点也可能不一样:

  • 10个商品时,性能开销在memcached网络IO上
  • 200个商品时,发现性能开销在返回数据的序列化上

再比如:

获取博客详情信息,博客长度为几百字和几千字的性能也是会有差异的,体现在从缓存或者数据库中获取数据量多少时的性能差别等

方法

预设这部分数据时,需要了解返回数据的上限是多少,即找相关开发了解一个活动页面最多会有多少数据,分别测试常规情况下活动页的性能以及极限情况下活动页的性能

另外返回数据量的多少可能会使得网络带宽首先成为瓶颈点,当返回的数据量过多时,应该通过分页等策略限制返回数据量的大小

2.2.2 传入参数的数据量准备

传入参数的数据量是指,GET请求中需要的参数从多少数据量中获取

例如:

  • 获取博客详情接口,给定的参数可以是一个博客地址,不停的获取该博客的内容,也可以是10w个博客地址,随机的获取这些博客
  • 示例中的deviceId在压测中会从10w个设备中随机选择进行测试,也就是要在测试前铺底10w个设备

这种情况下,需要找开发确认,代码实现中是否有缓存相关操作,如果热点博客会被缓存住,那一个博客的情况下,测试的是全部被缓存住的性能,10w个博客,根据缓存大小的不同,可能会测试到不同情况下的性能

对于有热点缓存的情况,建议可以测试下把缓存关掉时的性能,发现极端情况无缓存时是否存在性能问题

2.2.3 读请求的传入参数与返回数据量两者结合

有些时候,以上两种情况都需要考虑,即:传入参数的数据量以及返回的数据量

例如获取博客的评论信息接口:基于80/20原则,20%的博客为热点博客,这20%的博客的评论数量较多,另外80%的博客为非热点博客,评论数较少。为了得到更真实的性能结果,需要把这多种情况都考虑进去

2.3 写请求数据准备

写请求,一般情况下指POST、PUT等请求,也即是向服务端提交数据的请求类型

一般情况下写请求对服务端造成的压力会大一些,因为涉及到数据更新,如数据库更新、缓存更新等。因此,写请求的数据量,对数据库的压力等都是影响性能的条件。写请求关注几点:

  • 写请求对热点数据的更新
  • 写入数据量大小和分布

一个常见的写请求定义如下:

URI: /public/setAsPublic
Method:POST
Body:{"deviceId": "111",
"description": "this is my device",
}
Return:
{"message": "success",
"result": {"deviceId": "111",
"onlineNumber":0
},
"code": 200
}

该接口是写请求,目的是设置设备的概要信息

  • deviceId是设备Id

    deviceId是参数化数据,需要提前进行铺底的数据

  • description描述信息

    description是描述信息,是文本信息,设置多少字节?需要根据实际情况预设

2.3.1 写请求对热点数据的更新

写请求有若干种情况,更新单个数据,批量更新多个数据,多个用户同时更新同一个数据等,针对不同类型的写请求,对资源的更新、竞争会造成不同的压力

热点数据更新,是指对该数据有资源竞争的情况。典型的场景例如:

  • 电商的秒杀场景,大量用户同时抢购同一件商品
  • 社交类的热点微博,大量用户同时评论同一个微博
  • 大量用户同时关注同一个明星账号

测试对热点数据竞争时的性能问题和数据库锁竞争问题等

所以在准备这部分数据时,即需要准备批量的数据,测试随机购买、随机评论的性能,也需要准备少量的热点数据,测试对热点数据竞争时的性能

2.3.2 写入数据量大小和分布

当压测写请求时,是需要提交数据到服务端,然后会写入缓存或者写入数据库

这部分数据量的大小及分布会对性能结果影响比较多,数据量的大小会影响网络传输时间,会影响数据库更新时间,一般情况下,数据量越大,响应延迟会越高。所以,写请求传参的数据量要尽可能符合实际的用户行为,最好统计线上真实数据,博客的长度一般在多少字以内,微博的长度一般在多少字左右等

【性能测试】构造性能测试的数据相关推荐

  1. 【性能测试】性能测试工具选择

    转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5503134.html,有删减. 本篇文章主要简单总结下性能测试工具的原理以及如何选型.性能测试和功能测试不同 ...

  2. 性能测试:性能测试实施全过程指南

    一. 开篇:总体策略 通过制定性能测试实施指南,从技术角度对性能测试实施过程中所涉及到的关键技术进行规范,能更好地从技术上来规避系统上线后的风险.评估线上系统的真实能力.根据业务模型摸底线上能力以提前 ...

  3. 【性能测试】性能测试的基本流程

    转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5463477.html,有删减. 本文主要介绍下性能测试的基本流程,性能测试从实际执行层面来看,测试的过程一般 ...

  4. 【性能测试】性能测试的基础理论

    转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5456855.html ,有删减. 随着软件行业的快速发展,现代的软件系统越来越复杂,功能越来越多,测试人员除 ...

  5. 【软件测试】Jmeter性能测试(性能测试,Jemeter使用与结果分析)

    文章目录 前言 一.性能测试 1. 什么是性能测试? 2. 性能测试的重要性 3. 性能指标--QPS和TPS ①QPS ②TPS 二.压测工具Jmeter 1. 什么是Jmeter? 2. Jmet ...

  6. 【性能测试】性能测试的概念和术语介绍 性能测试分类(了解每种测试的目的)

    性能测试独立于功能测试嘛? 这样理解并不对,因为做性能测试的时候,他可能就是基于功能点来做,首先要保证这个功能点是没有问题的然后再考虑该功能点的性能测试.性能测试的时间:功能测试的中后期 性能测试的目 ...

  7. 一步一步学谷歌性能测试(chrome) 性能测试教程

    一步一步学谷歌性能测试(chrome) 性能测试教程 (地图类) 第一章.测试的地址 第二章.来到控制台 第三章.设置成中文 第四章.录制脚本 第五章.保存测试结果 第六章.查看测试结果 第七章.认识 ...

  8. 什么是性能测试?为什么要进行性能测试?什么时候开展性能测试?性能测试流程是什么?性能测试有关术语是什么意思?

    前言 本文文章读起来过于枯燥,但是你用15-20分钟认真读一下,获取会为你理解性能测试有所帮助.其中有些是借鉴网上的一些大神的经验. 性能测试5问: 什么是性能测试? 性能测试是指被测系统在一点负载下 ...

  9. 性能测试 理论初探(一),什么是性能测试?性能测试的目的是?

    文章目录 前言 性能测试 目的 1.评估系统的能力 2.识别体系中的弱点 3.系统调优 4.验证稳定性(resilience)可靠性(reliability) 负载测试(Load Testing) 压 ...

  10. VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)

    上次用VC写了个MFC环境下的post数据类,地址: /Html/diannaojishu/2009-10/4905858580.html 这次将这个类进行扩展,可以post图片.但这两个post所使 ...

最新文章

  1. Python命令行解析:sys.argv[]函数的简介、案例应用之详细攻略
  2. qs.stringify和JSON.stringify的使用和区别
  3. 基于OIDC(OpenID Connect)的SSO
  4. c语言降序多项式加法,数据结构算法(多项式加法)的C语言完美实现
  5. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——1.2 S5PV210处理器
  6. Ruby数据结构-数组和哈希表
  7. mac PowerPoint 导出高分辨率图片
  8. 1.19.10.Flink SQL工程案例\Flink批式处理\自定义函数\Window窗口计算\将DataSet数据转成Table数据\将Table数据转成DataSet等
  9. 以太坊ETH(windows)配置
  10. Python数据分析培训班介绍
  11. uniapp使用高德地图线路规划
  12. 解决QQ显示“无法访问个人文件夹”方法
  13. Linux 6.2:华为代码加速核心功能 715 倍!
  14. 无水印思维导图——导出亿图(试用版)无水印图片
  15. 使用循环语句打印菱形梅花阵
  16. linux怎么安装输入法软件下载,百度输入法linux版下载
  17. 聊一聊最新配置说明Spring Boot 2.4
  18. 简单介绍oracle执行计划,Oracle性能优化之oracle中常见的执行计划及其简单解释
  19. 棋牌游戏 投资风险 政策_机会,风险和政策
  20. html不常用的fieldset标签

热门文章

  1. 领域驱动设计(DDD)部分核心概念的个人理解
  2. 用c语言实现的FFT
  3. DEM数据(ASTER GDEM|SRTM|GLS2005|ALOS DEM|NASA DEM)下载
  4. Cisco Packet Tracer 简介和安装
  5. java安装有错误码咋办_java编程出现的错误对应的解决方法
  6. 大数据学习之Linux服务器常用命令
  7. CNN与句子分类之动态池化方法DCNN--模型介绍篇
  8. c语言编程题总结,c语言编程题总结
  9. C语言通过QR分解计算矩阵的特征值和特征向量
  10. MMA-清除所有变量的方法