測試對象
LoadRunner的測試對象是整個企業的系統,它通過模拟實際用戶的操作行為和實行實時性能監測,來幫助您更快地查找和發現問題。此外,LoadRunner能支持廣泛的協議和技術,為您的特殊環境提供特殊的解決方案。
工具原理
代理(Proxy)是客戶端和服務器端之間的中介人,LoadRunner就是通過代理方式截獲客戶端和服務器之間交互的數據流。
1)虛拟用戶腳本生成器通過代理方式接收客戶端發送的數據包,記錄并将其轉發給服務器端;接收到從服務器端返回的數據流,記錄并返回給客戶端。
這樣服務器端和客戶端都以為在一個真實運行環境中,虛拟腳本生成器能通過這種方式截獲數據流;虛拟用戶腳本生成器在截獲數據流後對其進行了協議層上的處理,最終用腳本函數将數據流交互過程體現為我們容易看懂的腳本語句。
2)壓力生成器則是根據腳本内容,産生實際的負載,扮演産生負載的角色。
3)用戶代理是運行在負載機上的進程,該進程與産生負載壓力的進程或是線程協作,接受調度系統的命令,調度産生負載壓力的進程或線程。
4)壓力調度是根據用戶的場景要求,設置各種不同腳本的虛拟用戶數量,設置同步點等。
5)監控系統則可以對數據庫、應用服務器、服務器的主要性能計數器進行監控。
6)壓力結果分析工具是輔助測試結果分析。
工具組成
1、虛拟用戶腳本生成器:捕獲最終用戶業務流程和創建自動性能測試腳本,即我們在以後說的産生測試腳本;
2、壓力産生器:通過運行虛拟用戶産生實際的負載;
3、用戶代理:協調不同負載機上虛拟用戶,産生步調一緻的虛拟用戶;
4、壓力調度:根據用戶對場景的設置,設置不同腳本的虛拟用戶數量;
5、監視系統:監控主要的性能計數器;
6、壓力結果分析工具:本身不能代替分析人員,但是可以輔助測試結果的分析。
主要功能
虛拟用戶
使用LoadRunner的VirtualUserGenerator,您能很簡便地創立起系統負載。該引擎能夠生成虛拟用戶,以虛拟用戶的方式模拟真實用戶的業務操作行為。它先記錄下業務流程(如下訂單或機票預定),然後将其轉化為測試腳本。利用虛拟用戶,您可以在Windows,UNIX或Linux機器上同時産生成千上萬個用戶訪問。所以LoadRunner能極大的減少負載測試所需的硬件和人力資源。
用VirtualUserGenerator建立測試腳本後,您可以對其進行參數化操作,這一操作能讓您利用幾套不同的實際發生數據來測試您的應用程序,從而反映出本系統的負載能力。以一個訂單輸入過程為例,參數化操作可将記錄中的固定數據,如訂單号和客戶名稱,由可變值來代替。在這些變量内随意輸入可能的訂單号和客戶名,來匹配多個實際用戶的操作行為。
真實負載
Virtualusers建立起後,您需要設定您的負載方案,業務流程組合和虛拟用戶數量。用LoadRunner的Controller,您能很快組織起多用戶的測試方案。Controller的Rendezvous功能提供一個互動的環境,在其中您既能建立起持續且循環的負載,又能管理和驅動負載測試方案。
而且,您可以利用它的日程計劃服務來定義用戶在什麼時候訪問系統以産生負載。這樣,您就能将測試過程自動化。同樣您還可以用Controller來限定您的負載方案,在這個方案中所有的用戶同時執行一個動作---如登陸到一個庫存應用程序----來模拟峰值負載的情況。另外,您還能監測系統架構中各個組件的性能----包括服務器,數據庫,網絡設備等----來幫助客戶決定系統的配置。
定位性能
LoadRunner内含集成的實時監測器,在負載測試過程的任何時候,您都可以觀察到應用系統的運行性能。這些性能監測器為您實時顯示交易性能數據(如響應時間)和其它系統組件包括applicationserver,webserver,網路設備和數據庫等的實時性能。這樣,您就可以在測試過程中從客戶和服務器的雙方面評估這些系統組件的運行性能,從而更快地發現問題。
利用LoadRunner的ContentCheckTM,您可以判斷負載下的應用程序功能正常與否。ContentCheck在Virtualusers運行時,檢測應用程序的網絡數據包内容,從中确定是否有錯誤内容傳送出去。它的實時浏覽器幫助您從終端用戶角度觀察程序性能狀況。
分析結果
一旦測試完畢後,LoadRunner收集彙總所有的測試數據,并提供高級的分析和報告工具,以便迅速查找到性能問題并追溯原由。使用LoadRunner的Web交易細節監測器,您可以了解到将所有的圖象、框架和文本下載到每一網頁上所需的時間。例如,這個交易細節分析機制能夠分析是否因為一個大尺寸的圖形文件或是第三方的數據組件造成應用系統運行速度減慢。另外,Web交易細節監測器分解用于客戶端、網絡和服務器上端到端的反應時間,便于确認問題,定位查找真正出錯的組件。例如,您可以将網絡延時進行分解,以判斷DNS解析時間,連接服務器或SSL認證所花費的時間。通過使用LoadRunner的分析工具,您能很快地查找到出錯的位置和原因并作出相應的調整。
重複測試
負載測試是一個重複過程。每次處理完一個出錯情況,您都需要對您的應用程序在相同的方案下,再進行一次負載測試。以此檢驗您所做的修正是否改善了運行性能。
LoadRunner完全支持EJB的負載測試。這些基于Java的組件運行在應用服務器上,提供廣泛的應用服務。通過測試這些組件,您可以在應用程序開發的早期就确認并解決可能産生的問題。
利用LoadRunner,您可以很方便地了解系統的性能。它的Controller允許您重複執行與出錯修改前相同的測試方案。它的基于HTML的報告為您提供一個比較性能結果所需的基準,以此衡量在一段時間内,有多大程度的改進并确保應用成功。由于這些報告是基于HTML的文本,您可以将其公布于您公司的内部網上,便于随時查閱。
接下來的文章編者就将輯錄一篇網上的使用LoadRunner®來測試BEA中間件産品文章來與大家分享如何使用LoadRunner進行實際的性能測試。
性能測試
虛拟用戶
LoadRunner使用虛拟用戶(Virtualusers)來模拟實際用戶對業務系統施加壓力。虛拟用戶在一個中央控制器(controllerstation)的監視下工作。
在做一個測試方案時,要做的第一件事就是創建虛拟用戶執行腳本。LoadRunner提供了VirtualUserGenerator來錄制或編輯虛拟用戶腳本。
使用Vugen創建虛拟用戶執行腳本
A.從菜單中選擇運行VirtualUserGenerator:
B.創建一個單協議腳本,選擇協議類型為"Tuxedo7"
C.在彈出的窗口中輸入Tuxedo客戶機程序的可執行文件名(SimpApp.exe),并選擇"RecordintoAction"為Action。
點擊"OK"開始錄制腳本,這時Vugen就會啟動Simpapp.exe,如下圖所示,輸入WSNADDR,輸入字符串(Tuxedoispowerful!)之後,點擊TOUPPER,TUXEDO服務器完成請求後把輸出字符串(TUXEDOISPOWERFUL!)寫到"Outputstring"中,點擊停止錄制按鈕。
D.編輯Vuser腳本。在C中做的所有操作都被錄了下來,記錄到一個腳本文件中,其内容如下,把它存為simpapp。
腳本内容如下:
#include"lrt.h"
#include"replay.vdf"
Actions()
{
lrt_tuxputenv("WSNADDR=//172.22.32.25:7110");
lr_think_time⑶;
tpresult_int=lrt_tpinitialize(LRT_END_OF_PARMS);
lrt_abort_on_error();
data_0=lrt_tpalloc("STRING","",1);
lrt_strcpy(data_0,sbuf_1);
data_1=lrt_tpalloc("STRING","",1);
tpresult_int=lrt_tpcall("TOUPPER",data_0,0,&data_1,&olen,0);
lrt_abort_on_error();
lrt_tpfree(data_0);
lrt_tpfree(data_1);
lrt_tpterm();
return0;
}
代碼中加粗的函數是LoadRunner對TUXEDO函數的二次包裝。
E.點擊工具欄中的"執行"按鈕來執行我們剛才錄制的腳本,确保執行無誤。
使用控制器來調度虛拟用戶
A.從菜單中選擇運行Controller:
B.創建一個新的Scenario,選擇剛才錄制的腳本(simpapp):
點擊"OK",彈出Scenario調度界面。在"Quantity"中輸入100,表示使用100個虛拟用戶。(虛拟用戶與購買的LICENSE有關聯)
C.點擊"EditSchedule"來編輯壓力調度。
D.選擇"Runtimesettings"來作運行時設置。
在Pacing的設置中,"NumberofIterations"用于設置Vusers的Actions被執行的次數;"Startnewiteration"用于設置調度器在什麼時機叠代執行Vusers的Actions。
"ThinkTime"用于設置Vusers的反應和思考時間,以盡量做到和正常人一樣來施壓。"Ignorethinktime"表示忽略思考時間,這是理想狀态,一般不使用。"Asrecorded"表示按照錄制時的實際操作時間。"Multiplyrecordedthinktimeby"表示Vusers的思考時間是實際錄制時間的若幹倍。
在"Miscellaneous"中設置一些雜項,如使用進程還是使用線程等。對于TUXEDO,好象隻能選進程模式。
E.選擇"Startscenario"來開始本次壓力測試調度。
執行結果分析如下:
施壓時間為5分41秒,Vusers數量為100,一共完成的Actions交易數量為5625筆,平均響應時間為5.561秒,TPS為17.8。
測試組件
1.(虛拟用戶生成器)用于捕獲最終用戶業務流程和創建自動性能測試腳本(也稱為虛拟用戶腳本)。
2.Controller(控制器)用于組織、驅動、管理和監控負載測試。
3.Analysis(分析器)有助于您查看、分析和比較性能結果。
實例應用
随機函數
在軟件測試工具中如何巧用LoadRunner的随機函數
LoadRunner有自帶的随機函數,如果巧妙的加以采用,能解決一些看似很困難的實際問題。
一個項目的性能測試。與數據庫直連,根據外部傳入的SQLID和SQL參數,從指定數據庫中讀取SQL模版,拼裝成真實的SQL語句、執行,并将得到的結果放入緩存中。目的是減少數據庫的壓力。
該系統将支撐大量的SQL操作,性能自然成為備受關注的焦點之一。
由于它跟SQL語句相關,在真實環境下,同一時間可能執行着不同類型的SQL,即便是同一類型,其參數也各式各樣。那麼,怎樣才能模拟出最符合實際情況的性能測試場景呢?
首先設計場景,即,在LoadRunner中按照比例随機取到某一類型的SQL,再随機傳入參數給它,讓最終的每條SQL都是随機生成,各不相同。
從場景中,可以看到,此處涉及雙重随機。隻采用loadruner的參數設置是無法實現的。此時需要想辦法先按設定好的比例随機取到SQL,然後在每條SQL上随機取參數列表中的參數。
于是想到了loadrunner的随機函數。先實現随機取SQLID,之後再在特定的SQL中随機取參數列表中的參數。
LoadRunner中,随機函數是rand(),它用來産生0到rand_max之間的随機整數。函數原型是
intrand(void);
然而調用rand之前,必須給随機數産生一個随機種子。這個種子由srand()函數産生。其原型是
intsrand(seedTime);
舉例
采用上述兩個函數,就能實現第一重随機了。具體腳本代碼如下:
通過上面的腳本,實現了性能測試設計的場景。調試通過後,放入Controller中執行。實際執行過程中,Vuser将會按比例随機取到不同類型的SQL,并随機取到SQL中的參數,執行特定的SQL語句。注:sqlid_name是SQLID名稱;random_para是通過file方式實現的随機參數;tn是web_url函數的快照名稱。
巧用LoadRunner的随機函數,能解決不少實際問題。
分析占用率
1.平均事務響應時間
AverageTransactionResponseTime優秀:<2s
良好:2-5s
及格:6-10s
不及格:>10s
2.每秒點擊率
HitsperSecond
當增大系統的壓力(或增加并發用戶數)時,吞吐率和TPS的變化曲線呈大體一緻,則系統基本穩定。若壓力增大時,吞吐率的曲線增加到一定程度後出現變化緩慢,甚至平坦,很可能是網絡出現帶寬瓶頸,同理若點擊率/TPS曲線出現變化緩慢或者平坦,很可能是服務器響應時間增加,觀察服務器資源使用情況,确定是否是服務器問題。
3.請求響應時間
TimetoLastByte
4.每秒系統處理事務數
Transactionpersecond
5.吞吐量
Throughout
6.CPU利用率
Processor/%ProcessorTime好:70%
壞:85%
很差:90%+
7.數據庫操作消耗的CPU時間
Processor/%UserTime如果該值較大,可以考慮是否能通過友好算法等方法降低這個值。如果該服務器是數據庫服務器,Processor%UserTime值大的原因很可能是數據庫的排序或是函數操作消耗了過多的CPU時間,此時可以考慮對數據庫系統進行優化。
8.核心态CPU平均利用率
Processor/%PrivilegedTime如果該參數值和"PhysicalDisk"參數值一直很高,表明I/O有問題。可考慮更換更快的硬盤系統
9.處理隊列中的線程數
Processor/ProcessorQueueLength如果該值保持不變(>=2)個并且%ProcessorTime超過90%,那麼可能存在處理器瓶頸。如果發現超過2,而處理器的利用率卻一直很低,那麼或許更應該去解決處理器阻塞問題,這裡處理器一般不是瓶頸。
10.文件系統緩存
Memory/CacheBytes50%的可用物理内存
11.剩馀的可用内存
Memory/AvaiableMbytes至少要有10%的物理内存值
12.每秒下載頁數
Memory/pages/sec好:無頁交換
壞:CPU每秒10個頁交換
很差:更多的頁交換
13.頁面讀取操作速率
Memory/pageread/sec如果頁面讀取操作速率很低,同時%DiskTime和Avg.DiskQueueLength的值很高,則可能有磁盤瓶徑。但是,如果隊列長度增加的同時頁面讀取速率并未降低,則内存不足。
14.物理磁盤利用率
PhysicalDisk/%DiskTime好:<30%
壞:<40%
很差:<50%+
15.物理磁盤平均磁盤I/O隊列長度
PhysicalDisk/Avg.DiskQueueLength該值應不超過磁盤數的1.5~2倍。要提高性能,可增加磁盤
16.網絡吞吐量
NetworkInterface/BytesTotal/sec判斷網絡連接速度是否是瓶頸,可以用該計數器的值和當前網絡的帶寬,結果應該小于50%
17.數據高速緩存區命中率命中率應大于0.90最好
18.共享區庫緩存區命中率命中率應大于0.99
19.監控SGA中字典緩沖區的命中率命中率應大于0.85
20.檢測回滾段的争用小于1%
21.監控SGA中重做日志緩存區的命中率
應該小于1%
22.監控内存和硬盤的排序比率最好使它小于10%安裝
版本要求
LoadRunner分為Windows版本和Unix版本。如果所有測試環境基于Windows平台,那麼隻要安裝Windows版本即可。
LoadRunner的Unix版本僅提供LoadGenerator組件的安裝(即LoadRunner中的負載生成器)。也就是說,這個負載生成器可以在Unix環境下安裝和運行,并提供給Controller進行遠程管理。但是,腳本的錄制和場景的設計必須在Windows平台完成。
系統要求
運行LoadRunner,内存最好在128M以上,LoadRunner7.8的最低要求。内存最好在512M以上,安裝LoadRunner的磁盤空間至少剩馀500M。操作系統最好為Windows2000。
最新版本
目前(2012年7月)可用的最新版本為:HPLoadRunner11.50
參數對照
LR函數
lr_start_transaction為性能分析标記事務的開始
lr_end_transaction為性能分析标記事務的結束
lr_rendezvous在Vuser腳本中設置集合點
lr_think_time暫停Vuser腳本中命令之間的執行
lr_end_sub_transaction标記子事務的結束以便進行性能分析
lr_end_transaction标記LoadRunner事務的結束
Lr_end_transaction("trans1",Lr_auto);
lr_end_transaction_instance标記事務實例的結束以便進行性能分析
lr_fail_trans_with_error将打開事務的狀态設置為LR_FAIL并發送錯誤消息
lr_get_trans_instance_duration獲取事務實例的持續時間(由它的句柄指定)
lr_get_trans_instance_wasted_time獲取事務實例浪費的時間(由它的句柄指定)
lr_get_transaction_duration獲取事務的持續時間(按事務的名稱)
lr_get_transaction_think_time獲取事務的思考時間(按事務的名稱)
lr_get_transaction_wasted_time獲取事務浪費的時間(按事務的名稱)
lr_resume_transaction繼續收集事務數據以便進行性能分析
lr_resume_transaction_instance繼續收集事務實例數據以便進行性能分析
lr_set_transaction_instance_status設置事務實例的狀态
lr_set_transaction_status設置打開事務的狀态
lr_set_transaction_status_by_name設置事務的狀态
lr_start_sub_transaction标記子事務的開始
lr_start_transaction标記事務的開始
Lr_start_transaction("trans1");
lr_start_transaction_instance啟動嵌套事務(由它的父事務的句柄指定)
lr_stop_transaction停止事務數據的收集
lr_stop_transaction_instance停止事務(由它的句柄指定)數據的收集
lr_wasted_time消除所有打開事務浪費的時間
lr_get_attrib_double檢索腳本命令行中使用的double類型變量
lr_get_attrib_long檢索腳本命令行中使用的long類型變量
lr_get_attrib_string檢索腳本命令行中使用的字符串
lr_user_data_point記錄用戶定義的數據示例
腳本
lr_whoami将有關Vuser腳本的信息返回給Vuser腳本
lr_get_host_name返回執行Vuser腳本的主機名
lr_get_master_host_name返回運行LoadRunnerController的計算機名
lr_eval_string用參數的當前值替換參數
lr_save_string将以NULL結尾的字符串保存到參數中
lr_save_var将變長字符串保存到參數中
lr_save_datetime将當前日期和時間保存到參數中
lr_advance_param前進到下一個可用參數
lr_decrypt解密已編碼的字符串
lr_eval_string_ext檢索指向包含參數數據的緩沖區的指針
lr_eval_string_ext_free釋放由lr_eval_string_ext分配的指針
lr_save_searched_string在緩沖區中搜索字符串實例,并相對于該字符串實例,将該緩沖區的一部分保存到參數中
lr_debug_message将調試信息發送到輸出窗口
lr_error_message将錯誤消息發送到輸出窗口
lr_get_debug_message檢索當前消息類
lr_log_message将消息發送到日志文件
lr_output_message将消息發送到輸出窗口
lr_set_debug_message設置調試消息類
lr_vuser_status_message生成帶格式的輸出,并将其寫到ControllerVuser狀态區域
lr_message将消息發送到Vuser日志和輸出窗口
lr_load_dll加載外部DLL
lr_peek_events指明可以暫停Vuser腳本執行的位置
lr_think_time暫停腳本的執行,以模拟思考時間(實際用戶在操作之間暫停以進行思考的時間)
lr_continue_on_error指定處理錯誤的方法
lr_continue_on_error(0);lr_continue_on_error⑴;
lr_rendezvous在Vuser腳本中設置集合點
TE_wait_cursor等待光标出現在終端窗口的指定位置
TE_wait_silent等待客戶端應用程序在指定秒數内處于靜默狀态
TE_wait_sync等待系統從X-SYSTEM或輸入禁止模式返回
TE_wait_text等待字符串出現在指定位置
TE_wait_sync_transaction記錄系統在最近的XSYSTEM模式下保持的時間
WEB函數列表
web_custom_request允許您使用HTTP支持的任何方法來創建自定義HTTP請求
web_image在定義的圖像上模拟鼠标單擊
web_link在定義的文本鍊接上模拟鼠标單擊
web_submit_data執行“無條件”或“無上下文”的表單
web_submit_form模拟表單的提交
web_url加載由“URL”屬性指定的URL
web_set_certificate使Vuser使用在InternetExplorer注冊表中列出的特定證書
web_set_certificate_ex指定證書和密鑰文件的位置和格式信息
web_set_user指定Web服務器的登錄字符串和密碼,用于Web服務器上已驗證用戶身份的區域
web_cache_cleanup清除緩存模拟程序的内容
web_find在HTML頁内搜索指定的文本字符串
web_global_verification在所有後面的HTTP請求中搜索文本字符串
web_image_check驗證指定的圖像是否存在于HTML頁内
web_reg_find在後面的HTTP請求中注冊對HTML源或原始緩沖區中文本字符串的搜索
web_disable_keep_alive禁用Keep-AliveHTTP連接
web_enable_keep_alive啟用Keep-AliveHTTP連接
web_set_connections_limit設置Vuser在運行腳本時可以同時打開連接的最大數目
web_concurrent_end标記并發組的結束
web_concurrent_start标記并發組的開始
web_add_cookie添加新的Cookie或修改現有的Cookie
web_cleanup_cookies删除當前由Vuser存儲的所有Cookie
web_remove_cookie删除指定的Cookie
web_create_html_param将HTML頁上的動态信息保存到參數中。(LR6.5及更低版本)
web_create_html_param_ex基于包含在HTML頁内的動态信息創建參數(使用嵌入邊界)(LR6.5及更低版本)。
web_reg_save_param基于包含在HTML頁内的動态信息創建參數(不使用嵌入邊界)
web_set_max_html_param_len設置已檢索的動态HTML信息的最大長度
web_add_filter設置在下載時包括或排除URL的條件
web_add_auto_filter設置在下載時包括或排除URL的條件
web_remove_auto_filter禁用對下載内容的篩選
web_add_auto_header向所有後面的HTTP請求中添加自定義标頭
web_add_header向下一個HTTP請求中添加自定義标頭
web_cleanup_auto_headers停止向後面的HTTP請求中添加自定義标頭
web_remove_auto_header停止向後面的HTTP請求中添加特定的标頭
web_revert_auto_header停止向後面的HTTP請求中添加特定的标頭,但是生成隐性标頭
web_save_header将請求和響應标頭保存到變量中
web_set_proxy指定将所有後面的HTTP請求定向到指定的代理服務器
web_set_proxy_bypass指定Vuser直接訪問(即不通過指定的代理服務器訪問)的服務器列表
web_set_proxy_bypass_local指定Vuser對于本地(Intranet)地址是否應該避開代理服務器
web_set_secure_proxy指定将所有後面的HTTP請求定向到服務器
web_set_max_retries設置操作步驟的最大重試次數
web_set_timeout指定Vuser等待執行指定任務的最長時間
web_convert_param将HTML參數轉換成URL或純文本
web_get_int_property返回有關上一個HTTP請求的特定信息
web_report_data_point指定數據點并将其添加到測試結果中
web_set_option在非HTML資源的編碼、重定向和下載區域中設置Web選項
web_set_sockets_option設置套接字的選項
産品背景
Mercury(美科利)已于2006年被HP(惠普)收購。



















