VU——用戶行為的模擬器2
LoadRunner之所以強大,很大原因是VU的功能強大。VU幾乎支持模擬當今所有主流的軟件客戶端,同時還在不斷地推陳出新,每個Vuser腳本的設置也是非常繁多和詳細的,達到了精確模擬的效果
了解熟悉VU是玩轉LoadRunner要做的第一件事情,最常聽到的關于VU的描述就是VU通過運行VU腳本模擬了用戶對軟件操作行為
VU是基于網絡協議的,被測服務器是通過各種各樣的網絡協議與客戶端打交道的。VU要“騙過”被測服務器,當然就要遵守這些協議,按規矩、步驟來動作,否則就會吃“閉門羹”,毫不留情地被服務器拒絕
VU錄制生成的也是網絡協議層次的腳本,在回放時,VU將按照錄制下來的網絡協議,一一重放,基于網絡協議腳本的好處是,可以使用相對少的硬件資源,來生成大量的虛擬用戶負載。相比之下,WinRunner和QTP的腳本是基于界面事件GUI的,它在一臺主機上同時只能運行一個虛擬用戶的腳本,因為一個虛擬用戶會占用整個主機的資源。
推論一,VU不關心用戶在界面上發生的事情
推論二,VU中的操作關聯與界面上的操作關聯是不一致的
如用客戶查詢系統,查詢出此客戶
1、點擊這個客戶,打開另外一個頁面,展現此客戶的基本信息
2、點擊基本信息中的“交易歷史明細”,系統經過查詢后,刷新此頁面,顯示明細結果
3、顯示,在UI測試中,要測試第三步驟,之前必須完成第一步和第二步,但在VU中就不是這樣
這三個操作被VU記錄成三個函數,如果是上下文無關的函數,其實完全可以忽略掉第一和第二個函數,只執行和參數化第三個函數
錄制腳本
VU通過錄制用戶在客戶端軟件的操作直接生成腳本,用戶的每個協議級的操作以LoadRunner的API函數方式記錄在腳本里。回放腳本的時候,通過執行API函數來模擬最初用戶的操作動作
選擇協議
LoadRunner具體有哪些協議,Vuser類型可根據應用領域分為下列幾種:
應用程序部署解決方案:Citrix ICA
客戶端/服務器:MS SQL Server、Oracle(2層)、Sybase Ctlib等協議
自定義:C模版、Java模版、JavaScript類型的腳本
分布式組件:適用于COM/DCOM、Corba-Java和Rmi-Java協議
電子商務:FTP、Web(HTTP/HTML)、SOAP等協議
流數據:Media Player(MMS)和Real協議
無線:i-Mode、VoiceXML和WAP協議
新建Vuser,彈出協議選擇對話框
兩種協議選擇方式:單協議模式和多協議模式
單協議模式
用戶以單協議錄制時,VU只錄制在既定協議上的用戶操作,在VU中我們可以使用單協議模式選擇任何一種協議
多協議模式
用戶以多協議錄制時,VU錄制幾個協議上的操作,不是任意的協議都可以組合成多協議模式。有以下協議支持多協議錄制:COM、FTP、IMAP、Oracle NCA、POP3、Real Player、Windows Socket(raw)、SMTP和web。雙協議Web/Win Socket應該被看作單協議,因為其機制與多協議不一樣
不同類型的Vuser的另外一個區別是多Action的支持,一些協議支持多Action,目前這些協議是:Oracle NCA、Web、RTE、general C、WAP、I-Mode和voice XML
規劃腳本結構
在錄制時,用戶可以選擇哪些操作生成腳本在vuser_init、Action和vuser_end中,同時,也可以在錄制時隨時加入transaction的定義、注釋和同步點
HTTP Vuser 中的 URLmode 和 HTML mode
“URL-based script”說明腳本中的表示采用基于URL的方式,所有的HTTP的請求都會被錄制下來,單獨生成函數,所以URL模式生成的腳本會顯得有些雜亂
選擇HTML還是URL錄制
(1)基于瀏覽器的應用程序推薦使用 HTML-based script
(2)不是基于瀏覽器的應用程序推薦使用URL-based script
(3)如果基于瀏覽器的應用程序中包含了JavaScript并且該腳本向服務器產生了請求,比如DataGrid的分頁按鈕等,也要使用URL-based script方式錄制
(4)基于瀏覽器的應用程序中使用了HTTPS安全協議,使用URL-based script方式錄制
查看日志
在錄制和回放的時候,VU會分別把發生的事件記錄成日志文件,這些日志有利于跟蹤VU和服務器的交互過程。可以通過VU輸出窗口觀察日志,也可以到腳本目錄中直接查看文件
1、執行日志
腳本運行時的輸出都記在Log里
“輸出”窗口的“執行日志”顯示的消息用于描述Vuser運行時執行的操作。該信息可說明在方案中執行腳本時,該腳本的運行方式
腳本執行完成后,可以檢查“執行日志”中的消息,以查看腳本在運行時是否發生錯誤
“執行日志”中使用了不同顏色的文本
黑色:標準輸出消息
紅色:標準錯誤消息
綠色:用引號括起來的文字字符串(例如URL)
藍色:事務信息(開始、結束、狀態和持續時間)
如雙擊以操作名開始的行,光標將會跳到生成的腳本中的相應步驟上
執行日志是我們調試腳本時最有用的信息
錄制日志
當錄制腳本時,Vugen會攔截Client端(瀏覽器)與Server端(服務器)之間的對話,并且通通記錄下來,產生腳本。
腳本和Recording Log最大的差別在于,腳本只記錄了Client端要對Server端所說的話,而Recording Log則是完整記錄二者的對話,因此通過錄制日志,能夠更加清楚地看到客戶端與服務器的交互,對我們開發和debug腳本非常有幫助
產生日志
產生日志記錄了腳本錄制的設置、網絡事件到腳本函數的轉化過程
回放腳本
單擊run按鈕,或按快捷鍵“F5”就可以運行腳本
關聯
錄制好的腳本回放能否成功時,首先想到第一個可能出現的問題—關聯
關聯是LoadRunner中一個重要的應用,也是經常犯錯誤的地方
如果腳本需要關聯(Correlation),在還沒做之前是不會執行通過,也就是會有錯誤信息發生,會出現什么錯誤信息,與系統實際的錯誤處理機制有關,錯誤信息有可能會提醒您要重新輸入,但是也有可能直接就顯示HTTP404的錯誤信息,這種問題在任何系統中都是非常常見的問題
服務器返回給客戶端一些動態變化的值,客戶端使用這些值訪問服務器的時候,不能把這些值寫死在腳本里面,而應該存放在一個變量里面。這就是關聯的概念
VU為我們提供了三種關聯機制
錄制前Correlation(關聯)
服務器就像一個“飯店”,而客戶端就像“拿著小票領飯的食客”。如果在進飯店之前,已經預先知道小票的樣子,那么這時就可以啟用錄制前關聯了,錄制前關聯又叫做規則關聯。使用錄制前關聯的必要條件是必須在錄制腳本之前就知道哪些變量是需要關聯的
規則來源有兩種:
(1)內建關聯規則
Vugen已經針對常用的一些應用系統,如mySAP、Oracle、Siebel等內建關聯規則,這些應用系統可能會有一種以上的關聯規則
(2)使用者自訂關聯規則
除了內建的關聯規則之外,使用者也可以自訂關聯規則
規則的應用
(1)啟用自動關聯(auto-correlation)
點選Vugen的“Tools”>“Recording Options”,打開“Recording Options”對話框,選取“HTTP Properties” >“Correlation”,勾選“Enable correlation during recording”,以啟用自動關聯
(2)運行腳本驗證關聯機制
當關聯規則都運行開始錄制腳本時,在錄制過程中,當Vugen偵測到符合關聯規則的數據時,會依照設定建立關聯
錄制后關聯
有別于內建關聯,錄制后關聯則是在執行腳本后才會建立關聯,當錄制完腳本后,腳本至少需要被執行過一次,錄制后關聯才會座椅。錄制后關聯會嘗試找出錄制時與執行時,服務器響應內容的差異部分,找出需要關聯的數據,并建立關聯
有時可能有些需要做關聯的動態數據,連自動關聯都無法偵測出來,這時就需要手動關聯
手動關聯
錄制前關聯和錄制后關聯都屬于自動關聯范疇,一般靠自動關聯能夠解決腳本中大多數的關聯問題,但是萬一它們都不能起作用的話,那只能采用手動關聯方法了。手動關聯的原理與自動關聯一樣,就是找出哪些變量是需要關聯的,然后用LoadRunner提供的web_reg_save_parame來實現關聯
手動關聯的執行過程
1、使用相同的業務流程與數據,錄制兩份腳本
2、使用WinDiff工具協助找出需要關聯的數據
WinDiff是內嵌在VU中的一個文件比較工具,用于比較兩個文件的內容,在這里用它來比較兩個腳本的不同之處,從而找到需要被關聯的數據
3、確定被關聯數據的左、右邊界
4、使用web_reg_save_param函數手動建立 關聯
5、將腳本中有用到關聯的數據,以參數取代
關聯的用途和意義:
1、簡化和優化腳本代碼
2、動態產生數據
3、支持唯一數據
有些系統要求使用唯一的數據,錄制時生成的數據,在回放時就重復了,無法保持唯一,也將不可用
手動關聯實現原理
1、捕獲第一個操作的輸出
需要知道哪個值需要關聯的,可以用wdiff去對比兩個錄制同樣操作的腳本,其中不同的地方可能就是需要關聯的
2、保存為參數
3、將參數化傳遞到另外一個操作的輸入
把另外一個操作中的常數,替換成參數變量
腳本視圖和樹視圖
VU提供兩種視圖來查看腳本的內容,一個是腳本視圖,另一個是基于圖標的樹視圖,所有類型的Vuser都有文本腳本視圖,但是只有特定的Vuser才會有樹視圖
樹視圖(Tree View)
TreeView也叫做基于icon的View,也就是說,腳本的每個函數在Tree View中都以一個帶有icon的節點來代替。
TreeView的好處是使用戶方便地修改腳本,TreeView支持拖拽,可以把任意一個節點拖拽到他想要的地方,從而達到修改腳本的目的。用戶可以右鍵單擊節點,進行修改/刪除當前函數參數屬性,增加函數等操作,通過TreeView能夠增加LoadRunner提供的部分常用通用函數和協議相關函數。如WebServiceVuser就不能通過TreeView參數化一些復雜的數據類型,這種情況下,就需要ScriptView
腳本視圖(Script View)
在ScriptView中能夠看到一行行的API函數,ScriptView合適一些高級用戶,通過ScriptView向腳本中增加一些其他API函數
理解Snapshot
Snapshot——快照,代表當前的step,Snapshot顯示了客戶端在執行完當前step后的樣子
Snapshot有兩種生成方式
一種是在record的時候生成,另一種是在replay的時候生成。可以對比兩種方式生成的Snapshot,以發現哪些是動態值,需要參數化
Transaction(事務)
事務是計算機程序設計中一個很重要的概念。
一個事務應該具有原子性、一致性、隔離性和持久性
在LoadRunner里,定義事務主要是為了度量服務器的性能。每個事務度量服務器響應指定的Vuser請求所用的時間,這些請求可以是簡單的任務,也可以是復雜的任務
手工插入Transaction函數分為“顯示事務”和“隱式事務”的機制,在VU的Run-time Settrings中又成為“自動事務”
在Run-time Settrings中,在Miscellaneous選項卡的Automatic Transaction中定義自動事務
可以設置LoadRunner直接按事務處理Vuser中的每個Action或step。Action指的是vuser_init、Action和vuser_end三大函數,而step指的是LoadRunner執行的每個函數,LoadRunner將Action名或step名指定為事務名,默認情況下,將啟用按Action使用自動事務的功能
Rendezvous Point(同步點)
在系統上模擬較重的用戶負載,需要同步各個Vuser以便在同一時刻執行任務,通過創建集合點,可以確保多個Vuser同時執行操作。當某個Vuser到達該集合點時,Controller會將其保留,直到參與該集合的全部Vuser都到達。當滿足集合條件時,Controller將釋放Vuser
可以通過將集合點插入到Vuser腳本中來指定會合位置
ThinkTime(思考時間)
用戶在執行兩個連續操作期間等待的時間稱為“思考時間”
Vuser使用lr_think_time函數模擬用戶思考時間,錄制Vuser腳本時,Vugen將錄制實際的思考時間并將相應的lr_think_time語句插入到Vuser腳本。可以編輯已錄制的lr_think_time語句,且可以向Vuser腳本中手動添加更多的lr_think_time語句
數據驅動—參數化
數據驅動就是把測試腳本和測試數據分離開來的一種思想,腳本體現測試流程,數據體現測試案例。LoadRunner的參數化功能是數據驅動測試思想的一個重要實現。
為什么需要參數化
在錄制程序運行的過程中,Vugen(腳本生成器)自動生成了腳本以及錄制過程中實際用到的數據,在這個時候,腳本和數據是混在一起的
客戶希望當用LoadRunner多用戶多循環運行時,不只是重復一個用戶的登錄,此函數中的數據要能變化,這樣,就把某些數據用一個參數來代替,就是把常量變成變量
參數化是學習LoadRunner中經常用到的功能,除了實現數據驅動之外,參數化腳本還有以下兩個優點
1、可以使腳本的長度變短
2、可以增強腳本的可讀性和可維護性
實際上,參數化的過程如下:
1、在腳本中用參數取代常量值
2、設置參數的屬性以及數據源
參數的創建
LoadRunner對腳本中參數個數沒有限制,可以在一個腳本中創建任意多個參數。VU可以通過Tree View和Script View兩種途徑來改變腳本,包括參數化功能
參數的類型,在定義參數屬性的時候,要指定參數值的數據源。可以指定下列數據源類型中的任何一種
1、Data Files
這是最常使用的一種參數類型,它的數據存在于文件中。該文件的內容可以手工添加,也可以利用LoadRunner 的 Data Wizard從數據庫中導出
2、User-Defined Functions
調用外部DLL函數生成的數據
3、Internal Data
模擬用戶內部產生的數據
Internal Data包括以下幾種類型
Date/Time用當前的日期/時間替換參數。要指定一個Date/Time格式,可以從菜單列表中選擇格式,或者指定自己的格式。這種格式應該和腳本中錄制的Date/Time格式保持一致
Group Name用虛擬用戶組名稱替換參數。在創建scenario的時候,可以指定虛擬用戶組的名稱。注:從VU運行腳本的時候,虛擬用戶組名稱總是None
Load Generator Name用腳本負載生成器的名稱替換參數。負載生成器是虛擬用戶在運行的計算機
Iteration Number用當前的迭代數據替代參數
Random Number 用一個隨機數替換參數。通過指定最大值和最小值來設置隨機數的范圍
Unique Number用一個唯一的數字來替換參數,可以指定一個起始數字和一個快的大小
Vuser ID用分配給虛擬用戶的ID替換參數,ID是由LoadRunner的控制器在scenario運行時生成的。如果從腳本生成器運行腳本的話,虛擬用戶的ID總是-1
定義參數的屬性
參數的屬性定義就是在腳本執行過程中,定義參數使用的數據源
1、可以在基于文本的腳本視圖中定義參數屬性
2、也可以在基于圖標的樹視圖中定義參數屬性
使用參數列表可以在任意時刻查看所有的參數、創建新的參數、刪除參數,或者修改已存在的參數的屬性
數據文件包含者腳本執行過程中虛擬用戶訪問的數據,局部和全局文件中都可以存儲數據。
如果使用文件作為參數的數據源,必須指定以下內容:文件的名稱和位置、包含數據的列、文件格式、包括列的分隔符、更新方法
1、順序(Sequential):該方法順序地給虛擬用戶分配參數值
2、隨機(Random):該方法在每次迭代的機會從數據表中隨機取一行的數據
3、唯一(Unique):該方法分配一個唯一的有順序的值給每個虛擬用戶的參數
4、與以前定義的參數取同一行(Same Line As ):該方法從與以前定義過的參數中同樣的一行分配數據,但必須指定包含有該數據的列。注:至少其中的一個參數必須是Sequential、Random或者Unique
高級—從已存在的數據庫中導入參數數據
LoadRunner允許利用參數化從已經存在的數據庫中導入數據
1、使用Micorosoft Query(在系統上先安裝MS Query)
2、指定數據庫連接字符串和SQL語句
用戶腳本生成器在數據庫中導入數據的過程中提供了一個向導。在想到中,指明如何導入數據——通過MS Query創建查詢語句或者直接寫SQL語句
檢查點(Check point)
LoadRunner的很多API函數的返回值會改變腳本運行結果。如:web_find函數,如果它查找匹配的結果為空,它的返回值就是LR_FALL,整個腳本的運行結果也將置為FALL,反之,查找匹配成功,則web_find返回值是LR_PASS,整個腳本的運行結果置為PASS。腳本的結果則反應在Controller的狀態面板上和Analysis統計結果中
僅僅通過腳本函數執行結果來決定整個腳本的成功/失敗,這太草率了,因為腳本往往是在執行一個業務流程,VU腳本函數本身就是協議級的,它執行的失敗會引起整個業務的失敗,但它運行成功卻未必意味著業務會成功
檢查點,并不是一個LoadRunner里專有的概念。在WinRunner和QTP中就有檢查點,對于自動化測試來講,檢查點是一個很重要的功能,它的作用是驗證程序的運行結果是否與預期結果相符
web_find和web_reg_find函數兩者有一些差別
1、web_reg_find先注冊的優勢是腳本能夠一邊接受Server的數據緩沖,一邊進行查找,提高了查找的效率
2、web_reg_find的參數與web_find并不完全一樣,其中有個參數叫做SaveCount,它能夠記錄查找匹配的次數。而web_find的機制是一旦查找匹配成功,就立即返回,并不繼續查找和記錄匹配次數
3、VU run time設置“enable image and text check”對web_find有效,而對 web_reg_find無效
檢查點設置技巧
如何加入檢查點,才能檢查出正確的結果。與事實相符,這的確有一些技巧:
1、它必須滿足是驗證事務通過與否的充分必要條件。檢查點通過,我們就能夠確信系統是一個正常的狀態
2、檢查點可以是常量,也可以是變量
3、檢查點可以是文本、圖像文件,也可以是數據庫記錄等
高級——多Action
對于支持多Action的Vuser,可以把一個腳本的Action import到另外一個腳本中。必須要保證這兩個import的腳本Vuser類型是相同的。注意,被import的Action中的有關參數也要一同被improt。選擇被import的腳本,然后選擇被import的Action
1、迭代次數:LoadRunner將按指定的次數重復執行所有Actions,但不會重復Vuser腳本的vuser_init和vuser_end部分
需要注意的是,如果在Controller的計劃設置中指定方案持續時間,則持續時間設置將覆蓋Vuser迭代設置。意味著,如果將持續時間設置為5分鐘(默認設置),Vuser將在5分鐘內按照需要繼續運行任意多次迭代,即使運行時設置僅指定一次迭代
2、操作塊:是腳本內函數的組合,每個塊都有自己的單獨屬性設置,包括順序、迭代和權重。可以通過單擊“Properties”設置Block的屬性
3、順序:可以設置塊內腳本的操作順序。有兩種方式:按順序和隨機執行操作
4、迭代:除了為整個Run部分設置迭代次數以外,還可以設置單個操作或操作塊的迭代。讀設置非常有用,例如 可以用模擬一個商業站點,你在該站點執行了多個查詢查找某個產品,但只進行一次采購
高級——腳本錯誤處理機制
一個好的腳本應該具有健壯性,要能夠捕捉到錯誤,并能采取有效的錯誤處理方式,否則腳本一旦發生錯誤,唯一的出路就是退出執行
VU提供了一套在出錯情況下的腳本處理機制。VU的錯誤處理機制可設定Vuser在執行腳本時遇到錯誤怎樣處理。當Vuser遇到錯誤時,可以有兩種處理策略:一是停止執行腳本,這適用于嚴重的問題。第二種是忽略這個錯誤,繼續執行下去。
使用lr_continue_on_error函數。通過lr_continue_on_error函數可以控制Vuser腳本特定段的錯誤處理,標記就用lr_continue_on_error(1)和lr_continue_on_error(0)語句將其括起來
使用lr_continue_on_error函數的腳本段將會覆蓋“出現錯誤時仍繼續”的Run-time Settings運行時設置
高級——腳本調試技巧
解釋性語言的調試一直是個棘手的問題,如果沒有專門的debug工具,只能通過加入變量輸出語句來查看每個變量值的變化,下面是兩種比較常用的調試腳本的方式,并不是真正意義上的調試
動態運行與非動態運行
腳本可以設置為Animated運行模式和非Animated運行模式,
在Animated運行模式下,VU會顯亮當前正在執行的腳本語句。可以通過VU設置語句執行的延遲時間,以便觀察每行代碼執行的效果
在非Animated運行模式下,VU在執行腳本時不會顯亮語句,而直接執行下去。顯然,Animated運行模式是我們調試腳本的一個很好的方法
日志設置
對于軟件開發人員來講,日志無疑是跟蹤和調試最好的線索
1、僅在出錯時發送消息:指示Vugen僅當出錯時記錄log
2、標準日志:創建在腳本執行期間所發送的函數和消息的標準日志,供調試時使用。大型負載測試方案應禁用該選項
3、擴展日志:創建擴展日志,包括警告和其他消息。大型負載測試方案禁用該選項
可以使用“擴展日志”選項指定應向擴展日志中添加哪些其他信息:
參數替換:選擇該選項可記錄指定給腳本的所有參數及其相應的值
服務器返回的數據:選擇該選項可記錄服務器返回的所有數據
高級跟蹤:選擇該選項可記錄Vuser在會話期間發送的所有函數和消息。調試Vuser腳本時,該選項非常有用
VU腳本運行成功后,可以創建Controller場景并運行場景