軟體專案實訓及課程設計指導——如何應用開源Apache JMeter效能測試工具
1、軟體應用系統的效能不僅需要最佳化、也需要度量和監控
提高軟體應用系統的整體效能是一個"系統工程",需要設計和開發人員從各個不同的層次和方面對軟體應用系統實施效能最佳化的各種措施。作者在本系列文章中主要是從J2EE平臺下的Web應用系統的前端表示層和系統的底層持久層兩個方面為讀者介紹了各種切實可行、高效低廉的效能最佳化方法。
在軟體應用系統開發實現中,設計和開發實現人員不僅要致力於提高軟體應用系統的效能和資料訪問的效率,也還應該要能夠度量和測試軟體應用系統的效能。只有透過對軟體應用系統的效能進行科學和客觀的測試,才能夠客觀地、準確地掌握對軟體應用系統進行效能最佳化的各種措施的最終應用效果,為評價效能最佳化方案提供科學的度量資料。
作者在本文及後續的幾篇文章中將為讀者介紹如何正確地應用開源的JMeter效能測試工具對軟體應用系統的效能進行測試和了解軟體應用系統的抗負載的能力;此外,也還介紹如何利用JProfiler效能監控工具監控軟體應用系統中的效能變化狀況以及時發現出軟體應用系統中所可能存在的效能問題、產生的主要原因,並及時排除軟體應用系統中所可能存在的效能隱患。
2、應用JMeter完成Web應用系統的壓力和效能測試
Apache JMeter是一個開源、純Java技術實現的壓力測試(Stress Test)和效能測試(Performance Test)的工具。它不僅可以對靜態的和動態資源(如Web 應用系統)的效能進行測試,也還可以用於對伺服器(如Tomcat應用伺服器、資料庫伺服器、FTP 伺服器等)、網路或物件的負載能力 (如HTTP、FTP和JDBC資料庫連線服務等)進行測試、並分析在不同壓力型別下的軟體應用系統的整體效能。
JMeter在測試中通常採用模擬大量的資料對一個獨立的伺服器或者伺服器叢集進行負載測試,測試人員然後透過分析由JMeter所產生出的各種形式的效能圖表來判斷測試的結果;JMeter還可使用Cookie和URL重寫等技術處理J2EE Servlet驗證,因此很適合於測試J2EE Web應用系統程式。
3、JMeter的主要技術特性和功能
1)開源免費,它基於Java語言編寫和應用於Java和J2EE技術平臺,擴充套件性高並允許可拓展它的各個功能外掛;
2)支援介面測試,壓力測試等多種不同的功能,支援錄製回放,操作使用簡單方便;
3)提供有應用Java Swing GUI元件技術實現的使用者介面,因此有較為完善的UI介面,便於介面除錯;
4)提供對多個不同的作業系統平臺的支援,可執行在Linux、Windows和Mac等系統中,而且儲存統一的UI介面;
5)程式容量小、輕量級應用效果,和其它測試工具相比,在應用方面更具有靈活性。
JMeter其實應該是一個性能測試的框架——使用者可以透過自定義外掛的方式實現對它的功能進行擴充套件(JMeter能夠自動掃描其lib/ext子目錄下*.jar檔案中的外掛,並將其裝載到記憶體中),並且可以模擬出應用系統在實際應用環境中的"併發訪問"的狀況而測試出該應用系統的整體效能。在如下示例圖中顯示JMeter系統程式的lib/ext子目錄內的各個外掛程式。
精心設計的基於Java Swing技術的GUI操作介面使得使用者操作使用簡單、方便,並可以快取和離線分析和回放測試的結果。如下示例圖為JMeter的某個功能操作過程中的介面展示示例圖。
4、JMeter中的測試計劃(Test Plan)
(1)什麼是測試計劃
在JMeter效能測試框架中,一個測試計劃(Test Plan)描述了一系列JMeter在執行時所要執行的各個測試步驟、並且測試指令碼(作者注:測試指令碼是一個特定測試的一系列指令,這些指令可以被自動化測試工具執行)是儲存在對應的測試計劃中的。
一個完整的JMeter測試計劃主要包括一個或者多個執行緒組(Thread Groups)、邏輯控制(Logic Controller)、例項產生控制器(Sample Generating Controllers)、偵聽器(Listener)、定時器(Timer)、比較(Assertions)、配置元素(Config Elements)等。
(2)JMeter提供有預設的測試計劃
測試人員在開始執行JMeter的測試工具時,它已經提供有一個預設的測試計劃。但一個JMeter應用的例項只能建立或者開啟一個測試計劃,一般來說也可以認為一個測試計劃就是一個測試用例(Test Case)。
下圖所示為在某個測試計劃中新增HTTP請求預設值配置過程的區域性截圖,透過新增HTTP請求預設值的配置可以減少測試過程中的重複設定引數。
5、執行JMeter中的測試計劃
測試人員在執行JMeter中所建立的測試計劃前,會提示測試人員(參看如下示例圖所示)首先儲存測試計劃專案(儲存為*.jmx格式的檔案)。
如果測試人員將此檔案儲存到JMeter系統的extras目錄下(參看如下示例圖所示),測試人員以後即可透過使用Apache Ant實現測試的自動化。
6、檢視JMeter產生的測試結果圖表
JMeter執行完成某個測試計劃可能會花費一些時間,測試執行時,測試人員可以在聚合報告視窗中檢視本次的測試結果(參看如下示例圖所示)。
在上面的反映測試結果的表格中的各個資料專案的含義如下:
1)Label:每個JMeter的測試目標URL(例如 HTTP 請求)都有一個 Name 屬性,這裡顯示的就是 Name 屬性的值。
2)#Samples:表示本次測試中一共發出了多少個請求(Request),如果模擬8個使用者,每個使用者迭代10次,那麼這裡顯示80。
3)Average:平均響應時間,預設情況下是單個請求(Request)的平均響應時間,當使用了事務控制時,也可以以事務為單位顯示平均響應時間。
4)Median:中位數,也就是 50%使用者的響應時間。
5)90% Line:90%使用者的響應時間。
6)Min:最小響應時間。
7)Max:最大響應時間。
8)Error%:本次測試中出現錯誤的請求的數量/請求的總數。
9)Throughput:吞吐量,預設情況下表示每秒完成的請求(Request)數。
10)KB/Sec:每秒從伺服器端接收到的資料量。
當然,JMeter測試工具程式不僅可以生成聚合報告,還可以生成一些其它形式的報告。因為JMeter工具會根據測試人員在測試計劃中所新增的監聽器(Listener)型別,產生出不同形式的測試結果圖表——比如聚合報告、樣條曲線、圖形結果等形式。如下示例圖為測試人員設定測試結果為樣條曲線型別的測試結果的操作過程示例圖區域性截圖。
下圖所示的示例圖中的區域性截圖為某個樣條曲線型別的測試結果的區域性截圖,從該示例圖中可以瞭解到,JMeter測試工具產生的反映測試結果的統計報表非常簡單和直觀。
7、將JMeter測試工具和Badboy工具相互整合
(1)安裝和啟動Badboy工具程式
Badboy是一款應用C++語言開發的動態應用測試工具,它擁有強大的螢幕錄製和回放功能,可提供圖形結果的分析功能,同時Badboy還提供有將Web測試指令碼直接匯出生成JMeter系統格式指令碼的功能(也就是JMeter所支援的*.jmx格式指令碼);Badboy是一款免費的Web自動化測試工具,經常與JMeter測試工具整合和結合使用。
Badboy程式的安裝過程同一般的Windows 系統下的應用程式沒有什麼區別,安裝完成後就可以在桌面和Windows作業系統的【開始】選單中看到相應的快捷鍵方式或者直接點選Badboy工具程式的安裝目錄下的Badboy.exe 程式檔案,雙擊它就可以啟動Badboy系統程式。下圖所示為啟動Badboy程式後的視窗資訊的區域性截圖。
(2)利用Badboy工具程式將Web測試指令碼直接匯出生成JMeter測試工具的測試指令碼
在應用JMeter測試工具時,如果採用手工製作JMeter測試工具的測試指令碼是比較費時的。此時,一般可以用Badboy這樣的工具程序錄制測試過程從而對應地創建出相關的測試指令碼,然後再匯出生成JMeter測試工具格式的測試指令碼,以方便專案開發後期所可能進行的重複執行測試過程或者回歸測試、自動化測試。
此時測試人員就可以直接在Badboy測試程式中內嵌的瀏覽器(主介面的右側)中對被測Web應用系統進行各種測試功能的操作,所有的操作都會被記錄在Badboy程式主介面左側的編輯視窗中(可以看到Badboy程式的左側Script欄內的Step樹節點下多了若干條HTTP請求,而在下方的Summary欄中展示錄製過程的響應時間);一旦測試操作過程錄製完成後,測試人員只需要點選工具條中的【停止錄製】按鈕完成對測試指令碼的錄製過程。
因此,可以瞭解到Badboy程式其實是通過錄制測試人員的操作過程,再依據操作過程中所涉及的各個操作步驟建立和整理出對應的測試指令碼。當然,測試人員還需要再進行測試指令碼整理(如應用Badboy程式中的【Tool】選單內的【Add Assertion for selection】子選單專案以新增檢查點)和引數化測試指令碼等方面的工作,從而大大地減輕了測試人員建立測試指令碼的工作量。
(3)將錄製好的測試指令碼匯出為JMeter測試工具指令碼格式的測試指令碼
測試人員只需要選擇Badboy測試程式中的【File】選單中的【Export to JMeter】子選單,然後在彈出的【檔案另存為】對話方塊中填寫最終儲存的檔名,Badboy工具程式將會把錄製好的指令碼匯出為JMeter的指令碼格式的測試指令碼——請見如下示例圖所示的操作過程的區域性截圖。
(4)啟動JMeter測試工具並開啟剛剛生成的測試指令碼
此時測試人員只需要啟動JMeter測試工具,然後再在JMeter測試工具中開啟剛剛生成的測試指令碼檔案——請見如下示例圖所示的操作過程的區域性截圖。
當測試人員在JMeter測試工具中打開了測試指令碼檔案後,然後在該測試指令碼檔案中新增一個測試結果顯示方式的監聽器型別——如可以選用聚合報告形式或者其它的圖表形式;最後再執行透過Badboy工具程式匯出的測試計劃中的測試指令碼,將產生出如下示例圖所示的測試結果。