如何巧用LoadRunner的excel随机函数怎么用

you have been blocked在LoadRunner中从数组类型的参数随机取值的方法
使用web_reg_save_param做关联后,有时候会有多个匹配值。
为了模仿用户行为随机取一个值为后续transcation所用,可以使用lr_paramarr_random函数。
web_reg_save_param("EntryID",
"LB=_41\"\&\&nobr\&",
"Ord=All",
"NOTFOUND=WARNING",
lr_save_string(lr_paramarr_random("EntryID"), "EntryID_Preview");
上例中EntryID有多个值,以array存在。而EntryID_Preview便从中随机地取一个值。
lr_paramarr_random实例(关联参数随机取值)
关联参数取值时,若太多值,需要处理一下,介绍一个函数可直接随即取一个值,方便易理解,这是拿电脑报价做的一个简单的例子。
char str[10];
lr_think_time(1);
web_reg_save_param("sid",
"LB=&a href=\"?sId=",
"RB=&aId=100\"&",
"Ord=All",
"NotFound=ERROR",
web_url("192.168.74.4:8081",
"URL=http://192.168.74.4:8081/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTTP",
//统计参数个数
count = atoi(lr_eval_string("sid_count"));
//加判断,如果没有取到参数,就返回,或给一个固定值
if(count = 0){
//在所有的参数中随即取一个值,赋给一个变量,注意这里的Value只是变量,而不是LR所认可的参数值
Value = lr_paramarr_random("sid");
lr_output_message("Value=%s",Value);
lr_save_string(Value,"str");//保存一个非空的值到一个参数里
lr_think_time(1);
web_url("蓝牙耳机",
"URL=http://192.168.74.4:8081/?sId={str}&aId=100",
"Resource=0",
"RecContentType=text/html",
"Referer=http://192.168.74.4:8081/",
"Snapshot=t2.inf",
"Mode=HTTP",
阅读(...) 评论()性能测试(103)
有时我在这脚本中需要随机的取下拉菜单或列表(list)中的值,那么我们就要用到随机数。下面就随机数的用法举例说明下.
str=rand(); //生成任意随机数
str=rand()%200 //生成最大值为200的随机数
str=rand()%100+200 //生成200-300之间的随机数
srand(time(NULL));&
//特别注意:加上这句,每次取不同的随机值
iRand = rand()%100;
if( 30&=iRand )
lr_output_message("The value of iRand is:%d,iRand &
30",iRand);
lr_output_message("The value of iRand is:%d,iRand &
30",iRand);
&return 0;
在关联中的一点应用:(确定一个关联中count的值)
web_reg_save_param("search_param",
"LB=&p&&A HREF=",
"RB=&", "ORD=All");
... search
rand_selection = ( rand() %
atoi(lr_eval_string("{search_param_count}")) +
产生一个新值(randselection)作为后缀去(随机)获得查找后的值
sprintf(my_new_parameter, "{search_param_%d}",
rand_selection);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:642569次
积分:9661
积分:9661
排名:第1788名
原创:395篇
转载:104篇
评论:43条
阅读:27618
文章:15篇
阅读:14980
(8)(6)(1)(6)(13)(5)(1)(6)(5)(7)(2)(1)(3)(1)(4)(1)(1)(8)(1)(5)(10)(10)(3)(9)(4)(2)(2)(1)(1)(1)(4)(1)(2)(5)(1)(328)(2)(1)(1)(3)(4)(3)(2)(3)(2)(3)(1)(2)(3)Posts - 275,
Articles - 1,
Comments - 2768
大人不华,君子务实。
22:59 by 虫师, ... 阅读,
  用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的。例如一次订单提交,用户需要时间核对自己填写的信息是否正确等。
  也就是说用户在做某些操作时,是会有停留时间的,我把这个时间叫思考时间。但利用代码去执行的时候是没有时间的,当然,脚本运行本身是需要时间的,但比起人的思考时间要小很多。这也是我们为什么要用软件来代替人的某些工作。
  但有时候,我们在做性能测试时,为了更真实的模拟用户的操作,需要给代码加入思考时间。来看看在loadrunner是如何设置思考时间的。
打开loadrunner&的Virtual&User&Generator
菜单栏:Vuser&---Run-Time&settings...,切换到Thark&Time选项
好吧!为了更好的理解这个界面上设置,现在我们通过一个脚本来分析。
double trans_
//定义变量
web_url("",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
web_url("i-1.0.0.png",
"URL=/r/www/img/i-1.0.0.png",
"Resource=1",
"RecContentType=image/png",
"Referer=/",
"Snapshot=t2.inf",
web_url("favicon.ico",
"URL=/favicon.ico",
"Resource=1",
"RecContentType=image/x-icon",
"Referer=",
"Snapshot=t3.inf",
web_url("su",
"URL=/su?wd=&cb=window.bdsug.sugPreRequest&sid=1466&t=3",
"Resource=1",
"RecContentType=baiduapp/json",
"Referer=/",
"Snapshot=t4.inf",
lr_start_transaction("注册");
//添加事务
lr_think_time(20);
//设置思考时间
web_url("v.gif",
"URL=/v.gif?pid=201&pj=www&rsv_sid=1466&fm=behs&tab=tj_reg&un=&path=http%3A%2F%%2F&t=6",
"Resource=1",
"Referer=/",
web_url("favicon.ico_2",
"URL=/favicon.ico",
"Resource=1",
"RecContentType=application/octet-stream",
"Referer=",
"Snapshot=t5.inf",
web_link("注册",
"Text=注册",
"Snapshot=t6.inf",
web_custom_request("urs.asmx",
"URL=/urs.asmx?MSURS-Client-Key=WI0pAZHPdb%2b3UDOD0AtzxA%3d%3d&MSURS-Patented-Lock=S1IpDfNCCC4%3d",
"Method=POST",
"Resource=0",
"RecContentType=text/xml",
"Referer=",
"Snapshot=t7.inf",
"Mode=HTML",
"EncType=text/ charset=utf-8",
"Body=&RepLookup v=\"3\"&&G&EDF0-4DD9-B3E8-F8F560086FDF&/G&&O&F03F2D77-79E1-4DEC-BBF8-81A5C0790160&/O&&D&9.0.8110.0&/D&&C&9.00.&/C&&OS&6.1.&/OS&&I&9.0.&/I&&L&zh-CN&/L&&R&&Rq&&URL&aHR0cHM6Ly9wYXNzcG9ydC5iYWlkdS5jb20vdjIvP3JlZyZyZWdUeXBlPTEmdHBsPW1uJnU9aHR0cCUzQSUyRiUyRnd3dy5iYWlkdS5jb20lMkY=&/URL&&O&PRE&/O&&T&TOP&/T&&HIP&220.181.111.48&/HIP&&/Rq&&/R&&/RepLookup&",
"Url=/img/topbarnav_bg.png", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
"Url=/passApi/js/reg_6e270622.js", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
"Url=/passApi/img/small_blank_9dbbfbb1.gif", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
web_url("api",
"URL=/v2/api/?getapi&tpl=mn&apiver=v3&tt=1&class=reg&callback=bd__cbs__c93h6w",
"Resource=0",
"RecContentType=text/html",
"Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F",
"Snapshot=t8.inf",
"Mode=HTML",
"Url=/img/v.gif?type=1&regType=mail", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
web_url("api_2",
"URL=/v2/api/?getapi&tpl=mn&apiver=v3&tt=8&class=regPhone&callback=bd__cbs__xs2rv5",
"Resource=0",
"RecContentType=text/html",
"Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F",
"Snapshot=t9.inf",
"Mode=HTML",
"Url=/cgi-bin/genimage?D2C14ABF30D0B432CFB5A8E5E7B7EE094DCABE23B35A3CB73AE25A27CF6CC3A615CC284B27D70CA5FFB5F771E5D7DC9EE266F6FD61A2D88FEC7B7BA20EFF5DE2CD301E011E634D5063BDDCD35A47C1EB7B5EF365B347DDFAEF36CCBD17F36FCFB", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
"Url=/img/bd-split.gif", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
"Url=/img/reg_tip_header_t.gif", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
"Url=/img/reg_tip_bg_bottom.gif", "Referer=/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%%2F", ENDITEM,
trans_time=lr_get_transaction_wasted_time("注册");
//获得消耗时间
if (trans_time) {
lr_output_message("The duration up to the submit is %f seconds",trans_time);
//打印输出消耗实时间
lr_output_message("the duration cannot be determined. ");
lr_end_transaction("注册",LR_AUTO);
//事务结束
脚本有点长,但不要被吓到了,重要的几句我已经加了注释。你只用关注那几行就行了。
lgnore&think&time&:忽视思考时间,也就说勾选这一项的时候&,你脚本中加入的lr_think_time&函数设置是无效的。选中这一项,运行上面的脚本。
Action.c(62): The duration up to the submit is 0.032043 seconds
Action.c(67): Notify: Transaction "注册" ended with "Pass" status (Duration: 12.4113 Wasted Time: 0.0320).
虽然我在脚本中加入了lr_think_time(20);&这条语句,显现没起到任何作用。
Replay&think&time:回放思考时间
来看第一个选项:
As&recorded&:&取决于记录,选种这一项再来运行上面的脚本。
Action.c(111): The duration up to the submit is 0.034508 seconds
Action.c(116): Notify: Transaction "注册" ended with "Pass" status (Duration: 50.4453 Think Time: 20.0000 Wasted Time: 0.0345).
Ending action Action.
运行结果中多了一个&Think&Time:&20.0000&;这说明我们脚本中的lr_think_time(20);&起到了作用,选中这一项后,我们可以在脚本中任意的添加思考时间。
Multiply&recorded&think&time&by:&录制思考时间乘以,使用录制思考时间的倍数。
  其实,在我们脚本录制的过程中,根据我们的操作,脚本中就可以生成相应的思考时间。这个参数是根据脚本中的思考时间进行调整的。
  例如:脚本是秒,输入,那么在脚本实际运行时,思考时间将为秒;输入,脚本在运行时的思考时间为秒。下面选中此项,输入,再来查看脚本运行结果:
Action.c(111): The duration up to the submit is 0.036610 seconds
Action.c(116): Notify: Transaction "注册" ended with "Pass" status (Duration: 131.2022 Think Time: 9.9998 Wasted Time: 0.0366).
注:将原谅脚本会有秒的误差。
Use&random&percentage&of&recorded&think&time&:&使用录制思考时间的百分比。
  通过指定思考的时间的范围,可以设置思考时间值的范围。假如思考时间为秒,这里设置的范围为到,那么脚本运行时候将随即的在这个范围(秒到秒之间)内取值。下面再来查看脚本运行时间:
Action.c(111): The duration up to the submit is 0.036191 seconds
Action.c(116): Notify: Transaction "注册" ended with "Pass" status (Duration: 40.8002 Think Time: 15.0050 Wasted Time: 0.0362).
这一次Think&Time:&为15.0050&,是在到秒的范围之内,你再次运行会发现这个时间不一样,但不会超出设定的范围。
Limit&think&time&to:&&限制思考时间的最大值。
  假如脚本设置的思考时间为秒,选中这一项并设置为秒。那么脚本在运行时,思考时间不会超过秒。也就是说这设置同样也制约前面几个选项。这个你可以自行设置验证。
double trans_
//定义变量
lr_start_transaction("注册"); //添加事物
lr_think_time(8);
//思考时间
trans_time=lr_get_transaction_wasted_time("注册");
//获得消耗时间
if (trans_time) {
lr_output_message("The duration up to the submit is %f seconds",trans_time);
//打印输出消耗实时间
lr_output_message("the duration cannot be determined. ");
lr_end_transaction("注册",LR_AUTO);
//事务结束..........
感谢上面这段代码很好帮助我们理解思考时间。
备注:添加思考时间可以更真实的模拟用户行为,但它同时降低了用户并发。也就是说思考时间越长,对服务器的压力会越小。后使用快捷导航没有帐号?
查看: 1621|回复: 2
LoadRunner脚本开发和常用函数
金牌会员, 积分 1387, 距离下一级还需 1613 积分
论坛徽章:9
From: 脚本开发的原则:简单、正确、高效LoadRunner实现机制
#include&globals.h&
& & & & vuser_init();
& & & & Action();
& & & & vuser_end();
解释执行C代码,不需要像等一样需要编译。
关于解释型语言和编译型语言的概念和区别:
概念:编译型语言:把源程序全部编译成二进制代码的可运行程序。之后,可直接运行这个程序无需再次编译。
解释型语言:把源程序交给翻译器翻译一句就提交给计算机,然后计算机执行一句并不行程目标程序,直到运行结束。
区别:编译型语言,编译完成之后执行速度快,效率高;依赖编译器 如C,C++,Delphi,Fortran.解释型语言,执行速度慢,效率低;依赖解释器;如java、Basic.
总结:编译型语言在编译成目标程序后是可以通过操作系统直接运行,而解释语言的执行则需要一个解释环境(相当于一台虚拟机),解释器在程序执行期间一直随之运行,在这里LoadRunner充当了解释器的角色,一般来说,解释器比编译有更好的灵活性,而编译有着很好的性能。
其中java是特殊的,java程序也需要编译,但是没有直接编译成为机器语言,而是编译成字节码。
java字节码的执行有两种方式:
1.即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。
2.解释执行方式:解释器通过每次解释并执行一段代码来完成java字节码程序的所有操作。
通常采用的是第二种党法,由于JVM具有较好的灵活性,使字节码翻译为机器码效率较高。对于那些对于执行速度要求较高的应用程序,解释器可将java字节码即时编译为机器码,从而很好的保证了java代码的可移植性和高性能。
局部变量和全局变量局部变量
& & int a=10;
& & & & printf(&%d&,a);
& & int b=2;
& & & & lr_output_message(&%d&,a);
& & & & lr_output_message(&%d&,a);
& & & & lr_output_message(&%d&,a);
& & & & return 0;
Action.c (6): illegal statement termination
Action.c (6): skipping `int'
Action.c (6): undeclared identifier `b'
e:\\hp\\mytest\\bian\\\\combined_bian.c (5): 3 errors, not writing pre_cci.ci
以上例子可以看出LoadRunner虽然基本完全支持C,但是和C还有一点细微的差别。这里定义变量要提到前面去。int a=10;
printf(&%d&,a);
实例二在函数外面定义,int a=100;
& &// int a=10;
& & & & printf(&%d&,a);
& & & & lr_output_message(&%d&,a);
& & & & lr_output_message(&%d&,a);
& & & & lr_output_message(&%d&,a);
& & & & return 0;
输出结果Starting iteration 1.
Starting action Action.
Action.c(7): 100
Action.c(8): 100
Action.c(9): 100
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
去掉注释,输出,可以看出,局部变量会覆盖文件级变量(即在函数外面定义的变量)Starting iteration 1.
Starting action Action.
Action.c(7): 10
Action.c(8): 10
Action.c(9): 10
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
全局变量在globals.h定义
//--------------------------------------------------------------------
// Include Files
#include &lrun.h&
#include &web_api.h&
#include &lrw_custom_body.h&
//--------------------------------------------------------------------
// Global Variables
总结,在init、action、end中定义的变量就是局部变量在globals.h中定义的变量是全局变量什么时候定义全局变量?
整个过程中固定不变的,例如URL地址、KEY、其他支持指针、数组、控制流等
函数LoadRunner中的几种类型的函数:通用函数lr开头的(例如日志函数,思考时间函数…)与编程语言相关的函数与协议相关的函数自定义函数
(F1查看帮助文档)通用函数lr开头的①lr_think_time()、lr_get_host_name()、lr_whoami()、lr_get_attrib_string()
②LoadRunner错误处理机制/lr_continue_on _error函数
③日志函数解析/lr_output_message、lr_log_message 、lr_message 、lr_error_message
④lr_load_dll与编程语言相关的函数strcpy与strcat、strcmp、atoi、sprinf、time、文件操作..略与协议相关的函数web_link与web_url(get)、web_submit_form与web_submit_data(POST)、web_submit_form中的hidden自动发送、web_custom_request、web_add_header、web_get_int_property关于DLL在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
LoadRunner也支持dlllr_load_dll(&user32.dll&)
注册会员, 积分 192, 距离下一级还需 8 积分
论坛徽章:1
高级会员, 积分 714, 距离下一级还需 286 积分
论坛徽章:13
lz贴得比较详细了。
其实LR应该是C实现的,脚本使用C语言肯定有天然的优势,但是毕竟不是独立C语言程序,是需要运行在LR这个“框架”里面的,所以有一些差异和限制是很正常的,

我要回帖

更多关于 利用随机函数产生 的文章

 

随机推荐