在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[25]; //隨機生成到達城市
//數據拼接方式 sprintf(departcity,"Value=%s",lr_paramarr_random("City"));
web_submit_data(
.......
"Name=depart", departcity, ENDITEM, ....... )
(2)用下標隨機的方式到關聯數據中取值,代碼量比使用LR自帶函數要多,讓"{City_i}"中的i隨機。
int i; char arrivecitys[10]; char arrivecity[25]; srand(time(NULL)); i=rand()%atoi(lr_eval_string("{City_count}"))/2+1; 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 0; }
submit_login() { lr_think_time(3); 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}"))>0) { lr_output_message("Total found \"Welcome\" %s times,login pass",lr_eval_string("{welcome_count}")); return 0; } else { lr_output_message("Total found \"Welcome\" %s times,login fail",lr_eval_string("{welcome_count}")); return -1; } }
into_flight() { lr_think_time(3); 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 0; }
select_city() { char num_Passengers[1]; char *arrivecity="London"; char *departcity="Denver"; char *seatPref="None"; char *seatType="Coach"; //隨機生成乘客個數,從1~10. srand(time(NULL)); itoa(rand() %10+1,num_Passengers,10); 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)==0){ 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(5); 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 0; }
select_flight_departing() { char *outboundFlight; outboundFlight=lr_paramarr_random("outboundFlight"); lr_save_string(outboundFlight,"outboundFlight"); lr_think_time(5); 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 0; }
payment() { lr_think_time(19); 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 0; }
into_itinerary() { web_reg_save_param("itinerary","LB=flightID\" value=\"","RB=\"",LAST); lr_think_time(4); 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 0; }
cancel_itinerary() { web_reg_find("Text=No flights have been reserved","SaveCount=Cancel_Count",LAST); lr_think_time(6); 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}")) > 0){ lr_output_message("Cancel successful."); return 0; } else{ lr_error_message("Cancel Fail"); return 1; } }
logout() { lr_think_time(7); 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 0; }
上述代碼都是使用LR自帶函數來實現關聯數據隨機,lr_paramarr_random(),lr_save_string()變量參數化。
在select_city()中采用下標隨機生成到達城市,采用sprintf()字符拼接保存到變量的方式應用到web_submit_data()中的代碼,供參考:
char numPassengers[10]; char arrivecity[25]; char departcity[25]; char seatPref[15]; char seatType[16]; select_city() { int num_Passengers; int i; char arrivecitys[10]; //隨機生成乘客個數,從1~10. srand(time(NULL)); num_Passengers=rand()%10+1; sprintf(numPassengers,"Value=%d",num_Passengers); lr_output_message("numPassengers=%s",numPassengers); //隨機生成到達城市 //采用下標隨機取值方法 i=rand()%atoi(lr_eval_string("{City_count}"))/2+1; 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)==0){ 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(5); 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 0; }