標籤:style blog http io color os ar 使用 java
1. GET方式的HTTP請求效能測試指令碼
Action(){ web_set_max_html_param_len("10000"); web_reg_save_param("retCode", "LB=retCode\":\"", "RB=\"", "NotFound=WARNING", LAST); lr_start_transaction("test"); web_custom_request("test ", "URL=http://127.0.0.1/test?channelno=1&phoneno=12345678912", "Method=GET", "Resource=0", "Referer=", "Mode=HTTP", "EncType=txt/html; charset=UTF-8", "Body=", LAST);if (!strcmp(lr_eval_string("{retCode}"),"000000")) { lr_output_message("Successfull, retcode is:%s", lr_eval_string("{retCode}")); lr_end_transaction("test", LR_PASS); }else{ lr_error_message("Failed, retcode is:%s", lr_eval_string("{retCode}")); lr_end_transaction("test", LR_FAIL); }return 0;}
2. POST格式的json串請求
Action(){ web_reg_save_param("retCode", "LB=retCode\":\"", "RB=\"", "NotFound=WARNING", LAST); lr_start_transaction("test"); web_add_header("Content-Type" ,"application/json"); web_custom_request("test", "URL=http://127.0.0.1/test ", "Method=POST", "Resource=0", "Referer=", "Mode=HTTP", "EncType=application/json; charset=UTF-8", "RecContentType=application/json", "Body={\"channelNo\":\"{channelNo}\",\" phoneno \":12345678900,\"createdTime\":\"{createdTime}\"}", LAST);if (!strcmp(lr_eval_string("{retCode}"),"000000")) { lr_output_message("Successfull, retcode is:%s", lr_eval_string("{retCode}")); lr_end_transaction("test ", LR_PASS); }else{ lr_error_message("Failed, retcode is:%s", lr_eval_string("{retCode}")); lr_end_transaction("test ", LR_FAIL); }return 0;}
說明:在編寫json串時,注意保證body內容的正確性,字串必須在\" \"之間,參數名稱與參數值之間是:,參數與參數之間用逗號分隔
3. web_reg_save_param函數3.1 方法介紹
文法:
int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
參數說明:
ü ParamName: 存放得到的動態內容的參數名稱
ü list of Attributes: 其它屬性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。屬性值不分大小寫
Notfound: 當在返回資訊中找不到要找的內容時應該怎麼處理
Notfound=error: 當在返回資訊中找不到要找的內容時,發出一個錯誤訊息。這是預設值
Notfound=warning: 當在返回資訊中找不到要找的內容時,只發出警告,指令碼也會繼續執行下去不會中斷。
LB( Left Boundary ) : 返回資訊的左邊界字串。該屬性必須有,並且區分大小寫。
RB( Right Boundary ): 返回資訊的右邊界字串。該屬性必須有,並且區分大小寫。
RelFrameID: 相對於URL而言,欲尋找的網頁的Frame。此屬性質可以是All或是數字,該屬性可有可無。
Search : 返回資訊的尋找範圍。可以是Headers,Body,Noresource,All(預設)。該屬性質可有可無。
ORD : 說明第幾次出現的左邊界子串的匹配項才是需要的內容。該屬性可有可無,預設值是1。如為All,則將所有找到的內容儲存起來。
SaveOffset : 當找到匹配項後,從第幾個字元開始儲存到參數中。該屬性不能為負數,預設值為0。
SaveLen :當找到匹配項後,位移量之後的幾個字中繼存放區到參數中。預設值是-1,表示一直到結尾的整個字串都存入參數。
說明:如果左右邊界中含有中文字元,請在Tool->Recording Options,Advanced中勾選Support Charset為utf-8
3.2 常見問題以及解決方案
MsgId: MERR-26377
報錯資訊:"Check whether the requested boundaries exist in the response data. Also, if the data you want to save exceeds 1592 bytes, use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-26377]"。
錯誤原因及解決辦法:
ü 左右邊界取值不正確:Vuser->scan action for correllations 在correlation results中選中需要關聯資訊,點crete rule查看左右關聯字元。
ü 關聯函數的位置放置錯誤:Vuser->scan action for correllations 將指令碼切換到script下並在correlation results中雙擊需要關聯資訊,游標會在scrip中定位在需要關聯的位置。
ü 伺服器返回的報文過長,超出了LoadRunner預設的參數儲存長度(1024位元組),在設定關聯的語句之前加上如下語句:web_set_max_html_param_len(“10000″);(web_set_max_html_param_len函數用於設定需要儲存的HTML字串的長度);
4. web_custom_request 函數
這個函數的作用是自訂http請求規則,可以自由定義需要的http的get和post請求。具有web_link()、web_url()、web_submit_data()函數的功能
4.1 方法介紹
Int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );
傳回值: LR_PASS(0)代表成功、LR_FAIL(1)代表失敗。
參數說明:
ü RequestName:步驟的名稱,VuGen中樹形視圖中顯示的名稱。
ü List of Attribute:支援的屬性有以下幾種:
(1)URL:頁面地址
(2)Method:頁面的提交方式,POST或GET。
(3)Resource:指示URL是否屬於資源。1 是;0 不是。設定了這個參數後,RecContentType參數被忽略。Resource=1,意味著當前操作與所在指令碼的成功與否關係不大。在下載資源時如果發生錯誤,是當作警告而不是錯誤來處理的;URL是否被下載受Run-Time Setting—Browser Emulation--Download non-HTML resources 這個選項的影響。此操作的響應資訊是不做為HTML來解析的。“Resource=0”,表明此URL是重要的,不受發送請求(RTS)的影響,在需要時也會解析它。
(4)Referer:當前頁面關聯的頁面。如果已經顯式指定了url的地址,此項可以省略。
(5)Mode:兩種錄製層級HTML、HTTP。
HTML層級--在當前Web介面上錄製直觀的HTML動作。以一步步的web_url、web_link、web_image、web_submit_form來錄製這些動作。VuGen僅僅錄製返回HTML頁面的請求,不處理指令碼和應用程式。
HTTP層級--VuGen把所有的請求錄製為web_url指令,不產生web_link、web_image、web_submit_form這些函數。這種方法更為靈活,但是產生的指令碼不夠直觀。
(6)EncType: 編碼類別型。此參數給出一個內容類型(Content-Type),指定其做為回放指令碼時“Content-Type”要求標頭的值,例如“text/html”。Web_custom_request函數不處理未編碼的請求體。請求體參數將會使用已經指定的編碼方式。因此,如果指定了不匹配HTTP請求體的“EncType”,會引發服務端的錯誤。通常我們建議不要手動修改錄製時的“EncType”值。
任何對於EncType的指定都會覆蓋web_add_[auto_]header函數指定的Content-Type。當指定了EncType=(空值)時,不會產生Content-Type要求標頭。當省略了EncType時,任何一個web_add_[auto_]header函數都會起作用。如果既沒有指定EncType也沒有web_add_[auto_]header函且Method=POST,application/x-www-form-urlencoded會做為預設值來使用。其他情況下,不會產生Content-Type要求標頭。
(7)Body: 請求體。不同的應用中,請求體分別通過Body、BodyBinary或者BodyUnicode參數來傳遞。請求體可以只使用其中一個參數,也可以使用一連串的分開的參數組成多請求體。例如:
web_custom_request(
……
"BodyUnicode=REPRICE"
"BodyBinary=\\x08\\x00\\xCC\\x02\\x00\\x00"
"Body=.\r\n"
"-dxjjtbw/(.tp?eg:ch/6--\r\n",
LAST);
在上面的代碼中,使用了3個參數來劃分請求體,一個是Unicode段,一個是二進位段,最後一個是常規的字串。最終的請求體是這3個參數按照在函數中的順序串連起來的值。還有一個很少用到的參數,Binary。它也能描述二進位請求體,但只允許函數中只有一個請求體參數。所有的請求體都是ASCII字元,以null結束。
Body--表示規則的,可列印的字串。無法表示空位元組。所有的字元都以一個反斜線表示。注意:在舊的指令碼中,可以看見不可列印的字元在請求體中以16進位方式進行編碼。(例如 “\\x5c”),在這種情況下,必須使用“Binary=1”來標識。空位元組使用"file://0.0.0.0/"來表示。 相反,新指令碼則會把把請求體分開放在不同的參數中("Body=...", "BodyBinary=...", Body=...")。
BodyBinary--表示二進位代碼。不可列印的字元在請求體中以16進位方式file://xhh/進行編碼。在這裡HH 表示十六進位值。空位元組使用"file://0.0.0.0/"來表示。
BodyUnicode--美國英語,特指拉丁UTF-16LE(little-endian)編碼。這種編碼方式會在在每個字元末尾附加一個0位元組,以便使字元更可讀。但是在VuGen中實際的參數把所有的0位元組都去掉的。但是在發送給Web伺服器之前, web_custom_request函數會重新添加0位元組的。對於不可列印的字元,使用單反斜線表示,無法表示空位元組。
注意:如果請求體大於100K,會使用一個變數來代替Body參數。變數是在 lrw_custom_body.h中定義的。
(8)BodyFilePath: 作為請求體傳送的檔案的路徑。它不能與以下屬性一起使用:Body,或者其他Body屬性或Raw Body屬性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。
(9)UserAgent: 使用者代理程式,它是一個HTTP頭的名字,用來標識應用程式,通常是瀏覽器,它呈現的是使用者和伺服器的互動。
例如:頭資訊User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)識別的是Window NT下的IE瀏覽器6.0。其他的User-Agent的值用來描述其他的瀏覽器,或者非瀏覽器程式。通常,一個應用程式中所有的請求都使用相同的使用者代理程式,錄製者作為一個運行時參數來指定(Run-Time Setting—Browser Emulation—User Agent)。不管怎麼說,即使是在一個簡單的瀏覽器進程中,仍有可能會用到直接與伺服器互動的非瀏覽器組件(例如ActiveX控制項),通常他們有著不同於瀏覽器的使用者代理程式屬性。指定“UserAgent”表示這是一個非瀏覽器的請求。指定的字串被HTTP頭User-Agent: 使用,在某些情況下,它同時會影響回放指令碼時的行為。例如,不使用瀏覽器緩衝,假設指定的URL屬於資源等等。(LoadRunner本身不檢查指定的字串與瀏覽器本身的值是否相同)
(10)Binary: Binary=1表示頁面請求體中的每一個以file://x/##形式出現的值(在這裡“##”代表2個十六進位數字),都會被替換為單位元組的十六進位的值。如果Binary=0(預設值),所有的字元序列只是按照字面的值傳遞。需要注意雙斜杠的用法。在C編譯器中雙斜杠被解釋為單斜杠。如果不需要零位元組,單斜杠可以在Binary不等於1的情況下使用(例如,使用\x20代替file://x20/)。如果需要零位元組,那麼只能使用file://x00/且設定 “Binary=1”,\x00在邏輯上會被截斷。
(11)ContentEncoding: 指定請求體的使用指定的方式(gzip或者deflate)進行編碼(例如壓縮),相應的Content-Encoding: HTTP頭會和此請求一起發送。這個參數適用於web_custom_request和web_submit_data。
FtpAscii: 1使用ASCII模式處理FTP操作;0"使用二進位模式。
TargetFrame:當前連結或資源所在Frame的名稱。除了Frame的名字,還可以指定下面的參數:
_BLANK:開啟一個空視窗。
_PARENT:把最新更改過的的Frame替換為它的上級。
_SELF:替換最新更改過的的Frame。
_TOP:替換整個頁面。
(12)RecContentType: 錄製指令碼時回應標頭的內容類型。
例如text/html、 application/x-javascript等。當沒有設定Resource屬性時,用它來確定目標URL是否是可記錄的資源。此屬性包含主要的和次要的資源。最頻繁使用的類型是 text、image application。次要的類型根據資源不同變化很多。例如:RecContentType=text/html:表示html文本。RecContentType=application/msword:表示當前使用的是Msword。
(13) ResourceByteLimit: web頁面下載資源的極限大小。當達到設定的極限後,無法下載其他資源。僅僅對需要下載的資源有效。下載過程:如果總計下載大小小於極限值,則正常開始下載。如果當下載時達到了設定的極限值,資源大小可知(在HTTP回應標頭中指定了Content-Length),這種情況下,如果只需要一個緩衝區,那麼下載可以正常完成。如果需要的不止一個緩衝區,或者資源大小不可知,下載就會中斷同時關閉當前串連。這個特性可以用來類比使用者不等待一個頁面下載完成時導航到另一個頁面的情況。在HTTP模式中無法使用,在Concurrent Groups(Vuser指令碼中的一個區,此區中的所有函數並發執行)區中也無法使用。僅僅適用於Sockets的回放,WinInet也是不適用的。
(14)Snapshot:快照的檔案名稱。
(15)ExtraResBaseDir:根URL,放在EXTRARES組裡。
它是用來解析相對URL的(譯者加:類似於Windows的相對路徑和絕對路徑)。URL可以是絕對路徑(例如http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相對路徑(例如“forecast.jsp?locCode=LFPO”)。真正的URL的下載是通過絕對路徑進行的,所以相對URL路徑必須使用根路徑URL去解析。例如,使用http://weather.abc.com/weather/做為根路徑來解析“forecast.jsp?locCode=LFPO”,最後的URL是:http://weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果沒有指定“ExtraResBaseDir”,預設的根URL是首頁面的URL。
(16)Raw Body:
請求體是作為指標傳遞的,此指標指向一串資料。 二進位的請求體可以使用BodyBinary 屬性來發送(或者使用Body 屬性來傳遞,前提是必設定 "Binary=1" )。無論如何,這種方法需要使用逸出字元反斜線把不可列印的字元轉換為ASCII字元。為了能有一種更簡便的表現未經處理資料的方式,Raw Body屬性應運而生,可以傳遞指向位元據的指標。使用4個連續的參數集來表示指標,而且必須按照順序排列:
RAW_BODY_START 指向資料緩衝區的指標
(int) 長度 RAW_BODY_END
例子:
char *abc= .../* a pointer to the raw data */
web_custom_request("StepName",
"URL=http://some.url ",
"Method=POST",
RAW_BODY_START,
"abc",
3,
RAW_BODY_END,
LAST);
在應用中,即使設定了資料的長度為0,指標也必須有值,不可為空。在“Binary=1”時,不能使用上面的文法傳遞未經處理資料。資料緩衝區中的資料不能使用參數化。也就時說,緩衝區中的任何參數(例如 "{MyParam}")不能被正確的替代為相應的值,只會以字面值發送。
ü EXTRARES:表明下面的參數將會是List Of Resource Attributes了。
ü LAST :結尾的標示符。
ü List of Resource Attributes
僅僅當Recording Options--Recording --HTML-based script-- Record within the current script step選項被選中時,List of Resource Attributes才會被插入到代碼中。Web頁面中的非HTML機制產生了資源清單,包含了Javascript, ActiveX, Java applets and Flash所請求的資源。VuGen‘s 的Recording 選項中,可以設定把這些資源錄製在當前的操作中(預設是此設定)還是作為單獨的步驟來錄製。
4.2 常見問題
POST格式的json串報錯Error -26631: HTTP Status-Code=400 (Bad Request) for
一般都是發送的http請求錯誤導致,建議使用監控工具抓包看下(WireShark、Fiddler等),檢查body中欄位的大小寫是否正確,符號使用格式是否正確等,之前遇到過賦值使用了=,應該是:
5. lr_eval_string函數
返回指令碼中的一個參數當前的值,傳回值類型:char
6. web_add_header函數
在下面的http請求中增加header頭資訊
7. 參考資料
http://www.cnblogs.com/Automation_software/p/3482094.html
http://blog.csdn.net/juanmantou/article/details/8291196
http://www.tuicool.com/articles/aAvyIb
http://blog.csdn.net/yong_sun/article/details/6733096
http://blog.csdn.net/dfbrt56/article/details/3321558
LR實現http協議效能測試指令碼