本文共 10147 字,大约阅读时间需要 33 分钟。
模拟浏览器发出get请求
web_url参数: 步骤名称: 请求接口:URL="" 通过Fillder或是接口文档获取 结束标志:LASTAction(){ web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST); return 0;}
View–Test Results
模拟浏览器发出get/post请求
步骤: 1)insert–Add step选择想要添加的操作 2)直接代码手写web_submit_data("web_submit_data", "Action=http://172.16.179.130:1080/WebTours/login.pl", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=userSession", "Value=130914.820899149zHDDQDVpVtAtADpfizz", ENDITEM, "Name=username", "Value=jojo", ENDITEM, "Name=password", "Value=bean", ENDITEM, "Name=JSFormSubmit", "Value=off", ENDITEM, "Name=login.x", "Value=58", ENDITEM, "Name=login.y", "Value=15", ENDITEM, LAST);
参数:
步骤名称:web_submit_data 请求地址:Action=http://172.16.179.130:1080/WebTours/login.pl 通过Fillder或是接口文档获取 Method:请求方式GET、POST,只支持这两种 请求模式:Mode=HTML/HTTP 表单数据:ITEMDATA,“Name=userSession”, “Value=130914.820899149zHDDQDVpVtAtADpfizz”, ENDITEM, 结束标志:LAST支持浏览器发出HTTP支持的任何方式的请求
参数: 步骤名称:web_custom_quest 请求地址:Action=http://172.16.179.130:1080/WebTours/login.pl 通过Fillder或是接口文档获取 请求方式:Method=XX,支持任意格式 请求模式:Mode=HTML/HTTP 请求正文:Body=XXX,支持任意格式的数据提交 结束标志:LAST步骤:
1)vuser–parameter list… 2)工具栏–open parameter list点击要替换的名称,这里是jojo,右键点击—replace with parameter
替换成功之后,变成下面的样式lr_output_message(lr_eval_string("{username}"));
Sequential:顺序选择 Each iteration:每次迭代更新。
Each iteration:每次迭代只取一个值,无论这action中这个值被应用多少次 Sequential:每次取值,按顺序取值Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
迭代10次 结果:
Action.c(4): user1Action.c(5): user1Action.c(4): user2Action.c(5): user2Action.c(4): user3Action.c(5): user3Action.c(4): user4Action.c(5): user4Action.c(4): user5Action.c(5): user5Action.c(4): user1Action.c(5): user1Action.c(4): user2Action.c(5): user2Action.c(4): user3Action.c(5): user3Action.c(4): user4Action.c(5): user4Action.c(4): user5Action.c(5): user5Vuser Terminated.
Sequential:顺序选择 Each occurrence:每次取值更新
Each occurrence:每次取出的值都是新的值,在一次迭代中如果应用多次就更新多次Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user1Action.c(5): user2Action.c(4): user3Action.c(5): user4Action.c(4): user5Action.c(5): user1Action.c(4): user2Action.c(5): user3Action.c(4): user4Action.c(5): user5Action.c(4): user1Action.c(5): user2Action.c(4): user3Action.c(5): user4Action.c(4): user5Action.c(5): user1Action.c(4): user2Action.c(5): user3Action.c(4): user4Action.c(5): user5Vuser Terminated.
Sequential:顺序选择 Once:只更新一次
Once:无论如何迭代,每次迭代使用多少次,都只更新一次Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Vuser Terminated.
Random:随机选择 Each iteration:每次迭代更新
Each iteration:每次迭代都会更新数据,但是一次迭代内所选的数据不会再次改变Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user2Action.c(5): user2Action.c(4): user4Action.c(5): user4Action.c(4): user3Action.c(5): user3Action.c(4): user2Action.c(5): user2Action.c(4): user5Action.c(5): user5Action.c(4): user4Action.c(5): user4Action.c(4): user3Action.c(5): user3Action.c(4): user4Action.c(5): user4Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Vuser Terminated.
Random:随机选择 Each occurrence:每次取值更新
Each occurrence:每次使用都会更新数据,同一次迭代内的数据也会出现不同Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user5Action.c(5): user2Action.c(4): user2Action.c(5): user4Action.c(4): user2Action.c(5): user3Action.c(4): user2Action.c(5): user3Action.c(4): user5Action.c(5): user5Action.c(4): user4Action.c(5): user5Action.c(4): user2Action.c(5): user5Action.c(4): user3Action.c(5): user1Action.c(4): user5Action.c(5): user3Action.c(4): user4Action.c(5): user2Vuser Terminated.
Random:随机选择 Once:每次取值更新
Once:无论多少次的迭代,只会更新一次数据Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Action.c(4): user3Action.c(5): user3Vuser Terminated.
Unique:唯一取值 Each iteration:每次迭代更新
VuGen提供了When out of values选项来处理非唯一的情况【当且仅当Update value on Each iteration,Update value on Each occurrence, When out of values才可以用】
When out of values1)Abort Vuser
当参加参数取值超出参数表记录的条数时,忽略用户脚本,停止运行脚本2)Continue in a cyclic manner
当参数取值超出参数表记录时,使用循环扫描的方式 这种方式相当于 Sequentia+Each iteration3)Continue with last value
当参数取值超出参数表记录时,使用参数表中的最后一个值Unique:唯一取值 Each occurrence:每次取值更新
Unique:唯一取值 Each occurrence:只更新一次
Action(){ lr_output_message(lr_eval_string("{lruser}")); lr_output_message(lr_eval_string("{lruser}")); return 0;}
10次迭代结果:
Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Action.c(4): user1Action.c(5): user1Vuser Terminated.
唯一数据
代码:lr_output_message(lr_eval_string("{uniqueNumber}")); lr_output_message(lr_eval_string("{uniqueNumber}"));
如果start数据选择:1000 block选择:100
更新策略选择Each interation:每次迭代更新 Action:选择更新5次 结果为:Action.c(6): 1000Action.c(7): 1000Action.c(6): 1001Action.c(7): 1001Action.c(6): 1002Action.c(7): 1002Action.c(6): 1003Action.c(7): 1003Action.c(6): 1004Action.c(7): 1004Vuser Terminated.
如果start数据选择:1000 block选择:2
更新策略选择Each interation:每次迭代更新 when out of value选择abort vuser Action:选择更新5次 结果为:Action.c(6): 1000Action.c(7): 1000Action.c(6): 1001Action.c(7): 1001Error: Parameter 'uniqueNumber': All values in unique block already used. Block size is 2. The Vuser is aborted according to "When Out Of Values" policy.Vuser Terminated.
如果start数据选择:1000 block选择:1000
更新策略选择Each interation:每次迭代更新 when out of value选择abort vuser Action:选择更新100次 controller选择user数为:5个用户,那么每次用户的随机数为 结果为:第一个用户:1000-1099第二个用户:1100-1199第三个用户:1200-1299第四个用户为:1300-1399第五个用户为:1400-1499
注意:这里block除了可以限制单个用户的取值范围,还规定了多个用户的取值范围
1、安装MySQL ODBC 3.51.24-x86.exe软件
2、安装成功之后开始程序–管理工具–数据源(ODBC),说明安装成功 3、在runnerload中新建数据库参数,选择data wizard, 选择机器数据源进行创建 连接成功之后,数据库查询结果就自动导入了web_reg_save_param
关联函数,函数的作用是从响应结果里面获取指定的内容。 举例:为了获取上一个请求的响应数据中的userSession 带有reg字样,凡是带有reg字样的函数都叫注册性函数 那个函数的响应数据中有我们需要的数据,就放在那个函数之前Action(){ //注册型函数:保存首页的userSession返回值 web_reg_save_param("userSession", "LB=name=userSession value=", "RB=>", "Ord=1", LAST); //首页 web_url("首页","URL=http://172.16.179.130:1080/WebTours/",LAST); //登陆 // "Mode=HTML" 显示结果Test Result中显示的是网页 "Mode=HTTP" 显示结果Test Result中不显示网页 web_submit_data("web_submit_data", "Action=http://172.16.179.130:1080/WebTours/login.pl", "Method=POST", "TargetFrame=", "Referer=", "Mode=HTML", ITEMDATA, "Name=userSession", "Value={userSession}", ENDITEM, "Name=username", "Value=jojo", ENDITEM, "Name=password", "Value=bean", ENDITEM, "Name=JSFormSubmit", "Value=off", ENDITEM, "Name=login.x", "Value=51", ENDITEM, "Name=login.y", "Value=5", ENDITEM, LAST); return 0;}
1.Tools–Recording Options
2.工具栏–Recording Options 录制后代码:Action(){ web_set_max_html_param_len("1024"); web_url("picinfo.ini", "URL=http://se.360.cn/cloud/picinfo.ini", "Resource=1", "RecContentType=application/octet-stream", "Referer=", "Snapshot=t3.inf", LAST); /* Registering parameter(s) from source task id 79 // {WCSParam2} = "131158.08108546zHtzttDpHQfiDDDDtAtHipzzcHHf" // */ web_reg_save_param("WCSParam2", "LB/IC=name=userSession value=", "RB/IC=>", "Ord=1", "Search=Body", "RelFrameId=1.2.1", LAST); web_url("WebTours", "URL=http://172.16.179.130:1080/WebTours/", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t4.inf", "Mode=HTML", LAST); web_custom_request("q.cgi", "URL=http://conna.gj.qq.com/q.cgi", "Method=POST", "Resource=1", "Referer=", "Snapshot=t5.inf", "EncType=application/octet-stream", "BodyBinary=\\x00\n\\x01\\x8B\\x008R\\x00\\x00\\x00\\x00\\xB8\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00憘\\x11\\x10薁焴}\\x16蒨c弼\\xFF彌$W\\xD10鹊\\x00鼊菺U)V\\x80\r価\\x06\\x8C9v玃pRN&飓\\x05Q\\xF5\\x06\\x02{\\x05\\x1E艱巔P\\x05黸顝\\xCC7葃#+帆a\\x02畐溲L亮\\x17~梇8簍Q\\x7F\r碽猑灋匩8鰫儞啐吉>堌p!K'|\\x8E\\x0B", LAST); lr_think_time(6); web_submit_data("login.pl", "Action=http://172.16.179.130:1080/WebTours/login.pl", "Method=POST", "RecContentType=text/html", "Referer=http://172.16.179.130:1080/WebTours/nav.pl?in=home", "Snapshot=t6.inf", "Mode=HTML", ITEMDATA, "Name=userSession", "Value={WCSParam2}", ENDITEM, "Name=username", "Value=jojo", ENDITEM, "Name=password", "Value=bean", ENDITEM, "Name=JSFormSubmit", "Value=off", ENDITEM, "Name=login.x", "Value=0", ENDITEM, "Name=login.y", "Value=0", ENDITEM, LAST); return 0;}
如果出现录制后没有进行关联的web_reg_save_param
那么或许是recording的一些选项需要修改1.首先录制脚本,录制完成后在进行播放一次
2.查看脚本,这次不是通过Test Result 而是通过View----Tree View或是工具栏-----Tree View,以树视图的方式查看关联其实也是参数化的一种
1.参数化是固定的,关联是动态的 2.参数化的数据是保存在文件中的,关联的数据是服务器动态获取的转载地址:http://bbfgi.baihongyu.com/