性能测试的数据构造——大话性能测试(12)

发表于:2022-6-30 10:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡通    来源:51Testing软件测试网原创

#
Jmeter
分享:
  1.2.5性能测试的数据构造
  在性能测试过程中,准备测试数据是一项非常系统化、工作量非常庞大的工作。如何准备支持不同业务操作、不同测试类型的大量测试数据来满足压力测试的需求,是性能测试过程中经常面对的一个重要话题。关于如何准备性能测试数据,相信不少性能测试人员也踩过不少坑,例如数据量不足,导致性能表现非常好,但未能暴露和发掘潜在性能问题;数据分布不合理,导致测试结果与线上差异较大。
  1.性能测试数据的准备类型
  在执行性能测试前,一般需要准备3类数据:初始化数据、铺底数据(历史数据)和参数化数据。
  (1)初始化数据。业务系统安装部署完成后,我们并不能马上进行相关业务的性能测试,需要对业务系统进行初始化操作。系统初始化主要对系统中的基本角色信息、机构信息、权限信息和业务流程设置等增加数据,这些数据是系统能够开展相关业务的基础。准备初始化数据是为了识别数据状态并且验证测试案例的数据,需要在业务系统搭建完成后按照业务系统实际运行要求导入,以供测试时使用。
  (2)铺底数据(历史数据)。当业务系统刚刚上线的时候,数据库中数据量相对较少,系统整体响应时间很快,用户使用体验较好。但随着业务的持续开展,业务系统数据库中的数据量会成倍地增加,业务系统的相关操作响应时间会因为数据库中业务数据的快速增长等原因而越来越长,用户使用体验会越来越差。因此,在性能测试时,需要加入相当规模的铺底数据,来模拟未来几年业务增长条件下系统相关操作的性能表现。如果要测试并发査询业务,那么要求对应的数据库和表中有相当的数据量,以及数据的种类应覆盖全部业务。
  (3)参数化数据。在负载压力测试过程中,为了模拟不同的虚拟用户操作的真实负载情况,同时由于业务系统中大部分业务操作的交易数据不能重复使用,因此我们需要为不少用户输入信息准备大量参数化数据。参数化数据涉及的范围很广,例如,模拟不同用户登录系统,需要准备大量用户名及密码参数化数据;模拟纳税人纳税申报,需要准备大量的纳税人识别号、纳税人内码或纳税人系统内部识别号等参数化数据。准备这类数据要求符合实际运行要求,并且保证数据表之间的关联关系。
  在压力测试时,通常模拟不同的用户行为或者业务行为,从系统提供的API来看,我们需要参数化用户账号等数据,如压测下单场景时,我们要参数化用户数据,哪些用户进行下单操作;参数化商品数据,这些用户购买什么产品等。
  2.性能测试数据的构造原则
  我们知道数据量变化会引起性能的变化。在制作测试数据时,首先要注意数据量,需要准备足够的存量/历史业务数据;其次要注意数据的分布,例如我们计算出需要并发100个虚拟用户,我们至少需要准备100个以上的账号,并对账号赋予相应的权限(浏览、发帖、删除、査询)。最后还要注意冷热数据,一般热点数据也需要准备。
  铺底数据量多少合适?这个完全根据产品的规模来预估,例如预计半年后产品的注册用户数达到100万,则需要铺底100万用户账号。如果是已上线产品,则根据线上数据库的数据量进行预估,可以根据用户规模的比例进行铺底,如线上注册用户数1000万,线下铺底注册用户数100万,则总体铺底数据规模为线上数据量的十分之一。实际情况下,这里会比较复杂,例如还要考虑线上数据库集群和测试集群的硬件差异等,需做适当的调整。
  在进行参数化数据准备时,对于已经上线的产品,可以统计不同铺底数据的分布规律。其实大多数数据的分布接近二八定律。比如活跃用户数占注册用户数的比例为20%左右,非活跃或者欠活跃的用户占比为80%左右。针对具体业务,80%左右的业务是由20%左右的活跃用户产生,20%左右的业务是由80%左右的非活跃用户产生。所以参数化测试账号时,对这20%左右的用户账号需要进行精心铺底。
  3.性能测试数据的构造方法
  (1)从线上数据库导入真实数据。从线上数据库或者备库导入数据,最大的优势是数据真实性高、数据分布合理、业务压力点及瓶颈能和线上保持一致,这样测试得到的结果与线上实际表现会比较接近,比自己模拟数据要可靠得多。但是,缺点是用户数据需要进行脱敏,而且要考虑用户的数据是否能直接拿来用,例如用户的手机号就需要脱敏,涉及短信通知等业务需要进行一定的数据处理或者模拟数据等。
  (2)根据业务规则构造模拟数据。模拟数据的优点是数据会符合自己定义的规则,便于使用,例如测试账号可以自己进行编号,方便参数化使用。模拟数据的缺点也比较明显,模拟数据需要大量的梳理工作,要梳理数据库表,厘清哪些是基础表、表与表之间的关联等;要充分把握产品业务,例如对社交类产品,要统计和分析用户的好友关系、每个用户的好友个数及分布,梳理每个好友发布的微博分布等,这样测试结果才能趋于与线上一致。
  下面是日常工作中通过代码快速构造数据的方法。
  (1)编写代码批量生成SQL语句,具体代码可参考代码清单1一1。
  (2)通过MySQL的工具导入数据,在MySQL的命令行上执行下面的语句即可:
  其中的参数解释如下。
  -/Users/hutong/Downloads/an_onu.sql表示构造的数据的存放路径。
  -tb_onu表示数据库下要存放的表。
  -fieldsterminatedby7表示每个字段用逗号分开。
  -optionallyenclosedbyn"escapedby””表示内容包含在双引号内。
  -linesterminatedby'\n'表示每行的换行(注意,Windows中用Wn、Linux中用侦)。通过该高效的方法,作者在自己的服务器上构造千万条数据只需要几分钟。
  注意
  考虑生成的测试数据量是否达到未来预期数据量只是最基础的一步,更需要考虑的是数据的分布是否合理,这需要仔细地确认程序中使用的各种查询条件。重点列的数据分布要尽可能地模拟真实的数据分布,否则测试的结果可能是无效的。
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号