錄制腳本是模擬用戶(hù)行為的第一步,通過(guò)錄制用戶(hù)行為產(chǎn)生的協(xié)議從而生成Vuser Script。當我們對函數比較熟悉的時(shí)候,可以?huà)仐変浿频倪^(guò)程,而采用手工編寫(xiě)。在大多數情況下,我們會(huì )在錄制生成的腳本上根據實(shí)際需求進(jìn)一步進(jìn)行修改,這樣效率更高。
錄制用戶(hù)行為轉化為腳本一般是按照以下步驟進(jìn)行的,如圖3.6所示。
在開(kāi)始菜單中找到LoadRunner程序項并打開(kāi)Application,找到Virtual User Generator,選擇文件菜單下的“新建”功能,創(chuàng )建腳本。
在前面我們知道性能測試是基于協(xié)議的,所以首先要選擇匹配的協(xié)議,如果協(xié)議錯誤將會(huì )導致無(wú)法錄制用戶(hù)行為,選擇過(guò)多會(huì )導致錄制內容的冗余,而選擇不足又會(huì )導致漏錄的情況發(fā)生。新建腳本首先需要選擇協(xié)議類(lèi)型,在VuGen中分為單協(xié)議和多協(xié)議兩種情況。

圖3.6 VuGen錄制流程
單協(xié)議(New Single Protocol Script)
在單協(xié)議情況下,所要錄制的對象只使用唯一的協(xié)議,如圖3.7所示。

圖3.7 單協(xié)議選擇界面
通過(guò)Category可以對協(xié)議進(jìn)行分類(lèi),方便查找。
多協(xié)議(New Multiple Protocol Script)
在需要錄制的對象使用多于一種協(xié)議的情況下,應該選擇多協(xié)議,并且將這些協(xié)議都進(jìn)行添加,否則會(huì )因為漏選協(xié)議而無(wú)法正?;胤拍_本,如圖3.8所示。

圖3.8 多協(xié)議選擇界面
確定系統使用協(xié)議最簡(jiǎn)單的方法就是詢(xún)問(wèn)開(kāi)發(fā)人員,特別是C/S架構使用的協(xié)議可能比較特殊,甚至有可能是自行開(kāi)發(fā)的協(xié)議包規范。另外一種方法就是通過(guò)網(wǎng)絡(luò )掃描工具攔截數據包,確定協(xié)議類(lèi)型。
由于絕大多數性能測試都是基于B/S架構下的HTTP協(xié)議,所以后面的章節主要針對HTTP,在高級腳本開(kāi)發(fā)中會(huì )涉及部分非HTTP協(xié)議的腳本開(kāi)發(fā)內容。
在選擇合適的協(xié)議后準備開(kāi)始錄制,而選擇不同的協(xié)議后彈出的錄制窗口和錄制選項也不盡相同。
這里選擇Web(HTTP/HTML)協(xié)議(模擬瀏覽器和Web服務(wù)器之間的協(xié)議交互),如圖3.9所示。
彈出Start Recording窗口,如果沒(méi)有彈出可以使用Vuser菜單下的Start Recording或Ctrl+R組合鍵啟動(dòng)錄制過(guò)程,如圖3.10所示。


圖3.9 選擇Web協(xié)議 圖3.10 Start Recording窗口(Internet應用)
Applications Type
首先需要設置的是Application type,VuGen中提供了Internet Applications和Win32 Applications兩種應用的錄制選項。
Internet Applications:指需要錄制的對象是一個(gè)網(wǎng)絡(luò )應用(基于瀏覽器)。
Program to record:指需要錄制的程序名,VuGen默認支持的Web客戶(hù)端是IE,也建議不要使用任何第三方的瀏覽器來(lái)錄制,避免出現不兼容。從Load Runner 9.1版本開(kāi)始已經(jīng)能夠很好地兼容IE 7.0(最新版本9.5仍然沒(méi)有提供對IE 8.0的支持)。
URL Address:錄制開(kāi)始所需要訪(fǎng)問(wèn)的URL地址,也就是第一個(gè)請求所需要訪(fǎng)問(wèn)的 頁(yè)面。
Working directory:用來(lái)指定代碼的工作目錄。
Win32 Applications是用來(lái)支持Win32的標準客戶(hù)端,如果客戶(hù)端是自行開(kāi)發(fā)的,請使用該選項,如圖3.11所示。
Program to record:需要錄制的應用程序,我們可以通過(guò)后面的 
Program arguments:指程序參數,在某些應用程序后需要添加一些參數才能運行,這里提供的是填寫(xiě)參數的位置。

圖3.11 Start Recording窗口(Win32應用)
Record into Action:錄制的內容會(huì )被存放在A(yíng)ction中,Action是VuGen提供的一種類(lèi)似于函數的腳本塊,通過(guò)將不同的操作存放在不同的Action中實(shí)現代碼的高內聚低耦合。
這里可以單擊New按鈕來(lái)新建Action。
VuGen默認提供了以下3個(gè)Action:
Ÿ Vuser_init
Ÿ Action
Ÿ Vuser_end
這里可以先簡(jiǎn)單介紹一下這 3個(gè)Action有什么不同,在LoadRunner中用戶(hù)的初始化操作應該存放在Vuser_init中,用戶(hù)的結束操作存放在Vuser_end中,因為這兩個(gè)Action在后面的Run Logic默認設置中是處在腳本最先運行和最后運行的位置,并且在負載時(shí)Vuser_init和Vuser_end只會(huì )在開(kāi)始和結束時(shí)被運行一次。而 Action用來(lái)存放用戶(hù)的操作,可以當做普通的函數在負載時(shí)會(huì )被反復運行。
Record the application startup:?jiǎn)螕鬙K按鈕后VuGen會(huì )啟動(dòng)我們需要錄制的應用,這個(gè)選項是指一旦啟動(dòng)了應用后就將開(kāi)始錄制應用收發(fā)的協(xié)議數據。
為了確保錄制出來(lái)的腳本簡(jiǎn)潔有效,在開(kāi)始錄制前需要對錄制選項進(jìn)行一定的設置。
錄制選項
在不同的協(xié)議下錄制選項各不相同,這里介紹基于Web(HTTP/HTML)協(xié)議錄制選項的設置,如圖3.12所示。

圖3.12 HTML協(xié)議錄制選項
General
Ÿ Script:基于Web(HTTP/HTML)協(xié)議的Vuser腳本是使用C語(yǔ)言作為標準的。在不同的協(xié)議下,所使用的語(yǔ)言也不相同。在Script選項中提供了一些對于腳本的基本設置。
例如這里可以通過(guò)Maximum number of lines in action file設置每個(gè)Action中的最大代碼行數。
Ÿ Protocols:協(xié)議列表,在這里會(huì )列出錄制前選中的所有協(xié)議,通過(guò)修改協(xié)議前的選項來(lái)決定使用什么協(xié)議來(lái)錄制腳本,在多協(xié)議的時(shí)候可以通過(guò)這個(gè)功能切換錄制所使用的協(xié)議或補錄某些協(xié)議的內容,如圖3.13所示。
Ÿ Recording:錄制選項用于設置Web(HTTP/HTML)使用什么樣的錄制方式來(lái)獲得腳本,這里提供了兩大類(lèi)的錄制方式,如圖3.14所示。
Ÿ HTML-based Script:這種方式錄制出來(lái)的腳本是基于HTML的,以HTML操作為錄制級別,非HTML操作不進(jìn)行錄制。由于現在使用的B/S架構網(wǎng)站都是基于 HTML,也就是說(shuō)訪(fǎng)問(wèn)的頁(yè)面都是從一個(gè)HTML跳轉到另外一個(gè)HTML,那么錄制的時(shí)候只需要得到針對HTML的請求即可。


圖3.13 協(xié)議激活列表 圖3.14 錄制級別選項
下面打開(kāi)HTML Advanced…高級選項,彈出如圖3.15所示的對話(huà)框。

圖3.15 HTML-based script高級設置
Script type提供了基于HTML方式下的兩種不同的腳本類(lèi)型。
1.高級選項下的Script type腳本類(lèi)型選項
Ø A script describing user actions
基于解釋用戶(hù)行為的腳本,后面提示使用類(lèi)似web_link、web_submit_form等的函數,這種腳本錄制出來(lái)有些類(lèi)似于QTP,具體描述了用戶(hù)進(jìn)行了什么操作。
現在我們使用這種方式錄制一個(gè)腳本(打開(kāi)Web Tours網(wǎng)站,然后單擊sign up now),錄制完成后可以得到以下腳本:
web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
web_link("sign up now",
"Text=sign up now",
"Snapshot=t2.inf",
LAST);
下面我們簡(jiǎn)單分析一下這個(gè)腳本的組成。
web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");
這個(gè)函數是由LoadRunner提供的,根據函數的名稱(chēng)也可以大概猜到其功能,函數web_add_cookie()主要負責為Vuser腳本添加一個(gè)cookie信息。
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
這個(gè)函數的內容很多,不過(guò)從URL=http://127.0.0.1:1080/WebTours/可以看出實(shí)現訪(fǎng)問(wèn)網(wǎng)站首頁(yè)是通過(guò)這個(gè)函數實(shí)現的,也就是說(shuō)在地址欄里輸入地址后按回車(chē)鍵的操作其實(shí)就是進(jìn)行了這個(gè)函數的模擬請求。
web_link("sign up now",
"Text=sign up now",
"Snapshot=t2.inf",
LAST);
web_link是使用A script describing user actions選項才可以得到的,這個(gè)函數就是單擊sign up now連接的操作,在這個(gè)函數中說(shuō)明了需要單擊的鏈接名。
補充:web_link()函數詳解
web_link()函數用來(lái)模擬用戶(hù)單擊一個(gè)超鏈接的操作。VuGen會(huì )記錄訪(fǎng)問(wèn)頁(yè)面后服務(wù)器返回的內容中有多少個(gè)超鏈接。當使用web_link()函數時(shí),只要寫(xiě)出正確的鏈接名,VuGen會(huì )自動(dòng)查找并訪(fǎng)問(wèn)頁(yè)面中該鏈接名所指向的URL地址。
web_link()函數的基本語(yǔ)法如下所示:
web_link(“在測試結果中顯示的名稱(chēng)”,“TEXT=需要單擊的超鏈接名”,LAST);
Ÿ 在測試結果中顯示的名稱(chēng)
也被稱(chēng)作步驟名,在測試結果中顯示的名稱(chēng)是指在腳本運行完成后,打開(kāi)Test Result,在link函數后的名稱(chēng)(此處為sign up now),如圖3.16所示。
這是通過(guò)web_link(“sign up now”,….)來(lái)實(shí)現的,我們能夠在測試結果中方便、快速地定位。
Ÿ 需要單擊的超鏈接名
單擊的鏈接是通過(guò)Text=來(lái)說(shuō)明的,等號后的內容就是需要單擊的鏈接。這里需要注意,如果Text后的鏈接名不存在,那么就會(huì )得到以下錯誤:
Action.c(17): Error -27995: Requested link ("Text=signupnow") not found [MsgId: MERR-27995]
Action.c(17): web_link("sign up now") highest severity level was "ERROR", 0 body bytes, 0 header bytes [MsgId: MMSG-26388]
該錯誤信息提示單擊的signupnow這個(gè)鏈接不存在,整個(gè)web_link函數是錯誤的。
“Snapshot=t2.inf”用來(lái)說(shuō)明該操作后的內容會(huì )被抓圖保存到文件t2.inf中。最后的LAST表明這個(gè)函數的結束。
例如:想要該腳本去點(diǎn)擊WebTours首頁(yè)上的administration鏈接,我們只需要將web_link函數修改為:
web_link("click administration",
"Text=administration",
LAST);
回放腳本看看是否正確通過(guò),并進(jìn)入管理頁(yè)面。
思考:
如果一個(gè)頁(yè)面中有多個(gè)同名的鏈接,使用web_link()該如何處理?
Ord這個(gè)關(guān)鍵字可以幫助你,在VuGen中很多函數都使用這個(gè)參數來(lái)判斷對象的次序。
例如要單擊頁(yè)面上的第二個(gè)鏈接,那么可以這樣寫(xiě):
web_link("click link",
"Text=link",
Ord=2,
LAST);
在這里需要注意,同名鏈接的先后順序是根據HTML代碼的解釋順序(從左往右,從上往下)來(lái)確定的。
使用HTML-base script下的A script describing user actions好處是腳本簡(jiǎn)潔,基于用戶(hù)操作進(jìn)行模擬,淺顯易懂,并且自身就包含了對象檢查過(guò)程,無(wú)須校驗。其缺點(diǎn)是當頁(yè)面中存在多個(gè)同名鏈接時(shí)難以區分。所以我們建議使用下面一種腳本模式:A script containing explicit URLs only (e.g. web_url, web_submit_data)。
小練習:
嘗試使用該錄制方式錄制MsPetshop購物網(wǎng)站首頁(yè)單擊一個(gè)鏈接的腳本。
錄制后在腳本中可以看到如下的內容:
web_link("BIRDS","Text=Birds",LAST);
這是單擊BIRDS鏈接所帶來(lái)的結果,在前面說(shuō)過(guò)Text=后的內容是所單鏈接的正文,那么為什么明明界面上該鏈接名顯示的是“BIRDS”,但這樣寫(xiě)腳本回放會(huì )提示“無(wú)法找到這個(gè)鏈接”,而寫(xiě)成“Birds”就可以成功呢?
如果仔細查看一下MsPetshop網(wǎng)站的源代碼,就會(huì )發(fā)現這個(gè)鏈接確實(shí)是Birds,但為什么看到的是BIRDS呢?檢查一下該網(wǎng)站的CSS文件就會(huì )明白了。
VuGen腳本都是針對HTML源代碼操作的,到底web_link如何識別單擊對象的呢?或者這類(lèi)腳本中的“對象識別”是如何做到的?在錄制后的腳本中切換到Tree模式,如圖3.17所示。
這里可以看到在錄制后的內容中有幾個(gè)標簽,除了web_url()請求發(fā)送后的頁(yè)面返回截圖,還有兩個(gè)標簽,一個(gè)是Client Request,另一個(gè)是Server Response,在這兩個(gè)標簽中的內容就是VuGen錄制的客戶(hù)端發(fā)給服務(wù)器端的HTTP請求格式和服務(wù)器返回的HTTP請求內容。選擇Server Response標簽,可以看到返回內容的格式分解,如圖3.18所示。


圖3.17 Tree模式下的Page View 圖3.18 Tree模式下的Server Response
在這里可以看到Form的說(shuō)明和Links的內容,而web_link()和web_submit_data()能夠識別對象的基礎就是這里的服務(wù)器返回內容分解,也就是說(shuō)能夠單擊的鏈接一定在這個(gè)Links內。這就是VuGen的對象識別技術(shù)和對象庫。
Ø A script containing explicit URLs only
該選項確定基于URL請求的腳本錄制類(lèi)型。與基于用戶(hù)行為模擬的不同之處在于,這種錄制方式不考慮任何用戶(hù)操作,只考慮客戶(hù)端發(fā)送的請求,注重系統實(shí)際上做了什么。
將腳本類(lèi)型切換為這種形式,然后錄制和前面在Web Tours上點(diǎn)擊鏈接操作相同的例子,停止后會(huì )得到以下腳本。
web_add_cookie("login=admin%2Czh; DOMAIN=127.0.0.1");
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
web_url("sign up now", "URL=http://127.0.0.1:1080/WebTours/login.pl?username=&password=&getInfo=true",
"TargetFrame=body",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/home.html",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
看看有什么不同的地方,web_link()函數被web_url()替代了,前面提過(guò)web_url()函數的作用是實(shí)現地址請求的過(guò)程。
補充:web_url()函數詳解
web_url()函數可以模擬用戶(hù)請求,它也是在腳本中最常使用的函數之一。
web_url()函數的基本語(yǔ)法如下所示:
web_url(“在測試結果中顯示的名稱(chēng)”,“URL=需要訪(fǎng)問(wèn)的超鏈地址”,LAST);
和web_link不同的地方在于這里只需要在URL=后填寫(xiě)需要訪(fǎng)問(wèn)的地址即可,和在IE地址欄中輸入的內容相同,使用web_url的好處是沒(méi)有任何請求的前后依賴(lài)關(guān)系,只負責發(fā)送一個(gè)標準的Get HTTP請求。
如果需要訪(fǎng)問(wèn)51Testing論壇,可以直接這樣寫(xiě):
web_url("51testing","URL=http://bbs.51testing.com",LAST);
除了以上這些元素,在錄制出來(lái)的web_link或者web_url函數中經(jīng)常還能看到如下所示的大量?jì)热荩?/p>
EXTRARES
"Url=../bite.jpg", "Referer=http://192.168.0.200", ENDITEM,
"Url=../title.gif", "Referer= http://192.168.0.200", ENDITEM,
……
這一段內容說(shuō)明在載入這個(gè)頁(yè)面時(shí)還有其他圖片或者附屬資源需要下載。
web_link()和web_url()函數都是頁(yè)面訪(fǎng)問(wèn)型函數,實(shí)現HTTP請求中的GET方法,如果需要提交表單,實(shí)現HTTP請求中的POST方法,那么需要使用web_submit_form()或web_submit_data()函數。
補充:web_submit_form()函數詳解
該函數會(huì )自動(dòng)檢測在當前頁(yè)面上是否存在form,然后將后面的ITEMDATA數據進(jìn)行傳送。例如錄制在Web Tours網(wǎng)站上登錄操作,可以得到以下代碼:
web_submit_form("login.pl",
"Snapshot=t3.inf",
ITEMDATA,
"Name=username", "Value=admin", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
隱藏的表單數據系統會(huì )自行發(fā)送。
補充:web_submit_data()函數詳解
和web_submit_form()函數不同,web_submit_data()函數無(wú)須前面的頁(yè)面支持,直接發(fā)送給對應頁(yè)面相關(guān)數據即可。錄制Web Tours網(wǎng)站登錄,代碼會(huì )變?yōu)椋?/p>
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=body",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t5.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value=100084.208748481fVtiAiVptiHfDAiiiptiiQcf", ENDITEM,
"Name=username", "Value=admin", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
其中Action說(shuō)明提交表單的處理頁(yè)面,Method表明提交數據的方式。
當使用web_submit_data()函數時(shí),隱藏表單的數據也會(huì )被記錄下來(lái)作為ITEMDATA數據提交給服務(wù)器。
這里介紹了在HTTP頁(yè)面中最常用的4個(gè)頁(yè)面函數 web_link()、web_url()、web_submit_form()、web_submit_data(),通過(guò)這些函數可以實(shí)現大多數頁(yè)面訪(fǎng)問(wèn)的請求和數據提交的過(guò)程。除了這4個(gè)函數,還有一個(gè)函數可能會(huì )經(jīng)??吹剑簑eb_custom_request()。當請求比較特別時(shí),VuGen無(wú)法簡(jiǎn)單使用以上4個(gè)函數進(jìn)行表述,那么錄制后便會(huì )出現web_custom_request()函數,這個(gè)函數的作用是自定義HTTP請求規則。該函數更適合在使用自定義的HTTP請求規則中處理二進(jìn)制內容。具體格式請參考幫助文檔。
2.高級選項下的Non HTML-generated elements(e.g. JavaScript,VBScript,ActiveX, Applets)選項這個(gè)選項是對非標準的HTML元素的處理方式,VuGen有以下3種處理方式:
Ÿ Record within the current script step
對于JavaScript等內容直接作為web_url下的附屬信息記錄。
Ÿ Record in separate steps and use concurrent groups
對于相關(guān)的內容新建一個(gè)web_url來(lái)處理。
Ÿ Do not record
不錄制額外的內容。
在默認情況下選擇直接錄制在web_url下,如果某些內容錄制會(huì )導致腳本回放錯誤,那么可以不錄制該內容。
URL-BASE Script:是基于URL請求的腳本錄制方式,會(huì )錄制得到所有的HTTP請求。選擇該選項會(huì )錄制所有的HTTP請求,導致腳本包含大量的 web_url()函數,參考前面HttpWatch獲得的HTTP交互過(guò)程,VuGen只是將所有的請求抓取出來(lái),并且對每個(gè)請求均生成一個(gè) web_url()函數來(lái)進(jìn)行模擬。
思考:
什么時(shí)候應該用HTML-BASE Script?什么時(shí)候應選擇URL-BASE Script?
一般來(lái)說(shuō)如果是標準使用IE訪(fǎng)問(wèn)的B/S架構,應該使用HTML-BASE下的A script containing explicit URLs only方式來(lái)錄制腳本,這種腳本基于URL請求完成,不會(huì )帶有任何前后依賴(lài)的內容。而如果是一個(gè)非IE標準的C/S架構,建議使用URL-BASE Script來(lái)錄制腳本,這樣可以確保不會(huì )遺漏任何HTTP請求。
例如:如果使用HTTP進(jìn)行數據傳送,而數據內容是存放在.dat文件中的,那么使用HTML-BASE Script就無(wú)法錄制到對該.dat文件的操作,而使用URL-BASE Script就可以錄制出來(lái)。
Network
Port Mapping提供了對于端口映射的處理規則,在默認情況下不需要進(jìn)行任何設置,VuGen會(huì )自動(dòng)根據協(xié)議確定端口名,對該端口進(jìn)行監控和錄制,但是如果使用了非標準的端口進(jìn)行數據傳輸偶爾會(huì )出現VuGen能發(fā)現數據包的收發(fā)操作,但是無(wú)法正確錄制出腳本的情況,這時(shí)就需要使用Port Mapping來(lái)指揮VuGen識別端口名和協(xié)議類(lèi)型。
下面我們來(lái)錄制一個(gè)電子郵件收發(fā)的腳本,選擇協(xié)議為SMTP+POP3,如圖3.19所示。

圖3.19 在多協(xié)議情況下添加POP3和SMTP兩個(gè)協(xié)議
我們使用MDaemon搭建了一個(gè)本地電子郵件服務(wù)器,使用郵件的客戶(hù)端為Becky!。在選擇應用窗口中填寫(xiě)Becky!客戶(hù)端的信息,如圖3.20所示。
單擊OK按鈕開(kāi)始錄制,可以看到在客戶(hù)端收發(fā)電子郵件的時(shí)候,Recording中的events一直在變化,如圖3.21所示。


圖3.20 選擇Win32應用添加錄制對象為B2.exe 圖3.21 Rocording Bar
這說(shuō)明VuGen可以識別到該協(xié)議并且將協(xié)議交互截取下來(lái),但是打開(kāi)腳本,就可能會(huì )出現腳本完全沒(méi)有內容的情況,那么這個(gè)時(shí)候需要手動(dòng)幫助VuGen來(lái)進(jìn)行識別協(xié)議內容的工作。
打開(kāi)錄制選項,找到Port Mapping,如圖3.22所示。

圖3.22 Port Mapping主界面
這里需要為POP3和SMTP添加一個(gè)端口規則,讓VuGen強制去錄制這個(gè)端口的協(xié)議內容(搞錯了的話(huà)會(huì )出導致無(wú)錄制內容)。單擊New Entry按鈕添加兩個(gè)端口,設置POP3使用110端口,SMTP使用25端口,如圖3.23所示。
這里的Target Server(目標服務(wù)器)可以進(jìn)行明確設置,也可以默認設置為(Any Server)即任意服務(wù)器,但是端口必須要寫(xiě)明,并且該端口對應的Service ID協(xié)議類(lèi)型也必須選擇正確,錄制方式(Record Type)選擇Direct即可。
同理再添加一個(gè)SMTP的協(xié)議端口,檢查一下端口規則是否正確,如圖3.24所示。
設置完成后,現在再來(lái)錄制一下協(xié)議,即可錄制出來(lái)了(VuGen的版本越高出現錄制錯誤的概率越低,在9.1版本后很少出現這種有Events但是沒(méi)有腳本的情況)。
Http Properties
Advanced:這里可以設置在錄制HTTP過(guò)程中的一些高級選項,如圖3.25所示。

圖3.23 新建Port Mapping規則

圖3.24 新建Port Mapping下的SMTP和POP3規則后

圖3.25 錄制選項下的高級設置
Reset context for each action:錄制中每個(gè)action之間是否需要重置context。context中存放請求發(fā)送返回后的數據信息,比如服務(wù)器返回的html、 cookie、session等。選擇了這個(gè)選項,Action之間會(huì )清空相關(guān)內容,那么基于行為模擬的函數web_link()會(huì )由于沒(méi)有前文而無(wú)法運行,系統自動(dòng)錄制成為基于數據請求的函數web_url()。
Save snapshot resources locally:在本地保存資源截圖。
Generate web_reg_find functions for page titles:是否需要為每一個(gè)頁(yè)面自動(dòng)生成web_reg_find檢查點(diǎn)函數(檢查點(diǎn)函數參考第3.8節)來(lái)檢查標題的變更。選中該選項后,會(huì )自動(dòng)生成對標題的檢查規則,回放腳本時(shí)會(huì )驗證每個(gè)標題是否和錄制時(shí)相同。其中Generate web_reg_find fuctions for sub-frames為子框架生成檢查點(diǎn)函數。由于大多數情況頁(yè)面的標題都是動(dòng)態(tài)的,檢查標題是否不變沒(méi)有太大的意義,所以這個(gè)選項一般不做選擇。
Add comment to script for HTTP errors while recording:錄制過(guò)程中如果出錯則添加相關(guān)的注釋內容。
Support charset:很多時(shí)候我們訪(fǎng)問(wèn)的網(wǎng)站都是中文的,使用VuGen錄制時(shí)經(jīng)常會(huì )遇到中文變成亂碼的事情,這是由于中文網(wǎng)站一般都是使用UTF-8的編碼方式來(lái)顯示中文的,這時(shí)就需要讓VuGen也支持該編碼格式。打開(kāi)這個(gè)選項,確保UTF-8可用,再錄制一下腳本,中文亂碼的問(wèn)題就會(huì )解決了。如果網(wǎng)站使用的是非UTF-8的編碼規則,那么就不要選擇該選項,否則也會(huì )導致亂碼??梢酝ㄟ^(guò)使用HttpWatch掃描網(wǎng)站來(lái)確認頁(yè)面是否采用了UTF-8的編碼方式。
Recording Engine:這是一個(gè)兼容性的選項,可以使用以前的錄制引擎來(lái)錄制腳本,注意選擇該選項后需要重新啟動(dòng)VuGen,新建腳本才能切換到老的引擎上。
Recording schemes:這里可以對錄制的內容進(jìn)行過(guò)濾。
Headers:可以錄制服務(wù)器返回HTTP請求包中的數據包頭,如圖3.26所示。
在默認情況下是不錄制HTTP Header的,如果有些數據存放在Header中,那么在這里就可以設置需要錄制那些內容,如圖3.27所示。


圖3.26 設置是否錄制HTTP headers 圖3.27 設置錄制的HTTP headers種類(lèi)
比如這里需要錄制服務(wù)器返回的Encoding編碼信息,選中Accept-Encoding并單擊OK按鈕確認(HTTP header的含義參考前面的HTTP分析)即可。錄制的結果可以發(fā)現腳本中附加了web_add_header()函數。
Content Types:對于錄制的正文內容進(jìn)行過(guò)濾,如圖3.28所示。

圖3.28 設置是否錄制HTTP content
在默認情況下所有的正文內容都會(huì )被錄制下來(lái),如果不需要錄制圖片等內容,可以在下面的規則中過(guò)濾掉多余的內容,如圖3.29所示。
Non-Resources:設置需要錄制的請求格式,如圖3.30所示。


圖3.29 設置錄制的HTTP content類(lèi)別 圖3.30 設置那些文件格式作為Non-Resurce處理
這里需要分析一下VuGen根據什么原理錄制出來(lái) web_url()這種請求,其實(shí)它是根據HTTP請求中的返回格式來(lái)確定的。在默認情況下,VuGen認為text/html這種返回格式的內容是非資源的正文,需要錄制出來(lái),如果你希望將其他格式的請求也單獨作為web_url()來(lái)進(jìn)行錄制,那么在這里應添加對應的Content Type。例如添加image/gif,那么再次錄制腳本時(shí)就會(huì )發(fā)現,所有的gif圖片請求都被作為一個(gè)單獨的web_url()函數進(jìn)行處理。各種 HTTP請求的文件類(lèi)型可以先通過(guò)HttpWatch進(jìn)行掃描確定,如圖3.31所示。
Correlation:是否打開(kāi)腳本錄制時(shí)的自動(dòng)關(guān)聯(lián)選項,如圖3.32所示。


圖3.31 通過(guò)HttpWatch獲得HTTP返回請求的文件類(lèi)型 圖3.32 邊錄制邊進(jìn)行關(guān)聯(lián)設置
如果不是很清楚這個(gè)功能請先取消選擇,否則可能會(huì )導致在錄制過(guò)程中VuGen錯誤自動(dòng)關(guān)聯(lián),導致腳本回放直接失敗。我們將會(huì )在后面介紹關(guān)聯(lián)時(shí)再來(lái)研究它。
當設置好錄制選項后,單擊OK按鈕啟動(dòng)錄制。
首先看到的是Recording Bar,如圖3.33所示。稍后會(huì )看到IE或者指定的應用程序啟動(dòng),當進(jìn)行操作時(shí)Events也會(huì )隨之變化,說(shuō)明VuGen錄制得到了一些協(xié)議交互的內容。

圖3.33 Recording Bar
在錄制前需要根據需求確定需要錄制的用戶(hù)行為,而錄制后需要通過(guò)后面的設置來(lái)將腳本設置為完全模擬用戶(hù)行為的Vuser Script。
在錄制的過(guò)程中可以通過(guò)Recording Bar添加一些命令。例如可以切分腳本,將錄制的內容存放在不同的腳本塊中,也可以添加事務(wù)的開(kāi)始點(diǎn)和結束點(diǎn),還可以添加集合點(diǎn)和注釋。
當錄制結束后,單擊Stop按鈕,或者使用Ctrl+F5組合鍵停止錄制,所有客戶(hù)端和服務(wù)器交互協(xié)議會(huì )被放在Generation Log內,VuGen隨后會(huì )對協(xié)議交互進(jìn)行分析,最終生成腳本。
錄制完成后,可以在Recording Log中查看相關(guān)錄制信息,如圖3.34所示。而錄制中的events條數就是Recording Log中的信息行數。

圖3.34 Recording Log錄制日志內容
VuGen能支持多種協(xié)議,其關(guān)鍵就在于日志中的開(kāi)頭。
[Network Analyzer (25bc:2bb0)] -------------------------------------------
[Network Analyzer (25bc:2bb0)] Load Network Traffic Analyzers:
[Network Analyzer (25bc:2bb0)] Analyzer Module: WPLUS (value=)
[Network Analyzer (25bc:2bb0)] Analyzer Module: WebBase (value=GetHttp ProtocolAnalyzer:api_http_filter.dll)
[Network Analyzer (25bc:2bb0)] + Network Analyzer: api_http_filter.dll @ GetHttpProtocolAnalyzer Loaded!
[Network Analyzer (25bc:2bb0)] + Interception Auditors: WinInetWplus InterceptionAudit:api_http_filter.dll
[Network Analyzer (25bc:2bb0)] Analyzer Module: QTWeb (value=)
[Network Analyzer (25bc:2bb0)] Analyzer Module: local_server (value=)
[Network Analyzer (25bc:2bb0)] ----------------------------------------
在這段日志中可以看到,對HTTP的解析是通過(guò)api_http_filter.dll庫文件實(shí)現的。VuGen通過(guò)類(lèi)似于插件的形式來(lái)完成對多種協(xié)議的支持,只要有這類(lèi)的dll文件,就可以完成對該類(lèi)協(xié)議的錄制。
另一方面錄制得到的所有客戶(hù)端請求和服務(wù)器返回信息將會(huì )保存在Generation Log中,如圖3.35所示。
錄制得到的VuGen腳本就是通過(guò)Generation Log生成的。如果錄制結束時(shí)出錯或者錯誤修改后,想回到最初的狀態(tài),那么可以使用Tools菜單下的Regenerator Script功能來(lái)重新生成腳本。

圖3.35 Generation Log請求日志內容
腳本生成后可以單擊菜單欄上的Run按鈕也可直接按F5鍵回放腳本,如圖3.36所示。
運行前也可以通過(guò)Shift+F5組合鍵檢查腳本的語(yǔ)法規則,對腳本進(jìn)行編譯。
回放中可以在Replay Log日志欄中看到腳本執行的日志信息,當腳本回放完成后,如何驗證回放結果呢?
這里可以打開(kāi)View菜單下的Test Results,如圖3.37所示。


圖3.36 工具條上的執行按鈕 圖3.37 Test Results測試結果報告
在這個(gè)測試結果報告中,可以得到整個(gè)腳本回放的記錄,還有相關(guān)截圖,Passed狀態(tài)說(shuō)明腳本運行正常,得到了服務(wù)器的反饋。
Passed并不能說(shuō)明腳本完成了相關(guān)操作,只能說(shuō)明服務(wù)器端正確接收到了客戶(hù)端的請求并且返回了相應的數據,但是并不代表操作在邏輯上是正確的。
錄制錯誤
1.錄制本機WebTours或錄制本地網(wǎng)站無(wú)法打開(kāi)
當使用Vista或者Windows 2008操作系統時(shí),會(huì )出現該問(wèn)題。這是由于在本地Windows\System32\drivers\etc\host文件中多了下面這行內容:
::1 localhost
將其刪除后即可恢復正常。
2.錄制網(wǎng)頁(yè)時(shí),瀏覽器剛打開(kāi)就自動(dòng)關(guān)閉,或者瀏覽器無(wú)響應
這是由于在IE中打開(kāi)了第三方插件支持導致的,一般安裝了QTP會(huì )出現這個(gè)問(wèn)題。只需要打開(kāi)IE的屬性菜單,找到高級選項,將其中的第三方插件支持關(guān)閉即可。
3.開(kāi)始錄制時(shí)瀏覽器出現錯誤
這個(gè)問(wèn)題一般是由于系統安裝的問(wèn)題或IE版本不兼容導致的。VuGen 9.1最高兼容IE 7.0。
4.錄制網(wǎng)頁(yè)操作后沒(méi)有任何腳本
VuGen錄制只支持IE,對于第三方的瀏覽器不能很好地兼容。
5.錄制本機頁(yè)面可以打開(kāi)但是沒(méi)有錄制到任何Events
在錄制時(shí)請求的地址為127.0.0.1或Localhost時(shí),偶爾會(huì )出現該問(wèn)題,換成系統真實(shí)IP地址即可。
6.錄制的時(shí)候總是提示無(wú)法訪(fǎng)問(wèn)服務(wù)器
可以考慮檢查一下IE的代理服務(wù)器設置。在Load Runner 8.x中經(jīng)常會(huì )出現VuGen中的代理設置自動(dòng)覆蓋IE 7.0的現象。
回放錯誤
在某些情況下,回放腳本會(huì )遇到失敗的情況,一般導致腳本回放失敗的原因無(wú)非以下幾種:
1.腳本中的數據存在動(dòng)態(tài)部分
例如腳本是訪(fǎng)問(wèn)一個(gè)圖片,但是再次回放的時(shí)候該圖片已經(jīng)在服務(wù)器上被刪除了,那么腳本回放時(shí)自然就會(huì )出現錯誤,提示該對象無(wú)法找到。解決方法是修改代碼,刪除無(wú)用的對象,或者通過(guò)關(guān)聯(lián)處理動(dòng)態(tài)數據。
2.腳本沒(méi)有錄制到所有的協(xié)議請求
當系統使用多種協(xié)議時(shí),如果我們選擇的錄制協(xié)議沒(méi)有全部包含,就會(huì )出現漏錄請求的情況,而在回放時(shí)由于缺乏部分請求的模擬,就會(huì )導致后續的請求內容被服務(wù)器拒絕,自然就會(huì )出現回放失敗的情況。解決方法是通過(guò)分析確認系統協(xié)議,確保所有請求被錄制。
3.系統存在問(wèn)題
從某些角度來(lái)說(shuō),VuGen是一種基于協(xié)議的木馬,可能會(huì )被部分殺毒軟件或防火墻干擾和影響,導致無(wú)法正常訪(fǎng)問(wèn)服務(wù)器。解決方法是在錄制時(shí)關(guān)閉不必要的防火墻和殺毒軟件。
4.腳本中添加了不合適的關(guān)聯(lián)或檢查點(diǎn)函數
在錄制選項中打開(kāi)了自動(dòng)錄制關(guān)聯(lián)規則后,錄制出來(lái)的腳本會(huì )自動(dòng)添加符合規則的關(guān)聯(lián)函數,而如果在回放時(shí)關(guān)聯(lián)函數無(wú)法捕獲到符合規則的目標則會(huì )提示錯誤。解決方法建議在深入了解關(guān)聯(lián)后再啟用該功能。對于檢查點(diǎn)函數,關(guān)閉Fail功能即可。
5.服務(wù)器連接錯誤
服務(wù)器無(wú)法連接,導致腳本回放失敗。
一般來(lái)說(shuō)回放錯誤可以通過(guò)日志或者Test Results中的截圖定位,當有一定的代碼調試能力后,就能夠輕松解決。
聯(lián)系客服