一、什么時候需要關(guān)聯(lián)
1.關(guān)聯(lián)的含義
關(guān)聯(lián)(correlation):在腳本回放過程中,客戶端發(fā)出請求,通過關(guān)聯(lián)函數(shù)所定義的左右邊界值(也就是關(guān)聯(lián)規(guī)則),在
服務(wù)器所響應(yīng)的內(nèi)容中查找,得到相應(yīng)的值,已變量的形式替換錄制時的靜態(tài)值,從而向服務(wù)器發(fā)出正確的請求,這種動態(tài)獲得服務(wù)器響應(yīng)內(nèi)容的方法被稱作關(guān)聯(lián)。
其實關(guān)聯(lián)也屬于一同特殊的參數(shù)化,只是與一般的參數(shù)化有些不同
一般的參數(shù)化的參數(shù)來源于一個文件、一個定義的table、通過
sql寫的一個結(jié)果集等,但關(guān)聯(lián)所獲得的參數(shù)是服務(wù)器響應(yīng)請求所返回的一個符合條件的、動態(tài)的值
2.什么時候需要做關(guān)聯(lián)
要想弄清這個
問題,我們首先要知道客戶端與服務(wù)器端的請求與響應(yīng)的過程
過程說明:
客戶端發(fā)出獲得登錄
頁面的請求
服務(wù)器端得到該請求后,返回登錄頁面,同時動態(tài)生成一個Session Id
當(dāng)用戶輸入用戶名密碼,請求登錄時,該Session Id同時被發(fā)送到服務(wù)器端
如果該Session Id在當(dāng)前會話中有效,那么返回登錄成功的頁面,如果不正確則登錄失敗
在第一次錄制過程中l(wèi)oadrunner把這個值記錄了下來,寫到了腳本中,但再次回放時,客戶端發(fā)出同樣的請求,而服務(wù)器端再一次動態(tài)的生成了Session Id,此時客戶端發(fā)出的請求就是錯誤的,為了獲得這個動態(tài)的Session Id我們這里用到了關(guān)聯(lián)。
所以我們得出結(jié)論:
當(dāng)客戶端的某個請求是隨著服務(wù)器端的相應(yīng)而動態(tài)變化的時候,我們就需要用到關(guān)聯(lián)
當(dāng)然我們在錄制腳本時應(yīng)該對
測試的項目進(jìn)行適當(dāng)?shù)牧私?,知道哪些請求需要用到服?wù)器響應(yīng)的動態(tài)值,如果我們不明確那些值需要做關(guān)聯(lián)的話,我們也可以將腳本錄制兩遍,通過對比腳本的方法來查找需要關(guān)聯(lián)的部分,但并不是說兩次錄制的所有不同點都需要關(guān)聯(lián),這個要具體情況具體分析
二、自動關(guān)聯(lián)
loadrunner參數(shù)化自動關(guān)聯(lián)包含兩種機制:
一種是loadrunner通過對比錄制和回放時服務(wù)器響應(yīng)的不同,而提示用戶是否進(jìn)行關(guān)聯(lián),用戶可自己創(chuàng)建關(guān)聯(lián)規(guī)則,這個功能可以方便的使我們獲得需要關(guān)聯(lián)的部分,但同時也存在一定的問題,如:自動關(guān)聯(lián)所檢測到的關(guān)聯(lián)點不一定真的需要進(jìn)行關(guān)聯(lián),這要我們更具實際情況進(jìn)行判斷;有些需要關(guān)聯(lián)的動態(tài)數(shù)據(jù)自動關(guān)聯(lián)無法找到,這是就需要做手動關(guān)聯(lián)
另一種是loadrunner自帶的自動關(guān)聯(lián)規(guī)則,在錄制腳本時,會根據(jù)這些規(guī)則自動創(chuàng)建關(guān)聯(lián)
自動關(guān)聯(lián)的步驟如下:
1.開啟自動關(guān)聯(lián)選項
剛才提到的兩種關(guān)聯(lián)機制,如果用戶想使用loadrunner自帶的關(guān)聯(lián)規(guī)則創(chuàng)建關(guān)聯(lián),那么需要在【Recording Options】>【Internet Protocol】>【Correlation】中啟用關(guān)聯(lián)規(guī)則,選中“Enable correlation during recording”,當(dāng)錄制這些應(yīng)用系統(tǒng)的腳本時,VuGen會在腳本中自動建立關(guān)聯(lián)。也可以在【Recording Options】>【Internet Protocol】>【Correlation】中添加關(guān)聯(lián)規(guī)則,達(dá)到自動關(guān)聯(lián)的目的。
如果需要在回放腳本時,loadrunner自動檢測需要關(guān)聯(lián)的部分,那么需要在【Tools】>【general options】>【Correlation】中選中“save correlation information during replay”和“show scan for correlations popup after replay of vuser”,當(dāng)回放玩腳本后,會彈出Scan action for correlation窗口,進(jìn)行關(guān)聯(lián)點的搜索
2.錄制腳本
錄制腳本的過程在這里就不多說了
3.回放腳本
如果錄制的腳本存在需要做關(guān)聯(lián)的部分,那么在回放腳本時會出現(xiàn)錯誤
4.系統(tǒng)自動彈出檢測關(guān)聯(lián)對話框,或手動啟動關(guān)聯(lián)檢測對話框
如果選擇了【Tools】>【general options】>【Correlation】中的“save correlation information during replay”和“show scan for correlations popup after replay of vuser”,那么在回放腳本后會自動彈出“Scan action for correlation”窗口,點擊“yes”進(jìn)行自動查找
如果沒有選擇上述設(shè)置,那么也可以按CTRL+F8啟動關(guān)聯(lián)自動搜索
5.查看系統(tǒng)檢測出的關(guān)聯(lián)點進(jìn)行關(guān)聯(lián)設(shè)置
如果在錄制和回放中存在差異,loadrunner會在“Correlation Results”中列出需要做關(guān)聯(lián)的內(nèi)容,用鼠標(biāo)點擊一條需要做關(guān)聯(lián)的內(nèi)容,點擊“Create Rule”,系統(tǒng)會顯示獲得當(dāng)前數(shù)據(jù)的規(guī)則,點擊“yes”,完成規(guī)則的創(chuàng)建,同時查看腳本中增加了一個web_reg_save_param函數(shù)
也可以點擊【Correlate】按鈕創(chuàng)建關(guān)聯(lián),一筆一筆做,或是按下【Correlate All】讓VuGen一次就對所有的數(shù)據(jù)建立關(guān)聯(lián)。
注意:由于Correlation Studio會找出所有有變動的數(shù)據(jù),但是并不是所有的數(shù)據(jù)都需要做關(guān)聯(lián),所以不建議您直接用【Correlate All】。
6.回放腳本檢查關(guān)聯(lián)的正確性
創(chuàng)建好關(guān)聯(lián)后,回放腳本檢查關(guān)聯(lián)的正確性
三、手動關(guān)聯(lián)
手動關(guān)聯(lián)的過程大致如下:
第一步:錄制
測試腳本,錄制二遍
第二步:使用WinDiff工具找出兩次腳本的不同,判斷是否需要進(jìn)行關(guān)聯(lián)
第三步:確定插入關(guān)聯(lián)的位置
第四步:在VIEW TREE中使用web_reg_save_param函數(shù)手動建立關(guān)聯(lián)
第五步:將腳本中有用到關(guān)聯(lián)的數(shù)據(jù),用參數(shù)代替
第六步:驗證關(guān)聯(lián)的正確性
下面詳細(xì)介紹:
第一步:錄制測試腳本,錄制二遍
這一步就不用多說了,相同的操作,錄制兩份,分別保存
第二步:使用WinDiff工具協(xié)助找出需要關(guān)聯(lián)的數(shù)據(jù)
1. 在第二份腳本中,點選VuGen的【Tools】>【Compare with Vuser…】,并選擇第一份腳本。
2. 接著WinDiff會開啟,同時顯示二份腳本,并顯示有差異的地方。WinDiff會以一整行黃色標(biāo)示有差異的腳本,并且以紅色的字體顯示真正差異的文字。(假如沒看到紅色字體,請點選【Options】>【View】>【Show Inline Differences】)。
查看二份腳本中差異的部份,每一個差異都可能是需要做關(guān)聯(lián)的地方。
注意:
lr_thik_time部分的差異可以忽略
找到不同的部分后,復(fù)制,然后打開Recording Log或是Generation Log,按Ctrl+F,在查找窗口中粘貼差異部分的內(nèi)容,點擊查找找到后,查看該部分的信息,確認(rèn)是客戶端的請求信息還是服務(wù)器回應(yīng)的信息
如果出現(xiàn)在$$$$$$ Request Header For Transaction With Id 3 Ended $$$$$$這個部分,那證明是客戶端發(fā)出的請求,這里是不需要做關(guān)聯(lián)的
一般做的關(guān)聯(lián)都是出現(xiàn)在****** Response Header For Transaction With Id 7 ******和****** Response Body For Transaction With Id 7 ******中的部分。
在找到這個信息后,需要記錄如下信息:
a、記錄這個不同數(shù)據(jù)之前的內(nèi)容和之后的內(nèi)容
b、記錄這個不同數(shù)據(jù)出現(xiàn)的位置,是Header還是Body
第三步:確認(rèn)插入關(guān)聯(lián)的位置
我們在日志中找到了兩次腳本的不同點的位置,根據(jù)這個位置,我們再確定是在哪個請求之后產(chǎn)生的,也就是說要定位發(fā)生不同點的response是由哪個request產(chǎn)生的,找到了這個請求的函數(shù)位置,我們就知道要往哪里做關(guān)聯(lián)了。
一般情況下關(guān)聯(lián)函數(shù)寫到發(fā)出請求的函數(shù)之前就可以了。
第四步:插入關(guān)聯(lián)函數(shù)
在插入關(guān)聯(lián)函數(shù)前,我們先介紹關(guān)聯(lián)函數(shù)web_reg_save_param
一個web_reg_save_param函數(shù)的例子:
web_reg_save_param ("sessionid",
"LB=Session_id:",
"RB=;",
"Search=Body",
LAST);
在這里我們只介紹幾個常用參數(shù)的含義
語法:int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
參數(shù)說明:
ParamName: 存放得到的動態(tài)內(nèi)容的參數(shù)名稱
list of Attributes: 其它屬性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。屬性值不分大小寫
LB( Left Boundary ) : 返回信息的左邊界字串。該屬性必須有,并且區(qū)分大小寫。
RB( Right Boundary ): 返回信息的右邊界字串。該屬性必須有,并且區(qū)分大小寫。
Search : 返回信息的查找范圍??梢允荋eaders,Body,Noresource,All(缺省)。該屬性質(zhì)可有可無。
那么如何插入該關(guān)聯(lián)函數(shù)呢?
1.將vugun切換到 view tree 模式下
2.在左邊的列表中,找到在上一步發(fā)出請求的函數(shù),點擊“右鍵”
選擇“insert before”
3.在彈出的“add step”對話框的“find function”中輸入“web_reg_save_param”,點擊“ok”
在“parameter name”中輸入,關(guān)聯(lián)函數(shù)的名稱,這里最好有含義,“sessionid”
在“left boundary”中輸入,剛才記錄下的不同點字符串的左面的幾個字符,定義左邊界,Session_id:
在“right boundary”中輸入,剛才記錄下的不同點字符串的右面的幾個字符,定義右邊界,;
在“search in ”中,選擇“body”
點擊“ok”
4.回到腳本編輯模式下,查看該函數(shù)插入是否正確
在發(fā)出請求的函數(shù)前應(yīng)該看到:
web_reg_save_param ("sessionid",
"LB=Session_id:",
"RB=;",
"Search=Body",
LAST);
第五步:將腳本中有用到關(guān)聯(lián)的數(shù)據(jù),用參數(shù)代替
如發(fā)出請求的參數(shù)如下,那么將原來服務(wù)器返回的動態(tài)值使用{ sessionid } 來替換:
web_submit_form("login.
php_2",
"Snapshot=t2.inf",
ITE
MDATA,
"Name=login", "Value=wangjin", ENDITEM,
"Name=password", "Value=wangjin", ENDITEM,
"Name=Session_id","Value={ sessionid } ", ENDITEM,
"Name=Submit", "Value=Login", ENDITEM,
EXTRARES,
"URL=/media/images/border_bg_l.gif", ENDITEM,
"URL=/media/images/header_bg.gif", ENDITEM,
"URL=/media/images/th.gif", ENDITEM,
LAST);
第六步:驗證關(guān)聯(lián)的正確性
回放腳本,驗證關(guān)聯(lián)的正確性。
OK?。?!
大功告成。