loadrunner 参数化
loadrunner 参数化 路径
loadrunner 参数化路径LoadRunner 参数化是一种常用的性能测试技术,可以有效地模拟真实世界的负载情况,实现测试数据的灵活性和可重复性。
在LoadRunner中,参数化路径是指在测试过程中将路径作为参数进行动态调整,以模拟不同用户访问不同路径的情况。
为了更好地理解LoadRunner参数化路径的使用,我们首先需要了解LoadRunner的基本原理。
LoadRunner是一款用于模拟和分析应用程序性能的测试工具,通过模拟用户的行为和生成负载来评估系统的性能。
在性能测试中,经常需要模拟大量用户同时访问不同路径的情况,以验证系统的承载能力和响应时间。
在LoadRunner中,参数化路径可以通过多种方式实现,常用的有使用数据文件、使用函数和使用正则表达式等。
下面将分别介绍这几种参数化路径的方法。
使用数据文件进行参数化路径是最常见的方法之一。
通过将路径保存在一个数据文件中,LoadRunner可以在每次执行测试时,自动从数据文件中读取不同的路径,并进行相应的访问。
这种方法适用于需要模拟大量用户访问不同路径的情况,可以有效地减少测试脚本的维护工作。
使用函数进行参数化路径是另一种常见的方法。
LoadRunner提供了一系列内置函数,可以在测试脚本中使用这些函数生成不同的路径。
例如,可以使用lr_paramarr_random函数从一个路径数组中随机选择一个路径进行访问,或者使用lr_paramarr_idx函数按照一定的顺序选择路径进行访问。
这种方法适用于需要按照一定的规则生成路径的情况,可以灵活地控制路径的生成方式。
使用正则表达式进行参数化路径是一种更为灵活的方法。
LoadRunner提供了lr_eval_string函数,可以在测试脚本中使用正则表达式从一个字符串中提取出符合某种规则的路径。
例如,可以使用正则表达式从一个HTML页面中提取出所有的链接,并将这些链接作为路径进行访问。
这种方法适用于需要从复杂的页面中提取路径的情况,可以实现更加精细的参数化路径。
详细分析LoadRunner参数化
详细分析LoadRunner参数化在进⾏⽹页的性能测试时,对⽹页的登录界⾯进⾏压⼒测试情况下就会使⽤到多⽤户进⾏登录,就需要对登录名和密码进⾏参数化,那么loadrunner 怎么参数化设置呢?下⾯我们来详细分析⼀下。
⼀、我们这⾥通过loadurnner录制⼀个软件⾃带的航空⽹站登陆。
下⾯是截取的登录代码⼆、下⾯通过loadrunner对⽤户名和密码进⾏参数化设置。
1、双击jojo,右击选择Replace with a Parameter,弹出窗⼝Select or Create Parameter,在 Parameter name处输⼊变量名name,点击OK,密码重复名字的操作。
2、把⽤户名jojo改成变量name,密码bean改成变量psw三、下⾯对参数进⾏编辑添加。
第⼀种⽅法是直接在界⾯上添加编辑。
1、点击P图标或者按键盘ctrl +L 进⼊参数化设置界⾯,2、点击name进⾏编辑变量参数,点击Edit with Notepad,弹出记事本框,输⼊好⽤户名后,保存后,参数就设置完成了。
密码也是重复名字的操作。
3、也可以在界⾯上直接编辑,添加⾏、列或者删除⾏、列4、参数都添加后之后,我们要注意每个参数对应的名称5、也可以把所有的参数编辑在⼀个⽂件⾥⾯,⼀列对应⼀个参数。
6、当参数放在在⼀个⽂件⾥⾯时,设置处就要⼀⼀对应。
四、第2种⽅法对参数进⾏编辑添加,就是直接导⼊已编辑好了的数据。
1、在⽂件处选择已经编辑好的数据⽂件位置,点击打开后,⽂件111.dat的数据就⾃动导⼊进来了。
五、设置好参数后,就可以设置数据取值⽅式与更新⽅法。
1、Select next row: 选择下⼀⾏⽅法Sequential默认顺序的,按照参数化的数据顺序,从上往下⼀个⼀个的来取。
Random随机取,参数化中的数据,每次随机的从中抽取数据。
Unique唯⼀,唯⼀的向下取值,只能被⽤⼀次。
Same line as xxx,和xxx列取同⼀⾏的值,(⾏相同)步调⼀致例如:数据a b c d e f g ...,现有3个⽤户(甲⼄丙)取值;循环2次。
LoadRunner_参数化
Load Runner 参数化基础讲解Loadrunner中参数的设置在做负载或者压力测试时,很多人选择使用了Loadrunner测试工具。
该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。
但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数的设置问题。
本文就Loadrunner中参数的设置进行说明,希望对大家有所帮助。
在录制程序运行的过程中,VuGen(脚本生成器)自动生成了包含录制过程中实际用到的数值的脚本。
如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值。
这个过程称为参数化脚本。
本文主要包括如下内容:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。
除了GUI,以下的内容适合于各种类型的用户脚本。
一、关于参数的定义在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。
函数中参数的值就是在录制过程中输入的实际值。
例如,你录制了一个Web应用程序的脚本。
脚本生成器生成了一个声明,该声明搜索名称为“UNIX”的图书的数据库。
当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值“UNIX”。
那么,你就可以用参数来取代这个常量。
结果就是你可以用指定的数据源的数值来取代参数值。
数据源可以是一个文件,也可以是内部产生的变量。
用参数表示用户的脚本有两个优点:① 可以使脚本的长度变短。
② 可以使用不同的数值来测试你的脚本。
例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。
在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。
参数化包含以下两项任务:① 在脚本中用参数取代常量值。
loadrunner 参数化取值方式
loadrunner 参数化取值方式(原创版)目录1.概述2.LoadRunner 的基本概念3.LoadRunner 参数化取值的方式4.结论正文1.概述LoadRunner 是一种用于测试应用程序性能的负载测试工具。
它可以模拟大量用户同时访问应用程序,以评估其性能和稳定性。
在 LoadRunner 中,参数化是测试脚本中的一个重要部分,它可以帮助测试人员更轻松地管理和调整测试数据。
2.LoadRunner 的基本概念在 LoadRunner 中,参数化是指将测试脚本中的某些值替换为实际运行时获取的值。
这些值可以是数据库中的记录、文件中的数据或其他来源的值。
通过参数化,测试人员可以轻松地为测试脚本设置不同的输入数据,以模拟不同的用户操作和场景。
3.LoadRunner 参数化取值的方式LoadRunner 提供了多种参数化取值的方式,包括:(1) 直接参数化:在测试脚本中直接指定参数的取值。
例如,测试脚本中可以通过`lr_param_string`函数设置一个字符串参数的值。
(2) 从文件中读取参数:测试脚本可以从文件中读取参数的取值。
例如,可以使用`lr_load_string_file`函数从文件中读取字符串参数的值。
(3) 从数据库中获取参数:测试脚本可以从数据库中获取参数的取值。
例如,可以使用`lr_get_result_set`函数从数据库中获取记录集,并将其作为参数传递给测试脚本。
(4) 使用随机数生成器:测试脚本可以使用 LoadRunner 内置的随机数生成器生成随机参数值。
例如,可以使用`lr_random_number`函数生成一个随机数。
(5) 使用 Excel 文件:测试脚本可以从 Excel 文件中读取参数的取值。
例如,可以使用`lr_load_excel_file`函数从 Excel 文件中读取数据。
4.结论LoadRunner 提供了多种参数化取值的方式,测试人员可以根据实际需求选择合适的方式为测试脚本设置参数值。
LoadRunner参数化设置
LoadRunner参数化设置LoadRunner脚本处理时,为了满⾜业务需要、适应环境变化(例如使⽤不同的⽤户名、密码登录系统),经常使⽤参数化技巧。
简单介绍如下:⼀、创建参数选中要参数化的内容。
⽅法⼀,右键---【Replace with a new parameter】⽅法⼆,菜单【insert】----【new Parameter…】⼆、设置数据来源添加参数后,选择Properties。
如果参数类型为普通参数,数据来源⼀般有以下3种:⽂件、表格、数据库1、第⼀种⽂件:点击Browser,选择已保存好的数据⽂件2、第⼆种表格:点击Create Table,通过上⽅add column/delete column按键编辑或者Edit with Notepad在记事本中编辑。
3、第三种数据库:点击Data Wizard,打开数据库连接向导,创建数据库连接,编写SQL语句三、参数关联有些参数有关联关系,如何确保脚本使⽤正确关联的参数值呢?操作如下:以⽤户名、密码为例,⽤户名的参数化设置完成后,会保存成dat⽂件,在File列表中选择⽤户名的dat⽂件。
点击Add column添加新列,在当前页⾯编辑或者Edit with Notepad在记事本中编辑密码的数据来源。
四、参数分配与更新⽅式1、Select next row,有三个选项:顺序(Sequential):按照参数化的数据顺序,⼀个⼀个的来取。
随机(Random):参数化中的数据,每次随机的从中抽取数据。
唯⼀(Unique):为每个虚拟⽤户分配⼀条唯⼀的数据2、Update value on,有三个选项:每次迭代(Each iteration) :每次迭代时取新的值,假如50个⽤户都取第⼀条数据,称为⼀次迭代;完了50个⽤户都取第⼆条数据,后⾯以此类推。
每次出现(Each occurrence):每次参数时取新的值,这⾥强调前后两次取值不能相同。
loadrunner参数化详解
每次迭代遇到该参数时,取出的参数后加入什么值,与rows per iteration
配合使用
例如:rows per iteration设置为2
此处设置为分号
运行后显示的结果为
aa:a;b
bb:a;b
例如:rows per iteration设置为3
参数
值
结果
总结
第一次迭代
第二次迭代
第三次迭代
select next row
sequential
aa:a
aa:c
aa:b
顺序的取参数列表中的值
在一次迭代过程中如果再次遇到该参数时,所取得值是下一个值
在第二次迭代的时候会顺序取下一个值,所有取得值不会重复
update value on
each occurrence
bb:b
bb:a
bb:c
第三种设置
参数
值
结果
总结
第一次迭代
第二次迭代
第三次迭代
select next row
sequential
aa:a
aa:a
aa:a
不论迭代几次,无论在一次迭代中第几次遇到该参数均使用一个值
update value on
each once
bb:a
bb:a
bb:a
lr_message("bb:%s",lr_eval_string(bb));
return 0;
}
前提:
对aa,bb进行参数化,使用同一个参数列表
参数类型为table
脚本迭代次数为3次
参数列表为:
a
LoadRunner参数化关联
LoadRunner参数化关联我们⽤ HTTP 协议做脚本,要注意的是,不同协议的函数是不⼀样的,假如换 websocket 协议,关联函数就要⽤其他的参数化原理1、什么叫参数化 把脚本内⼀个写死的值,去⼀个数组内取值,进⾏替换2、为什么要参数化 烂⼤街的回答:模拟真实场景,模拟真实情况 真实原因:应⽤程序/数据库对数据有唯⼀性要求(应⽤程序内就是单点登录;数据库内就是该字段为 Unique ,唯⼀)避免查询缓存对结果造成失真(重复查询同⼀条数据,如果该数据的表内开启了查询缓存,则会命中。
那么响应时间会⽐市价值偏⼩)3、可不可以不⽤参数化 查询缓存的开关是⽤query_cache_size = 20M和query_cache_type = ON 打开查询缓存,程序校验就得修改代码了,数据库唯⼀要求,把 Unique 的限制给拿掉就ok如何参数化(参数化会变紫)1、选中需要参数化的内容,右键,选择"Replace with a Parameter",2、为参数命名,并且制定参数取值的⽂件格式 Parameter name,就是我么那要设定的参数名,这个是不能重复的 Parameter type 是参数取值的⽅式,这个 file 是从 .bat ⽂件中取值,这个⽂件会⾃动⽣成在项⽬路径下结果:例如:web_submit_data("提交","Action=http://192.168.66.129/bbs/member.php?mod=register&inajax=1","Method=POST","TargetFrame=","Referer=http://192.168.66.129/bbs/member.php?mod=register",ITEMDATA,"Name=regsubmit", "Value=yes", ENDITEM,"Name=formhash", "Value={formhash}", ENDITEM,"Name=referer", "Value=http://192.168.66.129/bbs/forum.php", ENDITEM,"Name=activationauth", "Value=", ENDITEM,"Name={Name}", "Value=hua00{username}", ENDITEM,"Name={pass}", "Value=123456", ENDITEM,"Name={conpass}", "Value=123456", ENDITEM,"Name={mail}", "Value=hua00{username}@", ENDITEM,LAST);另⼀种情况,我们要把另⼀个数值也运⽤之前同⼀个参数咋办?另外,我们的参数化还有种⽅式:可以先建好,然后再脚本内⽤,这种情况适⽤于只给了脚本,但是没有给参数化⽂件的情况打开变量列表,填写变量值参数化变量和值是怎样对应的根据脚本中的参数名({username})去找参数列表中的的参数username,再去找参数列表中的username对应的bat⽂件注意,我们 loadrunner 的参数化默认是以 {} 为边界的,我们也可以修改这个参数化的边界类型:在 Tools-->General Options-->Parameterization的Paramrter Braces 内可以设置,我们可以看到默认是 {}参数化策略 最常⽤的取值⽅式:唯⼀(Unique+XX)我们写⼀个脚本来执⾏不同的参数化策略:Action(){int i; //申明变量for (i = 0;i<2;i++) { //循环char *a = "{p1}"; //获取参数值传给 achar *b = "{p2}"; //获取参数值传给 bchar *c = "{p1}"; //获取参数值传给 clr_output_message("%s,\t%s,\t%s",lr_eval_string(a),lr_eval_string(b),lr_eval_string(c)); //分贝演⽰ 9 种不同的参数化策略组合结果}return0;}如下Loadrunner参数化取值策略由[select next row]、[update value on]两部分组成。
LoadRunner参数化设置:数据分配与取值方式
LoadRunner参数化设置:数据分配与取值⽅式参数化设置中有九种取值⽅式:(以⽤户名参数user为例,其数据参数列表为:jojo、201401、201402、201403、201405、201406、201407、201408、201409,迭代次数设置为10次) 1、Sequential+Each Iteration 脚本会执⾏10次,每次迭代会按数据列表顺序取值,每⼀次迭代中出现的参数user的值是当前第⼀次参数替换的值。
第1次迭代均为jojo,以此类推。
2、Sequential+Each Occurrence 脚本执⾏10次,每次迭代中出现参数user,顺序取值⼀次,第1次迭代中出现3次user,则user取值为jojo、201401、201402,等到取值到201409,下次会从第⼀个数顺序取值。
3、Sequential+Once 脚本执⾏10次,user只取值⼀次,每次出现的user替换参数值都是jojo。
4、Random+Each Iteration 脚本执⾏10次,数据表中的数据随机取,⽐如第⼀次迭代取值201405,则这次迭代中出现参数user地⽅则⽤201405替代。
5、Random+Each Occurrence 脚本执⾏10次,数据表中的数据随机取,迭代过程中只要出现参数user的地⽅就随机取值⼀次。
第1次迭代出现3次user,则随机数为201407、jojo、201403。
6、Random+Once 脚本执⾏10,数据表中数据随机取值,参数user只取值⼀次,10次迭代过程中出现参数user的地⽅都是⽤随机取值(⽐如201406)替代。
7、Unique+Each Iteration 每个⽤户对应⼀次数据,当迭代次数超过⽤户数据量,根据设置情况处理情况,如下图所⽰: 每次迭代出现的参数user⽤当前取值替代。
8、Unique+Each Occurrence 当前有9条数据,没出现⼀次参数user,只能⽤⼀个数值替代,9条数据取完之后根据设置超出值处理。
loadrunner参数化说明
LR参数取值的几种配置介绍
“Select next row ”有以下几种选择:
⏹ Sequential:按照顺序一行行的读取。
每一个虚拟用户都会按照相同的顺序读取
⏹ Random:在每次循环里随机的读取一个,但是在循环中一直保持不变
⏹ Unique :唯一的数。
注:使用该类型必须注意数据表有足够多的数。
比如Controller 中设定20 个虚拟用户进行5 次循环,那么编号为1 的虚拟用户取前5个数,编号为2 的虚拟用户取6-10 的数,依次类推,这样数据表中至少要有100个数据,否则Controller 运行过程中会返回一个错误。
⏹ Same Line As 某个参数(比如Name):和前面定义的参数Name 取同行的记录。
通常用在有关联性的数据上面。
我们这里取值Sequential 即可。
Advance row each iteration 选中即可,表示每一次循环都往前走一行。
手工输入数据比较简单,这里就不再单独介绍了。
LR参数取值配置举例:
假设有2个虚拟用户,每个用户执行3次循环,共有10条数据,如下:100001,100002,100003,100004,100005,100006,100007,100008,1000109,100110。
如何使用Loadrunner进行参数化设置
LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值,这个过程叫做参数化。
以下为参数化过程:参数化过程比较简单,参数化时复杂的是对参数属性的设置。
主要是以下两个属性的组合。
select next row 中有三个选项: Sequential(顺序读取)、Random(随机读取)、Unique (唯一)update the value 中也有三个选项: Each Occurrence(每次遇到 )、 Each iteration(每次迭代 )、 Once(一直 )这两个属性可以有九种组合方式,每种方式都不一样。
接下来我们就用一个小实例来验证一下每种取值方式的效果。
录制一个lr自带实例WebTours的定单脚本。
脚本中将出发城市与到达城市均参数化一下。
参数化后还需做个关联(这个就重点说了)保证回放脚本成功。
设置10个用户并发持续加载的场景(参数文件中有10个数据),用默认设置均可。
即每15秒加载两个用户,持续时间为5分钟,每30秒停止5个用户。
然后并发跑脚本。
以下为9种组合的测试结果:(1)sequential Once十个用户每个用户取值均一样,,每个用户的所有迭代中的取值均一样。
第一个用户执行了5次迭代,每次迭代均取得第一个参数。
第二个用户也执行了5次迭代,每次迭代均取的第一个参数。
第三个。
第四个。
等等十个用户均一样。
(2)unique once十个用户每个用户取值都唯一,每个用户的所有迭代中的取值均一样。
第一个用户执行了5次迭代,每次迭代均取第一个参数;第二个用户执行了5次迭代,每次迭代均取第二个参数;第三个。
第四个。
依此类推。
第十个用户执行了5次迭代,每次迭代均取第十个参数。
(3)Random Once十个用户,每个用户为随机取值,每个用户的所有迭代中的取值均一样。
Loadrunner 参数化_迭代参数说明
Loadrunner参数化策略测试小组齐国杰使用工具:Loadrunner 8.1试用版引子近日没有具体的项目做,就总去泡论坛,发现有的网友会问一些参数化的问题,回答他们的问题时,突然发现自己也是一知半解,因此写了三个实验脚本,目的是彻底搞清楚参数化的做法以及参数化策略的疑问。
流程参数化要做一些准备,主要是参数化数据的准备,例如TXT 文本、EXCEL表格以及数据库中的表都可以作为参数的数据集载体,而且LR都是支持的。
具体的参数化流程如下:1、录制脚本2、准备参数的数据集(也可以不准备,让LR自己生成固定格式参数)3、把对应的变量参数化4、选择对应的参数化策略具体的操作请查询LR帮助手册例子下面我来介绍几个例子,例子统一使用try_params.txt做参数数据集,txt内容如下:aaa bbba1 b1a2 b2……a30 b30脚本一:Action(){char *a = "{aaa}"; //获得参数赋值给achar *b = "{bbb}";//获得参数赋值给blr_log_message("%s,%s,%s,",lr_eval_string(a),lr_eval_string (b),ctime(&t));//打印结果return 0;}运行时设置:设置action的迭代次数为30(runtime-setting的Run Logic里)回放结果:备注:“…,…”省略符号,如果前后都相同则省略相同部分,如果前后不同则省略不同部分。
脚本二:Action(){int i; //循环种子for (i=0;i<30;i++) //循环30次{char *a = "{aaa}"; //获得参数赋值给achar *b = "{bbb}";//获得参数赋值给blr_log_message("%s,%s\n",lr_eval_string (a),lr_eval_string (b));}//打印结果return 0;}运行时设置:设置action的迭代次数为1(runtime-setting 的Run Logic里)回放结果:备注:“…,…”省略符号,如果前后都相同则省略相同部分,如果前后不同则省略不同部分。
loadrunner基础入门之事务、同步点(集合点)和思考时间、参数化、检查点
事务、同步点(集合点)和思考时间、参数化、检查点1 Transaction(事务)事务是计算机程序设计中一个很重要的概念。
一个事务应该具有原子性、一致性、隔离性和持久性。
在LoadRunner里,我们定义事务主要是为了度量服务器的性能。
每个事务度量服务器响应指定的Vuser请求所用的时间,这些请求可以是简单任务(例如等待对单个查询的响应),也可以是复杂任务(例如提交多个查询和生成报告)。
1.1 手动设置Transaction的方法(显式事务)(1)选择新Transaction开始点,在被度量脚本段之前插入lr_start_transaction。
(2)选择新Transaction结束点,在被度量脚本段之后插入lr_end_transaction。
Lr_start_transaction("login");web_submit_form("auth","Snapshot=t2.inf",ITEMDATA,"Name=ssousername","Value=robin", ENDITEM,"Name=password", "Value=123456", ENDITEM,"Name=remember", "Value=<OFF>", ENDITEM,LAST);Lr_end_transaction("login”);1.2 自动事务(隐式事务)在Run-time Settings中,在Miscellaneous选项卡的Automatic Transactions中定义自动事务。
可以设置LoadRunner直接按事务处理Vuser中的每个Action或step。
这里,Action 指的是vuser_init、Action和vuser_end三大函数,而step指的是LoadRunner执行的每个函数。
LoadRunner参数化功能分享
单击add Row 按钮,并添加相应的内容
经验分享:添加完成后单击右下角的Close关闭整个Parameter List 窗口,整个 参数化内容设置完毕,回放一下,会发现完全没有任何效果,这里还要多做两件 事情: 1.设置运行的次数,打开Run_time Setting,找到Run logic,设置迭代次数为3 2.打开Log,显示参数存取值的信息,打开Run_time Setting中的Log选项,选中 Enable Logged 并且使用Always send message,在Log的等级中设置使External log并 且选中Parameter log设置完成之后,关闭设置的对话框,再来运行一次脚本,就会 看到Replace Log窗口中出现了每次参数取值的结果。
(1)AB|CD|EFA (2)AA|BB|CCC (3)AB|CD|EFF (4)AA|AA|AAA
例如,录制一个用户在电子商务网站下订单的脚本,无论如何 回放,得到的结果都是相同的用户下相同的订单,这个与我们 用户在商城购物的实际业务场景有着较大的区别,这是由于脚 本中的内容都是静态造成的,只有通过参数化才能解决这个问 题。
参数类型
虽然最常用的参数类型是文件型参数,它可以方便地自定义任 意数据组合,接下来的参数化操作也是以文件类型为例子开展, 但VuGen 也提供了很多实用的参数类型。例如 1.BPT 该参数类型是与QC或ALM产品的BPT模块对应的。当使用它们作 为性能测试代码的管理工具并且是从其BPT模块中生成代码时,该 功能会读取BPT模块中参数的类型 2.Custom 这里提供了一个自定义的参数类型,只需要填写参数值即可使用, 为了阅读方便也可以写上对应的description 3.Date/Time 该参数类型提供了获取当前时间的参数化方法,虽然在VuGen中可 以使用C语言的now()函数来获得当前的日期,但是不如参数化中 的简单明了。
loadrunner怎么设置参数化?loadrunner参数化设置的图文教程
loadrunner怎么设置参数化?loadrunner参数化设置的图
⽂教程
在进⾏使⽤到loadrunner的⼯具进⾏对⽹页进⾏性能的测试,⽽对⽹页的性能测试时,对有⽹页的登录的界⾯,在做压⼒测试情况下就会使⽤到多⽤户进⾏登录,就需要对代码进⾏参数化,那么loadrunner怎么参数化设置呢?下⾯⼩编要为⼤家带来的是loadrunner参数化设置的图⽂教程!感兴趣的朋友⼀起去看看吧!
⽅法:
1、在loadrunner的进⾏编写脚本,或者⼀个⽹页登录界⾯进⾏录制脚本,录制完成之后,在脚本找登录的⽤户名,选中⽤户右键》》replace with a pararmeter。
2、弹出了⼀个为select or create parameter的框,可以对parameter name名称重名,也可不命名。
3、这样在代码脚本中的⽤户名就变为了⼀种颜⾊,变为参数名。
4、需要对参数名进⾏参数化,可以点击菜单中的open parameter list的按钮,点击进⼊。
5、可以看到的是newparam默认的⼀个参数了为xinling,需要在⾏中在添加数据,可点击add row添加⾏,输⼊数据双击value就可进⾏输⼊,输⼊⽹页中其它的⽤户名。
6、参数化数据准备好之后,就进⾏执⾏了,在执⾏前,需要到run-time settings设置的界⾯中,run logic的选项界⾯中,把循环的次数改为2次,因准备数据只有两条了,
7、设置完成之后,可以点击loadrunner的界⾯中菜单运⾏按钮,等待脚本完成之后,可以在执⾏log看到执⾏的结果数据,是成功执⾏成功的。
Loadrunner中参数化取值方式分析
Loadrunner中参数化取值⽅式分析Loadrunner中参数化取值依赖两个维度:1.取值顺序分为“顺序”“随机”“唯⼀”。
select next row:Sequential , Random,unique2.更新值时分为“每次迭代”“每次更新”“仅⼀次”。
update value on:Each iteration ,Each occurence,Once3 当参数不够⽤时的补救策略分成[从头再来][凑合使⽤最后⼀个][放弃部分⽤户]按照基本排列组合会产⽣9种组合,现在⼀⼀进⾏分析测试脚本Action(){int i = 0;for (i=0; i<3; i++) {lr_eval_string("{p1}");lr_eval_string("{p2}");}return0;}p1=a1......a10p2=b1......b10以上测试代码中运⾏⼀次叫做⼀次迭代,每次迭代中有⼀个for循环,循环中参数P1和参数p2会分别出现3次。
取值结果我们从单⽤户和多⽤户取值来分析1.顺序+每次迭代单⽤户运⾏结果多⽤户运⾏结果我们以参数设置的模拟器进⾏查看分析由此可见,顺序+每次迭代只是在迭代的时候更新⽤户值,并且多⽤户每次迭代取值都是⼀样的。
2.顺序+每次出现单⽤户结果如下:p1和p2参数每次出现的值都不⼀样,说明每次出现都会更新值多⽤户的取值情况如下:3.顺序+仅⼀次,单⽤户和多⽤户的情况⼀致,都只取唯⼀值多⽤户的情况取值如下:4.随机+每次迭代5.随机+每次更新6.随机+once注;⽤户⼀与⽤户⼆的取值不⼀定相同,但有概率相同7.唯⼀+每次迭代取值⽅式选择了唯⼀的情况,并发⽤户1与并发⽤户2的取值是数据总池的⼦集,并发⽤户1与并发⽤户2之间没有⼦集并发⽤户1 p1 :a1-------a5 并发⽤户2 p1:a6---------a10p2:b1--------b5 p2:b6---------b108.唯⼀+每次更新解释:当多⽤户运⾏时,每个⽤户分配5个值,当所有值使⽤完,继续使⽤最后那个值9.唯⼀+once。
loadrunner 参数化取值方式
loadrunner 参数化取值方式LoadRunner 是一款流行的性能测试工具,它具有灵活和强大的参数化功能,使用户能够对测试场景中的各种数据进行有效管理。
在LoadRunner 中,参数化是一种将实际值替换为参数的过程,以模拟用户在测试过程中产生的不同数据。
在参数化过程中,用户可以使用多种方式来获取参数的值。
他们可以通过手动输入、使用函数或者从外部文件中读取参数值。
本文将详细介绍LoadRunner 中几种常用的参数化取值方式,并逐步说明如何使用中括号来实现这些方式。
1. 手动输入参数值这是最简单的参数化方式,用户只需在LoadRunner 脚本中直接输入参数的值。
例如,假设我们要测试一个登录功能,用户名和密码是两个参数,我们可以这样设置参数值:char* username = "testUser";char* password = "testPassword";这种方式适用于参数值稳定不变的情况,但一旦参数值发生变化,就需要手动修改脚本。
2. 使用函数获取参数值LoadRunner 有许多内置函数可以用来获取参数的值,例如lr_eval_string、lr_paramarr_random 等。
这些函数可以在脚本运行时动态生成参数值,使得测试数据更加真实和多样化。
下面是一个使用lr_eval_string 函数获取参数值的示例:char* username = lr_eval_string("{Param_username}");char* password = lr_eval_string("{Param_password}");在上述示例中,{Param_username} 和{Param_password} 是用户在LoadRunner GUI 中定义的参数名,函数lr_eval_string 会返回这些参数的实际值。
Loadrunner参数化详解
试验过程:1、使用loadrunner 录制一个脚本;2、录制脚本内容为登录一个web 网站,并下载网站的一个文件;(注本例无登录和退出操作)3、把所下载的文件设置参数化;4、对select next row 和update value on 进行两两组合,并设置不同用户数量(用户数量多余参数数量和等于参数数量)和迭代次数(1 次迭代或多次迭代)参数列表:1、test-0.chm2、test-2.chm3、test-3.chm4、test-4.chm5、test-5.chm6、test-6.chm7、test-7.chm8、test-8.chm9、test-9.chmaction 代码:web_url("myweb", "URL=http://172.16.41.112/myweb/","Resource=0","RecContentType=text/html","Referer=","Snapshot=t5.inf","Mode=HTML",LAST);web_li nk(//"{move name}", "test-O.chm", "Text={move name}", "Sn apshot=t6.i nf", LAST); 实例(试验结果):action 代码:web_url("myweb","URL=http://172.16.41.112/myweb/","Resource=0","RecConte ntType=text/html","Referer=","Snapshot=t5.inf, "Mode=HTML",LAST);webji nk(〃"{move name}","test-O.chm","T ext={move name}","Snapshot=t6.inf, LAST);web_url("myweb","URL=http://172.16.41.112/myweb/","Resource=0","RecConte ntType=text/html","Referer=","Snapshot=t5.inf, "Mode=HTML",LAST);webji nk(〃"{move name}","test-O.chm","Text={move name}","Sn apshot=t6.i nf", LAST); 实例(试验结果):。
loadrunner参数化取值方式详解
loadrunner参数化取值⽅式详解参数化对话框中与参数取值⽅式有关的区域如下:改变参数化的取值⽅式,关键在于Select next row和Update value on这两个选项。
Select next row包括以下选项:Sequential:顺序⽅式Random:随机⽅式Unique:唯⼀⽅式 Update value on包括如下选项:Each iteration:每次迭代更新取值Each occurrence:每次取值更新Once:只更新⼀次以下代码以登录接⼝和参数化进⾏演⽰,参数化⽂件中有2个值lr_output_message("login_username:%s",lr_eval_string("{login_username}"));web_custom_request("login","URL=http://192.168.44.130:8080/mobile/api/user/login","Method=POST","TargetFrame=","Resource=0","Referer=","Mode=HTTP","EncType=application/json;charset=utf-8","Body={\"mobile\":\"{login_username}\",\"password\":\"123456\"}",LAST); 参数化⽂件中的数据为:131********131********第⼀种取值⽅式:Sequential+Each iteration,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 1.Starting iteration 2.Notify: Next row for parameter login_username = 2 [table = login_username].Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 2.Starting iteration 3.Notify: Next row for parameter login_username = 1 [table = login_username].Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 3.第⼆种取值⽅式:Sequential+Each occurrence,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Notify: Next row for parameter login_username = 1 [table = login_username].Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 2.Starting iteration 3.Starting action Action.Action.c(18): Notify: Next row for parameter login_username = 1 [table = login_username].Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 3.第三种取值⽅式:Sequential+Once,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 2.Starting iteration 3.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 3.第四种取值⽅式:Random+Each iteration,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 1.Starting iteration 2.Notify: Next row for parameter login_username = 1 [table = login_username].Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 2.Starting iteration 3.Notify: Next row for parameter login_username = 2 [table = login_username].Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 3.第五种取值⽅式:Random+Each occurrence,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Notify: Next row for parameter login_username = 1 [table = login_username].Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 2.Starting iteration 3.Starting action Action.Action.c(18): Notify: Next row for parameter login_username = 1 [table = login_username].Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 3.第六种取值⽅式:Random+Once,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 2.Starting iteration 3.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending iteration 3.第七种取值⽅式:Unique+Each iteration这种取值⽅式,⼜可以有以下⼏种设置:当值不⾜时,可以选择以下3种⽅式:1)、中断虚拟⽤户2)、循环取参数中的值,返回到第⼀⾏取值3)、取最后⼀⾏值以下运⾏结果以Abort Vuser为例执⾏,其它情况可⾃⾏设置运⾏,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 1.Starting iteration 2.Notify: Next row for parameter login_username = 2 [table = login_username].Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 2.Starting iteration 3.Error: Parameter 'login_username': No more unique values for this parameter in table 'login_username.dat' [unique range is 1-2]. The Vuser is aborted according to "When Out Of Values" policy.Action was aborted.Ending Vuser...第⼋种取值⽅式:Unique+Each occurrence,参数不够⽤时,也会报错,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '1'.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Next row for parameter login_username = 2 [table = login_username].Action.c(20): Notify: Getting new value for parameter 'login_username': table = 'login_username.dat' column = '0' row = '2'.Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Error: Parameter 'login_username': No more unique values for this parameter in table 'login_username.dat' [unique range is 1-2]. The Vuser is aborted according to "When Out Of Values" policy. Abort was called from an action.Ending Vuser...第九种取值⽅式:Unique+Once,参数不够⽤时,也会报错,设置迭代次数为3次,参数取值结果为:Starting iteration 1.Maximum number of concurrent connections per server: 6 [MsgId: MMSG-26989]Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 1.Starting iteration 2.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385]Ending action Action.Ending iteration 2.Starting iteration 3.Starting action Action.Action.c(18): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(18): login_username:131********Action.c(20): web_custom_request("login") started [MsgId: MMSG-26355]Action.c(20): Notify: Parameter Substitution: parameter "login_username" = "131********"Action.c(20): web_custom_request("login") was successful, 361 body bytes, 157 header bytes, 12 chunking overhead bytes [MsgId: MMSG-26385] Ending action Action.Ending iteration 3.总结:。
实训 LoadRunner测试脚本的参数化
实训LoadRunner测试脚本的参数化1.1实训目标能够使用参数化数据解决系统压力问题能够使用数据池中数据对参数变量实施参数化能够使用数据库中数据对参数变量实施参数化具备使用不同数据对系统施加预期压力的能力1.2问题引出:观察以下示例代码web_url("MercuryWebTours","URL=http://localhost/MercuryWebTours/","Resource=0","RecContentType=text/html","Referer=","Snapshot=t2.inf","Mode=HTML",LAST);lr_think_time(5);web_submit_form("login.pl","Snapshot=t3.inf",ITEMDATA,"Name=username", "Value=jojo", ENDITEM,"Name=password", "Value=bean", ENDITEM,"Name=login.x", "Value=53", ENDITEM,"Name=login.y", "Value=18", ENDITEM,LAST);代码分析:在这段代码中,用灰色背景黑色字体标识的是用户输入的用户名和口令,如果直接使用这段脚本对应用进行测试,则所有VU都会使用同一个用户名和口令登录系统。
如果要模拟更加真实的应用场景(例如,不同权限的用户执行同一个操作),就有必要将用户名和口令用变量代替,为变量的取值准备一个“数据池”并设定变量的取值规则,这样每个VU在执行的时候就能根据要求取不同的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、关于参数的定义函数中参数的值就是在录制过程中输入的实际值。
例如,你录制了一个 Web 应用程序的脚本。
脚本生成器生成了一个声明,该声明搜索名称为“软件测试” 的图书的数据库。
当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值“ 软件测试”,还需要其他的值如“项目管理” 。
例如平常经常用到的,登陆界面输入用户名和密码,那么,你就可以用参数来取代这个常量。
结果就是你可以用指定的数据源的数值来取代参数值。
数据源可以是一个文件,也可以是内部产生的变量。
用参数表示用户的脚本有两个优点:① 可以使脚本的长度变短。
② 可以使用不同的数值来测试你的脚本。
例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。
在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。
参数化包含以下两项任务:① 在脚本中用参数取代常量值。
② 设置参数的属性以及数据源。
参数化仅可以用于一个函数中的参量。
你不能用参数表示非函数参数的字符串。
另外,不是所有的函数都可以参数化的二、参数的创建可以指定名称和类型来创建参数。
不存在对脚本中参数个数的限制。
在 Web 程序的用户脚本中,你可以使用如下过程在基于文本的脚本视图中创建参数。
或者,也可以在基于图标的树形视图中创建参数。
在基于文本的脚本视图中创建一个参数:1 、将光标定位在要参数化的字符上,点击右键。
打开弹出菜单。
2 、在弹出菜单中,选择“Replace with a Parameter” 。
选择或者创建参数的对话框弹出。
3 、在“Parameter name” 中输入参数的名称,或者选择一个在参数列表中已经存在的参数。
4 、在“Parameter type” 下拉列表中选择参数类型1)、 Date/Time Date/Time 用当前的日期 / 时间替换参数。
要指定一个 Date/Time 格式,你可以从菜单列表中选择格式,或者指定你自己的格式。
这个格式应该和你脚本中录制的Date/Time 格式保持一致。
你可以设置一个时间参数的偏移量,如果你打算测试下个月的日期,你就可以选择偏移量为30。
你也可以设置前偏移量和后偏移量,默认的是前偏移量。
另外你可以命令vguen在工作日使用date值,不包括周六和周日(没有明白这个的具体用处,明白的请告知)。
c complete date and time in digits#c complete date as a string and timeH hours (24 hour clock)I hours (12- hour clock)M minutesS secondsp AM or PMd daym month in digits (01-12)b month as a string - short format (e.g. Dec)B month as a string - long format (e.g. December)y year in short format (e.g. 03)Y year in long format (e.g. 2003)char *c =" {NewParam}";lr_output_message("current time %s",lr_eval_string (c));试试结果吧,呵呵2 )、 Group Name Group Name 用虚拟用户组名称替换参数。
在创建 scenario 的时候,你可以指定虚拟用户组的名称。
当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None 。
char *c =" {NewParam}"; //%05schar *d="{NewParam_1}";//%07slr_log_message("group(5s) is %s,group(7s)is %s",lr_eval_string (c),lr_eval_string (d));显示的结果为:group(5s)is 0None,group(7s)is 000None3). Iteration Number Iteration Number 用当前的迭代数目替换参数设置迭代次数为3char *c =" {NewParam}"; //%05schar *d="{NewParam_1}";//%07slr_log_message("Iteration(5s) is %s,Iteration(7s)is %s",lr_eval_string(c),lr_eval_string (d));结果为:Iteration(5s) is 00001,Iteration(7s)is 0000001Iteration(5s) is 00002,Iteration(7s)is 0000002Iteration(5s) is 00003,Iteration(7s)is 00000034)、 Load Generator Name Load Generator Name 用脚本负载生成器的名称替换参数。
负载生成器是虚拟用户在运行的计算机。
5)、 Random Number Random Number 用一个随机数替换参数。
通过指定最大值和最小值来设置随机数的范围。
6)、 Unique Number Unique Number 用一个唯一的数字来替换参数。
你可以指定一个起始数字和一个块的大小。
7 、 Vuser ID Vuser ID 用分配给虚拟用户的 ID 替换参数, ID 是由 Loadrunner 的控制器在 scenario 运行时生成的。
如果你从脚本生成器运行脚本的话,虚拟用户的 ID 总是 -1 8、User-Defined Functions ―― 调用外部 DLL 函数生成的数据,函数必须是如下格式:__declspec(dllexport) char *<functionName>(char *, char *) 例如:__declspec(dllexport) char *UF_GetVersion(char *x1, char *x2) {return "Ver2.0";} 9、table或file 从已存在的数据库中导入文件可以使用下列两种方式之一:1. 使用 Microsoft Query (要求在系统上先安装 MS Query )。
2. 指定数据库连接字符串和SQL语句。
用户脚本生成器在从数据库中导入数据的过程中提供了一个向导。
在向导中,你指明如何导入数据-通过 MS Query 创建查询语句或者直接书写 SQL 语句。
在导入数据以后,以 .dat 为后缀并作为正规的参数文件保存。
要开始导入数据库中数据的过程,在参数属性对话框中点击“ Data Wizard ”,则,数据库查询向导弹出。
要创建新的查询1. 选择“ Create new query ”。
如果需要 MS Query 的帮助,选择“ Show me how to use Microsoft Query ”,然后点击“ Finish ”。
如果你还没有安装 Microsoft Query , Loadrunner 会提示你这个功能不可用。
在进行之前,从 Microsoft Office 中安装 MS Query 。
2. 在 Microsoft Query 中遵循以下步骤,导入期望的表和列。
3. 在完成数据的导入后,选择“ Exit and return to Virtual User Generator ”,然后点击“ Finish ”。
在参数属性对话框中数据库记录以 data 文件的形式显示出来。
要在 MS Query 中编辑并查看数据,选择“ View data or edit in Microsoft Query ”。
若要结束,则选择“ File>Exit and return to Virtual User Generator ”返回到脚本生成器。
4. 在“ Select Column ”部分,指定包含当前参数数据的列可以指定列号或者列名。
注意:列标题默认为第 0 行( row 0 )。
5. 从“ Select next row ”列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。
可选项是: Sequential 、 Random 、 Unique 或者 Same Line As 。
6. 如果选择“ Advance row each iteration ”,虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。
要指定数据库连接或者 SQL 语句1. 选择“ Specify SQL Statement ”,然后点击“ Next ”。
2. 点击“ Create ”指定一个新的连接字符串。
选择数据源的窗口弹出。
3. 选择已有的数据源,或者点击“ New ”创建一个新的数据源。
向导将提示你穿过创建 ODBC 数据源的过程。
在完成后,连接字符串就会在连接字符串框中显示出来。
4. 在 SQL 框中,输入或者粘贴 SQL 语句。
5. 点击“ Finish ”继续 SQL 语句并导入数据。
数据库记录将以 data 文件的形式显示在参数属性框中。
6. 在“ Select Column ”部分中,指定包含当前参数数据的列。
你可以指定列号或者列名。
7. 从“ Select next row ”列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。
可选项是: Sequential 、 Random 、 Unique 或者 Same Line As 。
8. 如果选择“ Advance row each iteration ”,虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。
数据文件数据文件包含着脚本执行过程中虚拟用户访问的数据。
局部和全局文件中都可以存储数据。
可以指定现有的 ASCII 文件、用脚本生成器创建一个新的文件或者引入一个数据库。
在参数有很多已知值的时候数据文件非常有用。
数据文件中的数据是以表的形式存储的。
一个文件中可以包含很多参数值。
每一列包含一个参数的数据。
列之间用分隔符隔开,比如说,用逗号。
对数据文件设置参数属性如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式,包括列的分隔符、更新方法。
如果参数的类型是“ File” ,打开参数属性( Parameter Properties )对话框,设置文件属性如下:1 、在“File path” 中输入文件的位置,或者点击“Browse” 指定一个已有文件的位置。