loadrunner飞机订票系统从登陆订票退票登出的脚本实现代码调试通过
在LR自带的飞机订票系统中,完整模拟一个用户从登陆->订票->退票->登出这样一个业务流程,分解每个事务为一个Action:
进入首页->登陆->进入订票页面->选择出发城市到达城市->选择航班->付款->进入个人已订航班线路页面->取消航班->退出登陆。
这样子逻辑比较清晰,一个Action就是一个事务,对应到VuGen中创建脚本的Action参考下图:
1. 分析哪些内容需要进行关联,哪些需要进行参数化,要服务器提供出来的动态数据需要用关联函数进行关联,客户端提供给服务器的数据可以用参数化。
(1)登陆界面usersession每次打开页面服务器都给一个变化的动态码,需要用关联函数关联
web_reg_save_param("usersession","LB=userSession value=","RB=>",LAST);
//放在into_index()中
(2)出发城市到达城市等服务器可能更新会有变动,非固定不变的,需要进行关联
web_reg_save_param("City","LB=>","RB=</option>","ORD=All",LAST);
web_reg_save_param("seatPref","LB=seatPref\" value=\"","RB=\"","ORD=All",LAST);
web_reg_save_param("seatType","LB=seatType\" value=\"","RB=\"","ORD=All",LAST);
//放入into_flight()中
(3)航班编号等信息为服务器反馈的数据,客户端无法自动生成,需要进行关联
web_reg_save_param("outboundFlight","LB=outboundFlight value=","RB={departDate}","ORD=All",LAST);
//订票时待选择的航班班次,放入select_city()中
web_reg_save_param("itinerary","LB=flightID\" value=\"","RB=\"",LAST);
//退票时选择的班次,放入into_itinerary()只
(4)启程时间返回时间是客户端提交给服务器端的数据,是用户自己选择的,我们可以采用参数化,启程时间固定为当前时间+1,返回时间固定为当前时间+2,参数化设置如下图,参数类型=Date/time,format=%m%d%Y,offset偏移量出发时间设置为1,返回时间设置为2.
2. 关联函数后获得的数据如何使用,使用方法有好几种,下边分别举例说明:
(1)获取到的城市列表使用LR自带的函数lr_paramarr_random来随机获取值,随机取到的值还不能直接在web_submit_data中使用,需要用sprintf数据拼接保存到变量的方式或者是采用lr_save_string来保存为参数:
采用lr_save_string的优点在于保存为参数后后边所有函数只要需要这个值就可以直接采用参数的方式调用“{}”
char *arrivecity="London";
//随机生成到达城市
arrivecity=lr_paramarr_random("City");
//lr_save_string保存成参数
lr_save_string(arrivecity,"arrivecity"); web_submit_data(
.......
"Name=arrive", "Value={arrivecity}", ENDITEM,
.......
)
采用数据拼接保存到变量的方式需要对变量进行声明,如果后续函数有用到,需要把变量变成全局变量或者是更改变量声明位置到函数前面。
char departcity[];
//随机生成到达城市
//数据拼接方式
sprintf(departcity,"Value=%s",lr_paramarr_random("City"));
web_submit_data(
.......
"Name=depart", departcity, ENDITEM,
.......
)
(2)用下标随机的方式到关联数据中取值,代码量比使用LR自带函数要多,让"{City_i}"中的i随机。
int i;
char arrivecitys[];
char arrivecity[];
srand(time(NULL));
i=rand()%atoi(lr_eval_string("{City_count}"))/+;
sprintf(arrivecitys,"{City_%d}",i);
sprintf(arrivecity,"Value=%s",lr_eval_string(arrivecitys));
在随机选择关联函数关联出来的数据时:LR自带函数lr_paramarr_random()用起来比较简单,代码量少;采用下标随机的方式就会比较麻烦,代码复杂。
随机获取的数据怎么在web_submit_data中使用时:LR自带函数lr_save_string()可以把变量保存成参数,不用对参数进行声明,后续函数都可以使用此参数,比较方便;用sprintf数据拼接保存为变量的方式需要多声明字符串变量进行赋值,声明时需要考虑后续函数是否会用到此变量,会比较麻烦。
3. 接下来就把各个Action的源代码贴出来,供大家参考,所有代码均已调试通过:
into_index()
{ web_reg_save_param("usersession","LB=userSession value=","RB=>",LAST); web_url("WebTours",
"URL=http://127.0.0.1:2080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
LAST); return ;
}
submit_login()
{ lr_think_time(); web_reg_find("Text=Welcome","Savecount=welcome_count",LAST); web_submit_data("login.pl",
"Action=http://127.0.0.1:2080/WebTours/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t3.inf",
"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=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST); if(atoi(lr_eval_string("{welcome_count}"))>)
{
lr_output_message("Total found \"Welcome\" %s times,login pass",lr_eval_string("{welcome_count}"));
return ;
}
else
{
lr_output_message("Total found \"Welcome\" %s times,login fail",lr_eval_string("{welcome_count}"));
return -;
} }
into_flight()
{ lr_think_time(); web_reg_save_param("City","LB=>","RB=</option>","ORD=All",LAST);
web_reg_save_param("seatPref","LB=seatPref\" value=\"","RB=\"","ORD=All",LAST);
web_reg_save_param("seatType","LB=seatType\" value=\"","RB=\"","ORD=All",LAST); web_url("welcome.pl",
"URL=http://127.0.0.1:2080/WebTours/welcome.pl?page=search",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/nav.pl?page=menu&in=home",
"Snapshot=t4.inf",
"Mode=HTML",
LAST); return ;
}
select_city()
{ char num_Passengers[];
char *arrivecity="London";
char *departcity="Denver";
char *seatPref="None";
char *seatType="Coach";
//随机生成乘客个数,从1~10.
srand(time(NULL));
itoa(rand() %+,num_Passengers,);
lr_save_string(num_Passengers,"numPassengers");
//随机生成到达城市
arrivecity=lr_paramarr_random("City");
lr_save_string(arrivecity,"arrivecity");
//随机生成出发城市,并判断如果跟到达城市相同重新生成
departcity=lr_paramarr_random("City");
//while(*arrivecity==*departcity)也可以使用
while(strcmp(arrivecity,departcity)==){
departcity=lr_paramarr_random("City");
}
lr_save_string (departcity,"departcity");
//生成座位
seatPref=lr_paramarr_random("seatPref");
lr_save_string(seatPref,"seatPref");
seatType=lr_paramarr_random("seatType");
lr_save_string(seatType,"seatType"); web_reg_save_param("outboundFlight","LB=outboundFlight value=","RB={departDate}","ORD=All",LAST); lr_think_time(); web_submit_data("reservations.pl",
"Action=http://127.0.0.1:2080/WebTours/reservations.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/reservations.pl?page=welcome",
"Snapshot=t5.inf",
"Mode=HTML",
ITEMDATA,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=depart", "Value={departcity}", ENDITEM,
"Name=departDate", "Value={departDate}", ENDITEM,
"Name=arrive", "Value={arrivecity}", ENDITEM,
"Name=returnDate", "Value={returnDate}", ENDITEM,
"Name=numPassengers", "Value={numPassengers}", ENDITEM,
"Name=seatPref", "Value={seatPref]", ENDITEM,
"Name=seatType", "Value={seatType}", ENDITEM,
"Name=.cgifields", "Value=roundtrip", ENDITEM,
"Name=.cgifields", "Value=seatType", ENDITEM,
"Name=.cgifields", "Value=seatPref", ENDITEM,
"Name=findFlights.x", "Value=37", ENDITEM,
"Name=findFlights.y", "Value=8", ENDITEM,
LAST); return ;
}
select_flight_departing()
{ char *outboundFlight;
outboundFlight=lr_paramarr_random("outboundFlight");
lr_save_string(outboundFlight,"outboundFlight"); lr_think_time(); web_submit_data("reservations.pl_2",
"Action=http://127.0.0.1:2080/WebTours/reservations.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/reservations.pl",
"Snapshot=t6.inf",
"Mode=HTML",
ITEMDATA,
"Name=outboundFlight", "Value={outboundFlight}{departDate}", ENDITEM,
"Name=numPassengers", "Value={numPassengers}", ENDITEM,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=seatType", "Value={seatType}", ENDITEM,
"Name=seatPref", "Value={seatPref}", ENDITEM,
"Name=reserveFlights.x", "Value=56", ENDITEM,
"Name=reserveFlights.y", "Value=5", ENDITEM,
LAST); return ;
}
payment()
{ lr_think_time(); web_submit_data("reservations.pl_3",
"Action=http://127.0.0.1:2080/WebTours/reservations.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/reservations.pl",
"Snapshot=t7.inf",
"Mode=HTML",
ITEMDATA,
"Name=firstName", "Value=Joseph", ENDITEM,
"Name=lastName", "Value=Marshall", ENDITEM,
"Name=address1", "Value=234 Willow Drive", ENDITEM,
"Name=address2", "Value=San Jose/CA/94085", ENDITEM,
"Name=pass1", "Value=Joseph Marshall", ENDITEM,
"Name=pass2", "Value=", ENDITEM,
"Name=pass3", "Value=", ENDITEM,
"Name=creditCard", "Value=", ENDITEM,
"Name=expDate", "Value=", ENDITEM,
"Name=oldCCOption", "Value=", ENDITEM,
"Name=numPassengers", "Value={numPassengers}", ENDITEM,
"Name=seatType", "Value={seatType}", ENDITEM,
"Name=seatPref", "Value={seatPref}", ENDITEM,
"Name=outboundFlight", "Value={outboundFlight}{departDate}", ENDITEM,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=returnFlight", "Value=", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=.cgifields", "Value=saveCC", ENDITEM,
"Name=buyFlights.x", "Value=50", ENDITEM,
"Name=buyFlights.y", "Value=14", ENDITEM,
LAST); return ;
}
into_itinerary()
{ web_reg_save_param("itinerary","LB=flightID\" value=\"","RB=\"",LAST);
lr_think_time(); web_url("welcome.pl",
"URL=http://127.0.0.1:2080/WebTours/welcome.pl?page=itinerary",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/nav.pl?page=menu&in=home",
"Snapshot=t14.inf",
"Mode=HTML",
LAST); return ;
}
cancel_itinerary()
{ web_reg_find("Text=No flights have been reserved","SaveCount=Cancel_Count",LAST);
lr_think_time(); web_submit_data("itinerary.pl",
"Action=http://127.0.0.1:2080/WebTours/itinerary.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/itinerary.pl",
"Snapshot=t15.inf",
"Mode=HTML",
ITEMDATA,
"Name=flightID", "Value={itinerary}", ENDITEM,
"Name=.cgifields", "Value=1", ENDITEM,
"Name=removeAllFlights.x", "Value=43", ENDITEM,
"Name=removeAllFlights.y", "Value=15", ENDITEM,
LAST);
if (atoi(lr_eval_string("{Cancel_Count}")) > ){
lr_output_message("Cancel successful.");
return ;
} else{
lr_error_message("Cancel Fail");
return ;
} }
logout()
{ lr_think_time(); web_url("welcome.pl_2",
"URL=http://127.0.0.1:2080/WebTours/welcome.pl?signOff=1",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/nav.pl?page=menu&in=flights",
"Snapshot=t8.inf",
"Mode=HTML",
LAST); return ;
}
上述代码都是使用LR自带函数来实现关联数据随机,lr_paramarr_random(),lr_save_string()变量参数化。
在select_city()中采用下标随机生成到达城市,采用sprintf()字符拼接保存到变量的方式应用到web_submit_data()中的代码,供参考:
char numPassengers[];
char arrivecity[];
char departcity[];
char seatPref[];
char seatType[]; select_city()
{ int num_Passengers;
int i;
char arrivecitys[]; //随机生成乘客个数,从1~10.
srand(time(NULL));
num_Passengers=rand()%+; sprintf(numPassengers,"Value=%d",num_Passengers);
lr_output_message("numPassengers=%s",numPassengers);
//随机生成到达城市
//采用下标随机取值方法
i=rand()%atoi(lr_eval_string("{City_count}"))/+;
sprintf(arrivecitys,"{City_%d}",i);
sprintf(arrivecity,"Value=%s",lr_eval_string(arrivecitys));
lr_output_message("arrivecity=%s",arrivecity); //随机生成出发城市,并判断如果跟到达城市相同重新生成
//采用LR自带函数随机取值方法
sprintf(departcity,"Value=%s",lr_paramarr_random("City"));
while(strcmp(arrivecity,departcity)==){
sprintf(departcity,"Value=%s",lr_paramarr_random("City"));
}
//生成座位类型
sprintf(seatPref,"Value=%s",lr_paramarr_random("seatPref"));
sprintf(seatType,"Value=%s",lr_paramarr_random("seatType")); web_reg_save_param("outboundFlight","LB=outboundFlight value=","RB={departDate}","ORD=All",LAST); lr_think_time(); web_submit_data("reservations.pl",
"Action=http://127.0.0.1:2080/WebTours/reservations.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:2080/WebTours/reservations.pl?page=welcome",
"Snapshot=t5.inf",
"Mode=HTML",
ITEMDATA,
"Name=advanceDiscount", "Value=0", ENDITEM,
"Name=depart", departcity, ENDITEM,
"Name=departDate", "Value={departDate}", ENDITEM,
"Name=arrive", arrivecity, ENDITEM,
"Name=returnDate", "Value={returnDate}", ENDITEM,
"Name=numPassengers", numPassengers, ENDITEM,
"Name=seatPref", seatPref, ENDITEM,
"Name=seatType", seatType, ENDITEM,
"Name=.cgifields", "Value=roundtrip", ENDITEM,
"Name=.cgifields", "Value=seatType", ENDITEM,
"Name=.cgifields", "Value=seatPref", ENDITEM,
"Name=findFlights.x", "Value=37", ENDITEM,
"Name=findFlights.y", "Value=8", ENDITEM,
LAST); return ;
}
loadrunner飞机订票系统从登陆订票退票登出的脚本实现代码调试通过的更多相关文章
- LoadRunner 多用户并发 登录,上传数据,登出的脚本教程
这里记录 Web/Http 模式,模拟多用户并发进行 : 登录,上传数据,退出登录一整套流程.并发的用户量多少,可自定义.这里不介绍录屏的方式,是自己写脚本去执行的. 1.安装loadRunner ...
- LINUX-关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 ...
- loadrunner笔记(二):飞机订票系统--客户信息注册
(一) 几个重要概念说明 集合点:同步虚拟用户,以便同一时间执行任务. 事务:事务是指服务器响应用户请求所用的时间,当然它可以衡量某个操作,如登录所需要的时间,也可以衡量一系列的操作所用的时间,如从 ...
- C语言课程设计——电影院订票系统
1. 课题简介 大家都爱看电影,现请参考一个熟悉电影票预订系统,实现C语言版的订票系统.了解订票如何实现的.系统主要有2类用户:管理员用户和顾客用户. 管理员用户登录系统后,实现电影放映厅信息管理和电 ...
- [Django]登陆界面以及用户登入登出权限
前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF = 'www.urls'# ...
- Loadrunner录制+运行+结果-【飞机订票系统实战】
目录结构: 一.LoadRunner实现订票系统脚本录制 二.Loadrunner实现订票系统IP欺骗(此处可以不设置) 三.Loadrunner运行录制的脚本 四.Load generator配置 ...
- LR自带网站飞机订票系统 启动
LR自带的网站:飞机订票系统 可是如何启动自带的网站呢?? 一.启动服务:开始-所有程序--HP Software-HP LoadRunner-Samples-Web-Start Web Server ...
- Java版飞机订票系统
关注微信公众号:Worldhello 回复 飞机订票系统 可获得系统源代码并可加群讨论交流 数据结构课程设计题目: [飞机订票系统] 通过此系统可以实现如下功能 ...
- 【性能测试】Loadrunner12.55(二)-飞机订票系统-脚本录制
1.1 飞机订票系统 Loadrunner 12.55不会自动安装飞机订票系统,要自己手动安装. 我们需要下载Web Tools以及一个小插件strawberry https://marketplac ...
随机推荐
- vn.trader的Ubuntu运行环境搭建教程
作者:量衍投资 转载请注明来源:维恩的派(www.vnpie.com) 准备Ubuntu 建议使用一个新安装干净的Ubuntu环境(如果你一定要使用老环境也行,万一不幸掉坑后再回到这步就好),我这里使 ...
- JSON和JSONP,浅析JSONP解决AJAX跨域问题
说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...
- Linux中KVM桥接的配置
Linux中KVM桥接的配置 1. 原理 1.1 说明 在安装一个拥有虚拟化功能的Linux操作系统(此处以CentOS为例),一般我们有两种方法: .在光盘安装的时候安装好虚拟化包或者PXE服务器上 ...
- 时钟信号的占空比调整——Verilog
时钟信号的占空比调整——Verilog `timescale 1ns / 1ps /////////////////////////////////////////////////////////// ...
- C#遍历枚举中所有值
public enum EnumColor { 红色=1, 黑色=2, 白色=3 } foreach (EnumColor item in Enum.GetValues(typeof(EnumColo ...
- Unix即IDE
前言 在图形界面下大家都想要这种能够集成在一起的工具,那是因为这类窗口应用除了用复制粘贴,没有别的方法使他们更好地协同工作,它们缺失一种 共用接口(common interface) . 有关这个问题 ...
- Windows下安装MySQL8
转自:https://blog.csdn.net/star_in_shy/article/details/82691330 感谢! 一.MySQL官网下载 (一)MySQL下载地址:https:// ...
- ubuntu16.04下latex环境搭建
背景: 最近需要使用latex做一下简历~~~ 工具: sublime text3 (plugin: latextools) + texlive-full 配置: Preferences -> ...
- Egret飞行模拟-开发记录02
1.Egret异步加载资源制作loading界面 使用EUI,EXML组件制作loading界面时,需要皮肤主题资源加载控制.即default.thm.json配置文件. 下一篇专门记录这部分. 2. ...
- 理解block和inode
什么是block和inode? 定义:block就像是杯子 inode就像是杯子的编号,因为杯子太多了 1.根据文件的大小,在磁盘中储存时会占用一个或多个block:那么究竟多大的文件会使用一个blo ...