Loadrunner關聯原理及方法
Loadrunner關聯原理及方法
注:建議先通讀一遍文件,再根據文件進行實際操作,選擇你認為最喜歡的方法進行關聯!
一、關聯原理:
(圖一)
如上圖所示:
指令碼錄製時,我們通過登入獲取的session ID①會被儲存在我們客戶端(瀏覽器)本地,下次請求時,我們就會使用session ID①進行訪問。
(圖二)
但是,如圖二所示,在我們回放指令碼時,由於是二次登入,所以我們的伺服器又會產生新的session ID返回給我們,這個時候我們把它標作session ID②。
但是由於腳本里面的sessionID依然是儲存的上次儲存的
因此,為了解決這些類似session ID的動態值的問題,我們需要在指令碼有這種動態值的時候進行相應的關聯。原理就是,當我們發現關聯的引數有新值產生(動態變化時),會將新值賦給引數,在如上圖就是把session ID②的值給到之前的session ID①,這樣就能讓我們在回放時,成功登入。
錄製時userSession=3.4164576868789
回放時userSession=3.4232456789322
二、怎麼設定關聯
設定關聯通常有兩種方式,分別為自動關聯和手動關聯。
a) 自動關聯(loadrunner11):
第一步、自動關聯,需要在錄製選項Recording Options裡將Enable correlation during recording(啟用錄製時關聯)給勾上。
第二步、錄製指令碼,指令碼錄製完以後回放,如果有session值的變化,第一次回放會是失敗的。類似下面兩圖
注意:不管是自動還是手動關聯,需要做關聯都需要先回放
第三步、這個時候點選快捷鍵ctrl+F8彈出如下頁面
然後,如果兩次相應的值有變化,系統會自動用黃色的標記給標識出來,同時,在下方的correlated欄也會顯示出來,然後我們只需要選中相應的值,且點選右下角的Correlate按鈕,就能夠進行關聯了。
然後關聯以後可以看到,value裡面儲存的是這個sessionID原本的值。在腳本里面產生了這樣一個函式web_reg_save_param_ex(),其中ParamName是這個引數的名字,LB=後面的是sessionID的左邊界,RB對應的是右邊界。至此,自動關聯就完成啦。
但是自動關聯有很大的弊端,loadrunner11的自動關聯非常不完善,比如找不到或者說所以很多情況下都需要我們自己來做手動關聯(Loadrunner12的自動關聯使用起來體驗不錯,可以適當減少工作量)。
b) 手動關聯:
手動關聯,有好多種方法,這裡只講一種,就是通過兩次錄取指令碼來查詢其中變化的值,然後根據找到的值進行函式編寫,手動輸入左右邊界值的過程。
步驟:
第一步:錄製測試指令碼,錄製兩遍;
第二步:使用WinDiff工具找出兩次指令碼的不同,判斷是否需要進行關聯;
第三步:使用web_reg_save_param函式手動建立關聯;
第四步:將指令碼中有用到關聯的資料,以引數代替;
第一步、錄製測試指令碼,錄製兩遍:
先錄製一份指令碼存檔,取名為loginA,再依照相同的操作步驟與資料錄製第二份指令碼並儲存,取名為loginB並關閉loginB;(兩次錄製的操作步驟及使用資料最好保持一模一樣)。
第二步:使用WinDiff工具找出兩次指令碼的不同,判斷是否需要進行關聯;
在指令碼loginA中,單擊VuGen的選單tool→compare with vuser...,並選擇loginB,如下圖所示:
然後就會看到,黃色的部分都是兩個指令碼不同的地方(所以儘量要保持指令碼一致)。可以看到紅色部分,就是我們兩次的userSession發生了變化。
然後根據選項選擇options->view->Line Numbers和Show Inline Differences,如下圖
結果顯而易見,會把字元變化的部分使用紅色的標記出來,這樣就更方便觀察了。所以最終對比的結果如下所示:
第三步:使用web_reg_save_param函式手動建立關聯;
逐一檢查差異部分,每個地方都可能是需要關聯的地方,但是在上圖所示的例子裡,我們只需要關聯的是userSession。
接著開啟Recording Log(單一協議)或是Generation Log(多重協議)中找到這個值。可以在Generation Log的開頭部分使用ctrl+f快捷鍵,查詢發生變化的值
經過查詢我們發現,userSession是在Response Body For Transcation With Id 25(ID25的回執報文身體部分)這裡回執給客戶端的;然後,我們需要找到Id 25所對應的傳送請求的路徑。
如下圖所示,最終找到傳送請求的 Request Header For Transaction With Id 25(ID25的請求報頭),它的請求地址是 “/webTours/nav.pl?in=home”;
接下來去腳本里面進行搜尋,最終定位,在指令碼的下圖部分進行的請求
所以,最終,我們只需要在web_submit_data前面編寫關聯函式就可以了(如果怕有問題,可以寫在指令碼最前面)。
第四步:插入關聯函式函式可以如下所示,也可以使用web_reg_save_param()函式,區別在於web_reg_save_param_ex()函式可以使用正則表示式來過濾左右邊界。
web_reg_save_param_ex(
"ParamName=CorrelationParameter_1",
"LB=userSession value=",
"RB=>\n<table border",
SEARCH_FILTERS,
"Scope=All",
"RequestUrl=*/nav.pl*",
LAST);
然後,在腳本里面,使用ParamNmae後面的值 CorrelationParameter_1這個引數把腳本里面的變化值value=122860.759740786zDVQzfApDcQVzzzHDHQVHpQAVQHf替換掉,就會變成
value={ CorrelationParameter_1}。
最後,執行指令碼,體驗一下關聯成功以後,指令碼是否能夠執行成功!
注意:還有兩種手動關聯的方式,會比手動寫函式更簡單一點,就是在確認變化的引數之後,①在Response body裡面找到變化的值以後,直接採用右鍵關聯的方式進行關聯設定。
其中需要做的設定有其中要進行的設定,包括,啟用Tree模式,點選HTTP View,設定為Display Recorded Snapshot,然後點選到Response Body部分。
接著,找到變化的值,選中它,點選右鍵->Create Correlation建立聯接
②在VGun裡面選擇insert->New Step->Services->web_reg_save_param_ex,然後會出現以下的介面,分別填寫左右邊界和引數名字等關鍵引數,就能夠將關聯做好而不需要手動寫函數了。
Prameter name: 此處設定存放參數的名稱。
Left boundary: 此處設定左邊界,這裡是用來填寫關聯對於資料處理的左匹配內容規則。
Match case : 預設情況下邊界是檢查Match case ,也就是檢查大小寫的。
Binary data : 如果要關聯的內容是非ASCII 字元的,需要選擇此項
Regular expression : 在LR11 中關聯提供了使用正則表示式的功能,但是LR11 Patch3 中取消web_reg_save_param_ex 函式對此功能的設定。
Reight boundary: 此處設定右邊界。
DFEs : 在錄製選項和回放中我們提供了DFE的功能,在關聯這裡也支援DFE的資料處理。 (DFE等後面再解釋,或你自行查資料)
Ordinal : 這個關鍵字在很多函式裡面都有應用,在這裡可以填寫任意一個整數,也可以填All 。如果填寫數字,那麼說明從返回的記錄中取出對應順序的值,而填寫All 的話將會返回所有內容。
Save Offset : 設定關聯的內容偏移量,從第幾位開始進行關聯操作。
Save Length : 關聯出來的內容所需要儲存的長度。
Warm if text was not found (Default is Error) : 對於關聯的物件不存在的處理。
Filters : 下面的選項都是幫助關聯返回限定的,通過這些設定可以進一步減少返回的範圍。
最後,介紹幾個解決亂碼問題的方法:
1. 錄製完以後腳本里面有亂碼
解決方案:在VuGen裡面選擇Tools->Recording Options(或者直接CTRL+F7)->Advanced,更改Suppert Charset->UTF-8
注意:該方法只有改了以後再錄才會生效,錄完再改沒有任何效果!
但是如果設定為UTF-8,頁面反而是GB2312或者其他編碼,這個時候反而會產生亂碼,所以最好是確認頁面是什麼編碼然後進行更改最穩妥
如何檢視頁面編碼呢?
- 檢視頁面原始碼,檢視charset(編碼在http response header中的Content-Type)是什麼格式。
b.IE開啟頁面後,右鍵->編碼,檢視瀏覽器自動選擇的編碼是什麼
2.腳本回訪時出現亂碼
a. 更改執行時設定:
點選選單欄中的Vuser,選擇Run-time Settings(或者直接按F4鍵):
在彈出的視窗左側點選Internet Protocol->Preferences->Advanced然後在右側視窗中點選Options按鈕,在彈出的窗體中找到General->Convert from/to UTF-8,將其設為Yes。