軟體效能測試_loadrunner之web_custom_request應用示例
LoadRunner提供的web_custom_request函式可以用於實現引數的動態生成。在LoadRunner中,web_reg_save_param和custom_request都常於處理引數的動態生成。
web_reg_save_param函式是大家都已經熟悉的了,它的主要作用是從一個response中獲得後續的request需要使用的資料,然後將其作為一個引數儲存下來,供後續步驟使用。該方法在LoadRunner中被稱為Correlation(關聯)。
而web_custom_request函式則可以用於完全自定義向服務端傳送的request。
接下來我們用一個實際的例子說明一下web_custom_request的具體應用:
以Mercury自帶的MercuryWebTours例子為例,假設我們希望在登入進入後將使用者的前兩條記錄刪除,我們來看看用web_custom_request如何實現這個目標。
首先,我們嘗試用HTML方式對該操作進行錄製。錄製後的指令碼中與刪除相關的部分大致如下:
web_url("welcome.pl",
"URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
"Resource=0",
"RecContentType=text/html",
"Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
"Mode=HTML",
EXTRARES,
"URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
"URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
LAST);
web_submit_form("itinerary.pl",
"Snapshot=t4.inf",
ITEMDATA,
"Name=1", "Value=on", ENDITEM,
"Name=2", "Value=on", ENDITEM, "Name=removeFlights.x", "Value=116", ENDITEM,
"Name=removeFlights.y", "Value=8", ENDITEM,
LAST);
我們通過樹型模式檢視一下在submit form的時候實際向伺服器發出的請求的內容:
從請求內容中可以看到,我們通過POST方法發出了請求,請求傳送的目的URL是/MercuryWebTours/itinerary.pl,傳送的內容是:
"1=on&flightID=384-798-JM&2=on&flightID=3026-1592-JM&3=on&flightID=1194-2326-JM&.cgifields=1&.c"
"gifields=2&.cgifields=3&removeFlights.x=116&removeFlights.y=8"
從傳送的內容中可以很明顯的分析得出,1=on表示第一個checkbox是被選中的,flightID=384-798-JM表示的是第一條記錄所對應的flightID。因此,如果我們需要自己組成這個傳送的request的話,必須首先通過關聯的方式獲得前兩條記錄的flightID,然後再組成request的內容。
web_custom_request方法的原型是:
int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );
其中List of Attributes的主要專案是Method,URL和BODY等。對這個例子來說,我們可以很容易構造出我們需要的request的BODY內容。
……
strcpy(creq, "Body=1=on&flightID=");
strcat(creq, lr_eval_string("{fID1}"));
strcat(creq, "&2=on&flightID=");
strcat(creq, lr_eval_string("{fID2}"));
strcat(creq, "&.cgifields=1&.cgifields=2");
strcat(creq, "&removeFlights.x=116&removeFlights.y=8");
……
其中{fID1}、{fID2}等都是通過關聯獲得的flightID的資料。
因此,我們可以根據圖中的資料編寫custom_request語句:
web_custom_request("itinerary.pl",
"Method=POST",
"URL=http://localhost/MercuryWebTours/itinerary.pl",
"RecContentType=text/xml",
creq,
"Snapshot=t4.inf",
LAST);
較為完整的程式碼如下:
Action()
{
char creq[500];
web_reg_save_param("fID1", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=1",
"SEARCH=BODY", LAST);
web_reg_save_param("fID2", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=2",
"SEARCH=BODY", LAST);
web_url("welcome.pl",
"URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
"Resource=0",
"RecContentType=text/html",
"Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
"Snapshot=t3.inf",
"Mode=HTML",
EXTRARES,
"URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
"URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
LAST);
lr_think_time(2);
strcpy(creq, "Body=1=on&flightID=");
strcat(creq, lr_eval_string("{fID1}"));
strcat(creq, "&2=on&flightID=");
strcat(creq, lr_eval_string("{fID2}"));
strcat(creq, "&.cgifields=1&.cgifields=2");
strcat(creq, "&removeFlights.x=116&removeFlights.y=8");
lr_output_message(creq);
web_custom_request("itinerary.pl",
"Method=POST",
"URL=http://localhost/MercuryWebTours/itinerary.pl",
"RecContentType=text/xml",
creq,
"Snapshot=t4.inf",
LAST);
return 0;
}