(原创)如何在性能测试中实现脚本参数化
版权声明:本文为原创文章,转载请先联系并标明出处
做过性能测试工作或者参加过性能测试相关培训的小伙伴应该对参数化都不会陌生,参数化作为测试脚本中最基本的使用技巧,需要每个从事性能测试的小伙伴都能熟练掌握。
在测试工具中,每一个模拟用户都是一个线程,而在我们的仿真模型里,每一个用户都应该是一个真实的业务实体,每个用户代表的业务含义、他可以去处理的业务以及在处理业务的过程中可以操作的数据都应该是不同的,这样才可以更真实的表达现实世界中系统使用
的负载模型。为了达到这个目的,将测试工具的每一个线程和仿真模型中的每一个用户及操作对应起来,就需要使用到参数化的脚本处理。
说的有些太严肃了,简单举个例子,比如我们要测试用户注册的功能,注册的用户名是不允许重复的。我们录制完的脚本都是hard code,直接进行并发测试的话,无疑所有模拟用户的线程在注册的时候输入的都是相同的用户名和密码,这样肯定是会有很多错误请求无法达到服务端,也就不能产生我们预期的负载压力。这时候,针对用户名就需要我们使用参数化的技巧来实现,每个注册的用户每次注册都使用不同的用户名来填写注册信息。
常用的测试工具都提供了参数化的功能,像LoadRunner可以为每个脚本在本地生成一个参数数据列表的文本,Jmeter也可以直接引用某一个参数数据的文本,从中读取数据来实现参数化。但是这些实现方式都是把参数的作用域限制在某一个脚本中,如果多个脚本需要相同的参数,比如我们的多个脚本都有登录的功能,登录用户的参数数据列表是一样的,那么现在这种实现方式就无法实现复用,需要在每个脚本都重复进行参数化设置。
HyperPacer提供的参数化解决方案中,提供了数据池的功能,所有的参数数据列表都在数据池中进行维护,脚本需要哪个参数列表,就直接选择哪个即可。这样就从根本上解决参数数据复用和维护的问题。
下面我们来举例说明在HyperPacer中如何实现参数化。
我们以一个业务系统的登录为例进行参数化说明。性能测试脚本录制好后,对用户及其密码进行参数化,每次登录系统,使用不同的用户登录。参数化包括三个步骤:数据池导入参数、参数化配置、脚本参数化。
实现步骤:
一、数据池导入参数
1、打开HyperPacer测试工具,进入【数据池】-【新建连接】-【文本导入】功能:
PS:数据池维护支持文件导入方式、直接新建表方式以及自定义生成参数三种方式,本例中使用文件导入方式,文件导入即把已有的数据文件导到数据池中,这种方式也是比较常用的一种,当参数的值没有规律且不太大时通常使用这种方法。HyperPacer目前只支持txt和csv格式的文件导入,读取策略按逐行读取,创建数据文件时每一个参数占一列。
2、【文件导入】连接配置中,打开要导入的参数文件,并配置各信息项:
(1) 点击“打开”,选择要导入的文件;
(2) 默认情况下会自动将数据文件的第一行读为列标题,如果数据文件中第一行没有设置列标题,则可以在“变量名称”处输入列的名称,注意多列使用分隔符隔开,默认情况下为逗号;
(3) “文件编码”即导入数据文件的编码格式;导入数据文件是按列取数,如需多列可编辑分隔符,默认情况下为逗号;
(4) 导入数据文件后,点击“下一步”,双击文件名可以查看导入文件明细
(5)勾选文件,点击“完成”即可完成导入。
3、导入成功后,可以双击查看导入的参数;
补充说明:txt文件格式如下(注意:每列以设定的分隔符分隔,默认情况下分隔符为逗号):
二、参数化配置
1、参数文件导入数据池后,需要在【参数化管理器】中进行设置。选定需要做参数关联的测试工程,点击【新建】-【配置元件】-【参数化管理器】,新建一个参数化管理器;
2、新建成功后,对参数化管理器进行配置,先启用参数组;在“未启用参数组”区域选择要引用的参数组,通过“>”按钮添加到“已启用的参数组”区域进行启用。如下图:
3、启用成功后,选中“已启用参数组”中的参数组,可以在“参数配置编辑区”和“数据预览配置”区域进行相关配置:
参数配置详解可参见HyperPacer帮助手册,此处不再赘述。需要强调的一点是 “参数展示区”展示该参数组中所有可以引用的参数,格式为${参数组名.参数名},这是下一个步骤使用的参数名称,直接复制即可。
三、脚本参数化
脚本参数化实际就是用参数来替换脚本中的一些常量,本例中即将录制时使用的用户名、密码替换为参数组中的参数。
具体的引用方式为:将录制的请求中用户名、密码替换为对应的变量名称,如将登录请求中的用户名“zhangsan”字段替换为${username.username}、将登录请求中的密码“zhangsan”替换为${username.password}即可实现对登录名、密码的参数化。
上面的三大步骤为实现参数化的必须步骤,缺一不可,小伙伴们在使用的时候千万不要偷懒哦。我相信参数配置这块你们还晕乎着,别介意,我当年初学时在这块也是晕乎的,下面我们对参数配置再做一下详细的解释。
在上文的示例中,参数化配置为顺序迭代、按迭代更新数据、数据重新循环,意思就是说性能测试中HyperPacer在取用参数的时候,是按顺序进行取数、每一次迭代都更新数据,所有数据都取用过一次后,重新从头取用,那么这种配置规则下,数据到底是怎么取用的
呢,我们通过一个例子来说明一下:
假设要做一个登录业务的性能测试,且为并发测试场景,并发用户为2个,执行2轮,参数列表有8条数据,按照顺序依次为1到8,数据循环模式为重新循环,我们来看一下各设置组合下的取数情况(理想情况下):
除上述组合场景外,其它组合场景使用的机会很小,此处就不一一列出混淆视听啦。
这样整理下来,实际上是四种场景:
第一种场景(按用户取值):只关心并发的用户分别使用不同的值就可以了,其它不关心,如用户名;
第二种场景(按迭代取值):除了关心并发用户取不同值以外,还要每一轮迭代都要用不同的值;
第三种场景(按发生取值):每次发生的时候都取不同的值;
第四种场景(唯一且按发生):整个执行过程中每次取值都要求全局唯一的场景;
在前三种场景里,如果分配规则为顺序则表示按照顺序取值,不够的话按照循环规则循环取数,而分配规则为唯一的话,则表示可以循环取数,但本测试轮次里取值需要保证唯一,不够的话则发生异常终止运行。
参考文章: LoadRunner参数化详解 原文出处