性能測試是利用產品、人員和流程來下降應用程序、升級程序或補丁程序部署風險的一種手段。性能測試的主要思想是經過模擬產生真實業務的壓力對被測系統進行加壓,驗證被測系統在不一樣壓力狀況下的表現,找出其潛在的瓶頸。web
性能測試原理以下圖所示:數據庫
性能測試相關術語:響應時間、併發用戶數、事務響應時間、吞吐量、TPS(每秒事務響應數)、性能計數器等。後端
性能測試方法:負載測試、壓力測試、配置測試、併發測試、可靠性測試等。瀏覽器
應用領域:能力驗證、規劃能力、性能調優、缺陷發現。安全
性能測試工具架構 通常包括:虛擬用戶腳本產生器(Virtual User Generator)、壓力產生器(player)、用戶代理(Agent)、壓力調度和監控系統(Controller)、壓力結果分析工具(Analysis)。服務器
第一部分:LoadRunner簡介網絡
LoadRunner是一種預測系統行爲和性能的負載測試工具,經過模擬實際用戶的操做行爲進行實時性能監測,來幫助測試人員更快的查找和發現問題。LoadRunner適用於各類體系架構,能支持普遍的協議和技術,爲測試提供特殊的解決方案。企業經過LoadRunner能最大限度地縮短測試時間,優化性能並加速應用系統的發佈週期。session
LoadRunner提供了3大主要功能模塊,既能夠做爲獨立的工具完成各自的功能,又能夠做爲LoadRunner的一部分彼此銜接,與其餘模塊共同完成軟件性能的總體測試,這3大模塊分別是:多線程
LoadRunner 經常使用術語:架構
1. 場景(Scenario):即測試場景,在LoadRunner的Controller部件中,能夠設計與執行用例的場景,設置場景的步驟主要包括:在Controller中選擇虛擬用戶腳本、設置虛擬用戶數量、配置虛擬用戶運行時的行爲、選擇負載發生器(Load Generator)、設置執行時間等。
2. 負載發生器(Load Generator):用來產生壓力的機器,受Controller控制,可使用戶腳本在不一樣的主機上執行。在性能測試工做中,一般由一個Controller控制多個Load Generator以對被測試系統進行加壓。
3. 虛擬用戶(Virtual User/Vuser):對應於現實中的真實用戶,使用LoadRunner模擬的用戶稱爲虛擬用戶。性能測試模擬多個用戶操做能夠理解爲這些虛擬用戶在跑腳本,以模擬多個真正用戶的行爲。
4. 虛擬用戶腳本(Vuser Script):經過Vuser Generator錄製或開發的腳本,這些腳本用來模擬用戶的行爲。
5. 事務(Transaction):測試人員能夠將一個或多個操做步驟定義爲一個事務,能夠通俗的理解事務爲「人爲定義的一系列請求(請求能夠是一個或者多個)」。在程序上,事務表現爲被開始標記和結束標記圈定的一段代碼區塊。Loadrunner根據事務的開頭和結尾標記,計算事務響應時間、成功/失敗的事務數。
6. 思考時間(Think Time):即請求間的停頓時間。實際中,用戶在進行一個操做後每每會停頓而後再進行下一個操做,爲了更真實的模擬這種用戶行爲而引進該概念。在虛擬用戶腳本中用函數lr_think_time()來模擬用戶處理過程,執行該函數時用戶線程會按照相應的time值進行等待。
7. 集合點(Rendezvous):設集合點是爲了更好模擬併發操做。設了集合點後,運行過程當中用戶能夠在集合點等待到必定條件後再一塊兒發後續的請求。集合點在虛擬用戶腳本中對應函數lr_rendezvous() 。
8. 事務響應時間:事務響應時間是一個統計量,是評價系統性能的重要參數。定義好事務後,在場景執行過程和測試結果分析中便可以看到對應事務的響應時間。經過對關鍵或核心事務的執行狀況進行分析,以定位是否存在性能問題。
第二部分:LoadRunner測試流程
➤規劃測試:肯定測試要求,如併發用戶數量、典型業務場景流程;測試計劃;設計用例;……
➤建立Vuser腳本:使用Virtual User Generator錄製、編輯和完善測試腳本。
➤定義場景:使用LoadRunner Controller 設置測試場景。
➤運行場景:使用LoadRunner Controller 驅動、管理並監控場景的運行。
➤分析結果:使用LoadRunner Analysis 生成報告和圖表並評估性能。
規劃測試:
好的測試規劃,可以指導整個測試過程,以更好的收集到測試目標要求的性能數據。規劃能夠包括測試的計劃、用例的設計、場景的設計、性能計數器設置的設計等。
如下列出幾點規劃事項:
ü 測試用例:測試用例通常根據須要測試的功能進行設計,如監控寶登錄,建立任務等
ü 場景設計:通常狀況會設計兩種加壓方式進行測試:瞬時加壓(多人同時進行某項業務操做)與逐漸加壓(多人前後進行某項業務操做,操做時間間隔根據計劃設定)。
ü 性能計數器方面:能夠收集CPU時間、內存、硬盤、網絡、數據庫參數等。
第一步:建立Vuser腳本—準備
Loadrunner腳本開發步驟分爲:錄製基本腳本à加強/編輯腳本à配置運行時設置à試運行腳本
一、啓動LoadRunner:
選擇開始à程序à HPLoadRunneràLoadRunner,打開HP LoadRunner11,以下圖所示。
二、打開VuGen:
在LoadRunner Launcher窗格中,單擊Create/Edit Scripts,連接啓動Virtual user Generator起始頁。
三、建立一個空白Web腳本:
選擇FileàNew菜單,或點擊 按鈕,打開New Virtual User對話框,顯示可供選擇腳本的協議。
對於經常使用的應用軟件,咱們能夠根據被測應用是B/S結構仍是C/S結構來選擇協議。若是是B/S結構,就要選擇Web(HTTP/HTML)協議。若是是C/S結構,則能夠根據後端數據庫的類型來選擇,如MS SQL Server協議用於測試後臺數據庫爲SQL Server的應用;對於沒有數據庫的WINDOWS應用,能夠選擇Windows Sockets協議。
根據選擇協議的不一樣,Virtual User Generator 會使用不一樣的方式和界面引導用戶完成腳本的錄製。
四、錄製前的設置:
選擇Web(HTTP/HTML),點擊Create按鈕,打開Start Recording對話框。選擇的協議不一樣,打開的窗口就會不一樣,實例是針對Web錄製的對話框。
VuGen的腳本分爲三個部分:Vuser_init,Action,Vuser_end。其中Vuser_init和Vuser_end都只能存在一個,而Action可分紅無數多個部分,能夠經過點擊旁邊的【new】按鈕來建立Action。在迭代執行測試腳本時,Vuser_init和Vuser_end中的內容只會執行一次,迭代的是Action部分。
在Start Recording對話框,點擊Options按鈕,進入錄製選項設置。通常要設置如下選項:
Ø 基於瀏覽器的應用程序推薦使用HTML-based script。
Ø 不是基於瀏覽器的應用程序推薦使用URL-based script。
Ø 基於瀏覽器的應用程序中包含了JavaScript,而且該腳本向服務器發送了請求,好比DataGrid的分頁按鈕等,推薦使用URL-based script。
Ø 基於瀏覽器的應用程序中使用了HTTPS安全協議,建議使用URL-based script。
AdvancedàSupport charset中設置編碼格式:UTF-8;
提示:錄製Web腳本時,生成的腳本中存在亂碼該如何解決?
² 新建腳本--->選擇協議(Http)-->選項-->高級-->選擇「支持字符集」並點選「UTF-8」。
² 在回放腳本以前:Vuser-->運行時設置-->瀏覽器-->瀏覽器仿真-->更改-->使用瀏覽器-->語言下來選擇 「中文(中國)」
五、錄製腳本:
在Start Recording對話框,點擊OK按鈕,開始錄製。系統自動彈出IE,加載營銷系統的登陸界面。在錄製的過程當中,屏幕上有一個懸浮的錄製工具欄,是腳本錄製過程當中測試人員和VuGen交互的主要平臺。
經過操做被測系統,操做的每個步驟都被記錄,在錄製的過程當中,能夠在相應的步驟插入action、事務、檢查點、集合點等信息。錄製完成後單擊按鈕,Loadrunner開始生成腳本,生成的腳本如圖所示。
腳本有兩種查看方式:
Ø Script View 能夠查看所有錄製的腳本代碼(下圖)
Ø Tree View能夠查看每一個URL獲取來的頁面(下圖)
第二步:建立Vuser腳本—加強/編輯腳本
參數化:參數化的做用是在進行場景執行的時候,每一個不一樣的虛擬用戶能夠按照參數的讀取策略讀取到參數值,以模擬不一樣用戶在提交或者讀取不一樣的數據。
每一個用戶在界面上讀取和提交的信息都不太相同,所以通常都須要參數化,其它與輸入信息對應的好比用戶id之類的信息也須要參數化;另外,錄製環境絕大多數狀況下與執行環境不一致,所以通常須要對IP、端口或者域名作參數化。
打開腳本後,首先要肯定哪些常量須要參數化。
能夠看出,在web_submit_data函數中,兩條語句包含了兩個常量:用戶名和密碼。
"Name=usernam", "Value=Test123433333@sina.com", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
當咱們想模擬多個不一樣的用戶來運行登陸腳本的時候,須要對Value= Test123433333@sina.com和Value=123456進行參數化,以e號參數化爲例,參數化過程以下:
1)選中Test123433333@sina.com à右擊鼠標à在右鍵菜單上選擇replace with a parameter。
2)在彈出窗口填寫參數名稱,或選擇一個已經存在的參數名。
經常使用的參數類型:
ü Data/Time:使用當前日期/時間替換所選常量。
ü Group Name:使用Vuser組的名稱替換所選常量。
ü Load Generator Name:使用Vuser腳本的負載發生器名替換所選常量。
ü Iteration Number:使用當前的迭代編號替換所選常量。
ü Random Number:使用一個隨機生成的整數替換所選常量,能夠經過參數屬性設定參數的範圍。
ü Unique Number:使用一個惟一編號替換所選常量,能夠經過參數屬性設定參數的第一個值和遞增的規則。
ü Vuser ID:使用運行腳本的虛擬用戶ID來代替選擇的常量。
ü File:採用外部的數據來代替,可使用單獨的文件,也可使用現成的數據庫中獲取數據。
ü User Defined Function:從用戶開發的dll文件中獲取數據。
3)單擊窗口的properties按鈕,設置parameter的properties。參數名稱:Username;選擇參數類型File,來寫入已準備好的數據。
文件File:參數化結束後,腳本保存的根目錄下會自動生成一個 以參數名稱命名的 參數文件;也能夠直接選擇一個已準備好的參數文件。
選擇參數列Select Column:
By number:以列號爲參數列。
By name:以列名爲參數列。
文件格式:
Column:參數之間的分隔符:逗號、空格、Tab。
First data:從第幾行讀取數據。
選擇參數分配方法Select next row:
ü Sequential:順序的分配Vuser參數值。當正在運行的Vuser訪問數據表格時,它將會提取下一個可用的數據行。
ü Random:當腳本開始運行時,「隨機」的爲每一個Vuser分配一個數據表格中的隨機值。
ü Unique:爲Vuser的參數分配一個「惟一」的順序值。注意,參數數量必定要大於等於「Vuser量*迭代數量」。
選擇參數更新方法Update value on:
ü Each iteration:腳本每次迭代都順序的使用數據表格中的下一個新值。
ü Each occurrence:在迭代中只要遇到該參數就從新取值。
ü Once:在全部的迭代中都使用同一個值。
當超出範圍時When out of values:(選擇數據爲unique時纔可用到)
ü Abort Vuser:停止。
ü Continue in a cyclic manner:繼續循環取值。
ü Continue with last value:取最後一個值。
設置完成後,被參數化的值會被參數名代替
關聯:關聯的含義是在腳本回放過程當中,客戶端發出請求,經過關聯函數所定義的左右邊界值(也就是關聯規則),在服務器所響應的內容中查找,獲得相應的值,以變量的形式替換錄製時的靜態值,從而向服務器發出正確的請求,最典型的是用於sessionID,經常使用的關聯技術有三種:錄製中關聯、錄製後關聯、手動關聯。
錄製中關聯:設置錄製前的recording optionsàcorrelation,能夠勾選LR已有的關聯規則,也能夠新建規則;錄製過程當中,關聯自動在腳本體現。
錄製後關聯:關聯的使用能夠在腳本錄製完成後,回放一次腳本,而後在腳本的菜單的vuseràscan script for correlations進行設置。
經過回放腳本和掃描關聯,系統嘗試找到錄製與執行時服務器響應的差別部分,找到須要關聯的數據,並創建關聯。
手動關聯:錄製前關聯與錄製後關聯都屬於自動關聯的範疇,若是出現自動關聯不能解決的問題,就須要使用手動關聯的方法,手動關聯的通常步驟以下:
1)錄製兩份腳本,保證業務流程和使用的數據相同。
2)使用WinTiff工具比較兩份腳本,對兩份腳本中不一樣的地方進行判斷,找到須要關聯的數據。
3)找到左邊界和右邊界字符串,寫出關聯函數。
4)在腳本中‘須要關聯的數據’前面插入關聯函數。
5)用關聯函數中定義的參數取代腳本中‘須要關聯的數據’。
其餘:前面講解了插入事務、插入集合點、參數化、創建關聯的方法,通常的腳本都須要作以上幾項的修改工做。此外,還能夠經過插入註釋、插入檢查點來完善腳本。另外腳本出現問題了,也能夠經過打印信息來調試腳本。
插入註釋:在腳本中插入註釋,能夠清晰找到須要修改的位置,加強腳本的可讀性。
插入檢查點:在腳本中設置檢查點函數,將返回值的結果反映在Controller的狀態面板上和Analysis統計結果中,由此能夠判斷數據傳遞的正確性。
在VuGen中,選擇 VuseràRun-time Settings,能夠設定腳本回放過程的一些參數。如Iteration Count (迭代次數)、Think Time (思考時間)、Error Handling(錯誤處理)、Multithreading(運行方式)等。
一、Iteration Count (迭代次數)
選擇General:Run Logic
說明:設定每一個Action的迭代次數。
2. Think Time (思考時間)
選擇General:Think Time
說明:設定腳本回放時對思考時間的處理方式。
Ignore think time
腳本回放時,將不執行lr_think_time()函數,這樣會給服務器產生更大的壓力。
Replay think time
腳本回放時,執行lr_think_time()函數,具體執行方式有一下3種:
1)按照錄制時獲取的think time值回放。
2)按照錄制時獲取值的整數倍數回放腳本。
3)制定一個最大和最小的比例,按照二者之間的隨機值回放腳本。
Limit think time to 選項,用於限制think time的最大值,腳本回放過程當中,若是發現有超過這個值的,用這個最大值替代。
三、Error Handling(錯誤處理)
選擇General:Miscellaneous
說明:設定遇到錯誤時的處理方式
Continue on error:遇到錯誤時繼續運行。
Fail open transactions on lr_error_message:執行到事務中調用的lr_error_message()函數時將事務的結果置爲Failed。
Generate snapshot on error:對錯誤進行快照
4.Multithreading(運行方式)
選擇 General:Miscellaneous
說明:設定腳本是以多線程方式運行仍是以多進程方式運行。
Run Vuser as a process:以多進程方式運行。
Run Vuser as a thread:以多線程方式運行。
這個根據實際狀況而定,一般B/S一般用線程,C/S用進程。
建立Vuser腳本—試運行腳本
1.腳本錄製完畢後,按F5鍵,或點擊菜單中的按鈕,能夠試運行腳本。回放過程當中VuGen在下方同步打印日誌。
2.若是須要查看不一樣的日誌形式,能夠在腳本頁面菜單的vuseràruntime-settingsàlog選擇不一樣的項,回放腳本時將打印不一樣級別的日誌。
3.運行結束後,系統會給出相應的運行結果,能夠經過ViewàTest Results查看回放結果
在VuGen中試運行腳本的做用,主要是查看錄製的腳本可否正常經過,若是有問題,系統會給出提示信息,並定位到出錯的行上,便於用戶查找到錯誤,修改完善測試腳本。
定義場景
腳本準備完成後,能夠根據場景用例設置場景。Controller控制器提供了手動和麪向目標兩種測試場景。
l 手動設計場景(Manual Scenario)最大的優勢是可以更靈活地按照需求來設計場景模型,使場景能更好地接近用戶的真實使用。通常狀況下使用手動場景設計方法來設計場景。
l 面向目標場景(Goal Oriented Scenario)則是測試性能是否能達到預期的目標,在能力規劃和能力驗證的測試過程當中常用。
Controller控制器能夠從程序中打開,而後選擇保存好的腳本;也能夠從VuGen中直接鏈接到該腳本的控制場景。
實例從VuGen中啓動Controller的步驟以下:
一、單擊VuGen菜單欄的toolsàcreate controller scenario。
二、在彈出窗口選擇虛擬用戶數、運行結果保存目錄(按照事先約定選擇目錄,結果文件的命名最好包含用戶數/加壓方式/場景名)、負載產生的負載機所在地。
三、在Create Scenario窗口中點擊OK,連接啓動LoadRunner Controller。
定義場景—設置Schedule
在Controller的Scenario Schedule中,能夠設置場景的各項計劃,如虛擬用戶的加載方式、釋放策略等。
1.設置場景的基本信息
Schedule Name:設置場景名稱。
Schedule by:選擇按場景計劃或按用戶組計劃。
Run Mode:
real-world schedule 是真實場景模式,能夠經過增長Action來增長多個用戶。
basic schedule 是咱們之前用的‘經典模式’,只能設置一次負載的上升和降低。
2.設置場景的各種參數:雙擊Global Schedule中的對應行,能夠設置schedule的各種參數。
Initialize:初始化是指運行腳本中的Vuser_init操做,爲測試準備Vuser和Load Generator。
Start Vusers:設置場景Vuser加載方式。
Duration:設置場景持續運行的狀況。
Stop Vusers:設置場景執行完成後虛擬用戶釋放的策略。
Start Time:設置場景啓動時間。
場景設計完成後,單擊Controller界面下方的Run選項卡,能夠進入場景的執行界面。這個界面用於控制場景的執行,包括啓動中止執行場景,觀察執行時是否出錯及出錯信息、執行時用戶狀況、相關性能數據。
單擊Start Scenario按鈕,場景開始運行。一些即時的數據(好比用戶數,等待數,成功事務數,失敗事務數等)以及性能數據的折線圖,會在Run的過程當中顯示。
執行完成後,執行結果以事先的命名默認保存在創建場景時設置的保存目錄。若是涉及到調優,須要屢次執行同一個場景,建議每次運行前先調整菜單的ResultsàResults Settings,場景結果保存的名字建議包含重要調優參數值。調優參數比較多樣,能夠在具體的項目用附件約定。
測試期間,可使用LoadRunner的聯機監控器觀察Web服務器在負載下的運行狀況。特別是能夠看到,負載的增長如何影響服務器對用戶操做的響應時間(事務響應時間),以及如何引發錯誤的產生。
LR的Analysis模塊是分析系統的性能指標的一個主要工具,它可以直接打開場景的執行結果文件,將場景數據信息生成相關的圖表進行顯示。Analysis集成了強大的數據統計分析功能,容許測試員對圖表進行比較和合並等多種操做,分析後的圖表可以自動生成須要的測試報告文檔。
一般測試報告須要給出「虛擬用戶—用戶響應時間」的折線圖,這個折線圖能夠經過合併報表的形式生成,過程以下:選中Average Transaction Response Time報表,單擊菜單欄的ViewàMerge Graphsà而後選擇與Running Vuser圖合併,生成的折線圖即爲「虛擬用戶—用戶響應時間」。
LoadRunner做爲商業性能測試工具擁有強大的功能,License的價格也很高。還有一個Apache開發的開源免費性能測試工具Jmeter,互聯網公司使用比較多。這些工具只適合應用後端的壓力測試,使用時都是須要先安裝才能使用,若是想模擬大併發,前期還須要準備大量的工做壓力機,測試所佔用的資源成本比較高,壓測週期很長,愈來愈不適合移動應用產品敏捷開發、快速交付的需求。