1. 程式人生 > >軟體效能測試_loadrunner之web_custom_request應用示例

軟體效能測試_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",

        "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);

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;
}

test