完全拋棄腳本錄製,LR腳本之使用web_custom_request函數自定義http請求

初學性能測試時候,第一步必學腳本錄製,但一路下來各類錄製失敗、回放腳本失敗的問題層出不窮,究其緣由一是LR自己存在對測試環境的兼容性問題致使錄製失敗,更深層次的緣由是錄製者不清楚LR錄製腳本的原理,或者不清楚客戶端與服務器端之間的請求和應答內容及通訊方式,致使一旦出現腳本執行失敗便無從下手。最近在作項目的一個接口測試時候,因請求是合做第3方發起的且不容易讓第3方提供他們的平臺給咱們作測試,因此這種狀況是沒辦法取錄製腳本的,只能選擇手動編寫腳本實現。得知接口是使用http協議的post方法,想到了web_submit_form()和web_submit_data()兩個函數,它們實現了http請求中的post方法,問題來了,它們都提交表單到某個頁面,但如今被測試的僅是個http接口,顯然這兩個函數都沒法知足須要。javascript

因而想到了web_custom_request(),這個函數的做用是自定義http請求規則,一看不禁地暗喜原來web_custom_request()函數是一個能夠用於自定義http請求的「萬能」函數,具備web_link()、web_url()、web_submit_data()函數的功能,能夠自由定義須要的http的get和post請求。網上看到一篇介紹web_custom_requst,寫的很是詳細,分享一下(固然英文好的直接看LR自帶的幫助文檔會感受更原味):html

附錄:web_custom_request函數語法詳解java

語法:
Int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );web

返回值:
LR_PASS(0)表明成功
LR_FAIL(1)表明失敗。數組

參數:
一、RequestName:步驟的名稱,VuGen中樹形視圖中顯示的名稱。
二、List of Attribute:支持的屬性有如下幾種:
1)URL:
   頁面地址。
2)Method :
   頁面的提交方式,POST或GET。
3)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請求頭。
4)BodyFilePath:
   做爲請求體傳送的文件的路徑。它不能與下面的屬性一塊兒使用:Body,或者其餘Body屬性或Raw Body屬性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。
5)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自己不檢查指定的字符串與瀏覽器自己的值是否相同)
6)Binary:
   「Binary=1」表示頁面請求體中的每個以file://x/##形式出現的值(在這裏「##」表明2個十六進制數字),都會被替換爲單字節的十六進制的值。若是「Binary=0」(默認值),全部的字符序列只是按照字面的值傳遞。須要注意雙斜槓的用法。在C編譯器中雙斜槓被解釋爲單斜槓。若是不須要零字節,單斜槓能夠在Binary不等於1的狀況下使用(例如,使用\x20代替file://x20/)。若是須要零字節,那麼只能使用file://x00/且設置 「Binary=1」,\x00在邏輯上會被截斷。
7)ContentEncoding
   指定請求體的使用指定的方式(gzip或者deflate)進行編碼(例如,壓縮),相應的「Content-Encoding:」 HTTP頭會和此請求一塊兒發送。這個參數適用於web_custom_request和web_submit_data。
8)FtpAscii:
   「1」使用ASCII模式處理FTP操做;"0" 使用二進制模式。
9)TargetFrame:
   當前連接或資源所在Frame的名稱。除了Frame的名字,還能夠指定下面的參數:
_BLANK:打開一個空窗口。
_PARENT:把最新更改過的的Frame替換爲它的上級。
_SELF:替換最新更改過的的Frame。
_TOP:替換整個頁面。
10)RecContentType:
   錄製腳本時響應頭的內容類型。例如text/html、 application/x-javascript等。當沒有設置Resource屬性時,用它來肯定目標URL是不是可記錄的資源。此屬性包含主要的和次要的資源。最頻繁使用的類型是 text、application、image。次要的類型根據資源不一樣變化不少。例如:"RecContentType=text/html":表示html文本。"RecContentType=application/msword":表示當前使用的是Msword。
11)Referer:
   當前頁面關聯的頁面。若是已經顯式指定了url的地址,此項能夠省略。
12)Resource:
   指示URL是否屬於資源。1 是;0 不是。設置了這個參數後,RecContentType參數被忽略。「Resource=1」,意味着當前操做與所在腳本的成功與否關係不大。在下載資源時若是發生錯誤,是看成警告而不是錯誤來處理的;URL是否被下載受「Run-Time Setting—Browser Emulation--Download non-HTML resources」 這個選項的影響。此操做的響應信息是不作爲HTML來解析的。「Resource=0」,代表此URL是重要的,不受發送請求(RTS)的影響,在須要時也會解析它。
13)ResourceByteLimit:
   web頁面下載資源的極限大小。當達到設置的極限後,沒法下載其餘資源。僅僅對須要下載的資源有效。下載過程:若是總計下載大小小於極限值,則正常開始下載。若是當下載時達到了設置的極限值,資源大小可知(在HTTP響應頭中指定了Content-Length),這中狀況下,若是隻須要一個緩衝區,那麼下載能夠正常完成。若是須要的不止一個緩衝區,或者資源大小不可知,下載就會中斷同時關閉當前鏈接。這個特性能夠用來模擬用戶不等待一個頁面下載完成時導航到另外一個頁面的狀況。在HTTP模式中沒法使用,在Concurrent Groups(Vuser腳本中的一個區,此區中的全部函數併發執行)區中也沒法使用。僅僅適用於Sockets的回放,WinInet也是不適用的。
14)Snapshot:
   快照的文件名。
15)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這些函數。這種方法更爲靈活,可是生成的腳本不夠直觀。
16)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。瀏覽器

17)Body:
   請求體。不一樣的應用中,請求體分別經過Body、BodyBinary或者BodyUnicode參數來傳遞。請求體能夠只使用其中一個參數,也可使用一連串的分開的參數組成多請求體。例如:
web_custom_request(緩存

……服務器

"BodyUnicode=REPRICE"併發

"BodyBinary=\\x08\\x00\\xCC\\x02\\x00\\x00"app

"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中定義的。

18)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 選項中,能夠設置把這些資源錄製在當前的操做中(默認是此設置)仍是做爲單獨的步驟來錄製。

相關文章
相關標籤/搜索