2007年6月16日 星期六

(2005.9月號-140期)_全方位壓力測試工具JMeter

在專案設計與開發階段,通常都會必須考量到效能的要求。例如系統反應時間必須在多少時間內、至少必須支援多少使用者同時上線等。也許在現實面上無法盡如人願,但即然有這方面的要求就不要等到專案後期才想到系統效能問題。




序言

壓力測試,主要作用就在於系統軟體正式上線或系統負載到達臨界點之前,透過進行可重覆的負載測試,先行分析出系統可承受的使用者極限值與效能瓶頸,用以提供開發人員最佳化自己的程式。經過測試不僅讓開發人員對系統實際使用中的效能狀況充滿信心,同時有了對系統負載的準確數據,亦可以減少系統當機時間與其帶來的企業損失。


壓力測試是Web應用程式開發中一項重要的決策,建構一個服務大量使用者的應用系統,擁有能表示出系統能夠承受多少的負載的數據非常重要。就算單純建置一個小型網站,經過測試能夠凸顯出最終會導致伺服器崩潰的程式碼錯誤與執行緒問題。


透過模擬大量使用者請求,執行給系統施加較大的負荷,同時評估當應用程式達到了規定極限的情況下長時間的高負載中,執行處理能力與處理交易能力,進而了解系統的穩定性。無論如何,花時間對系統進行壓力測試,將可以獲得重要的效能資訊,為未來進行系統最佳化、硬體配置以及系統升級帶來便利。

JMeter簡介

Apache JMeter 是一個100%的純Java視窗應用程式,用於壓力測試和性能測量的工具。它最初被設計用於Web應用程式的測試,但後來擴展到其他測試領域。


目前JMeter可以執行HttpFTPRDBMS(關聯式資料庫)LDAPSOAPWebService等的負載以及效能測試,並且JMeter在原始設計上採開放式架構,因此也充許開發人員撰寫可執行的可插入式套件(Plug-Ins)與效能測量用的取樣器(Samplers)


Apache JMeter 可以用於對靜態的和動態的資源,如文件,ServletPerl腳本,Java 物件,資料庫和查詢,FTP伺服器等等的性能進行測試。它可以用於對伺服器,網路或物件進行繁重的負載來測試它們的強度或分析不同壓力負荷下的整體性能。你可以使用它做效能的圖形分析或在大量同時發生的負載下測試你的伺服器與其相關應用程式的穩定性。


Apache JMeter 的特性包括:

  • 能夠對HTTPFTP伺服器進行壓力和性能測試,透過JDBC也可以對任何資料庫進行同樣的測試。

  • 完全的可攜性和100% 純Java撰寫的應用程式。

  • 使用Swing和輕量級元件支援。

  • 使用多執行緒框架允許通過多個執行同時發出請求進行取樣和通過單獨的執行緒群組對不同的功能同時取樣。

  • 精心設計的圖型介面允許快速操作和更精確的計時。

  • 對於測試結果可進行快取和離線分析、重覆進行測試。

  • 高度可擴充性:

    • 可插入的取樣器允許無限制的測試能力。

    • 各種負載統計表和可插入的計時器可供選擇。

    • 資料分析和視覺化Plug-In套件提供了很好的可擴充性以及客製化。

    • 具有提供動態輸入到測試的功能,包括JavaScript

    • 支援使用Script語法的取樣器(在1.9.2及以上版本支援BeanShell)。


JMeter下載與安裝

JMeter是使用Java開發的應用程式,因此在使用前請先確定作業系統中已有J2SE Runtime Environment,接著請至http://jakarta.apache.org/jmeter 下載JMeter,目前最新版本為2.0.3,下載完成後無需安裝,解壓縮後即可使用。執行[%JMETER_HOME%/bin/jmeter.bat]啟動如圖1JMeter圖型化操作介面。


1 JMeter GUI操作介面


測試計劃(Test Plan)

在使用JMeter的觀念上,必須先建置一個Test Plan,在Test Plan中可以包含一到多個ThreadGroups,也就是使用一個執行緒來模擬一個操作者,而ThreadGroup代表模擬一組使用者。但必須注意的是,當加入愈多的執行緒,相對的系統資源消耗也愈多。

當在TestPlan中加入了所有的測試元素後,JMeter會進行Test Plan的編譯並產生JMeterEngine,之後便可以開始進行測試,JMeterEngine將建立執行緒,而每一個執行緒會在Test Plan中重覆執行。

參考圖1畫面左側的樹狀結構中,有二個根節點,Test PlanWork Bench,在Test Plan節點中的元素,代表目前欲執行的測試計劃,而尚未打算執行或正在構築的測試計劃則置於Work Bench中,當欲進行測試時再將其搬移至Test Plan中,因此我們可以在Test Plan中執行測試,在Work Bench中建構測試。

現在我們可以來正式建立一個Test Plan了,在筆者於八月份的文章中使用了JPetStore這個範例為各位示範了如何使用Maven建置這個專案,在本期的內容中,將再次使用JPetStore為基礎,建置Web Test Plan

建立並執行測試計劃

首先在Work Bench節點上按右鍵,加入Thread Group,並設定名稱為JPetStore,在執行緒群組中必須進行執行緒特性設定,參考圖2的設定Number of Threads指定了在測試案例中將啟動60個執行緒模擬使用者,並且將在將在Ramp-Up Period(in seconds)所指定的120秒內啟動完所有的執行緒。從120/60=2得知每2秒將開啟一個執行緒,另外Loop Count若勾選Forever,則這些模擬使用者會一直進行反覆的操作,也就是說,若在這個測試中,我們模擬使者登入之後登出的話,在此將會進行無限迴圈來重覆的登入與登出。而當勾選Scheduler之後,還可進行時間排程、Duration(seconds)持續測試秒數與Startup delay(seconds)延遲多少秒才開始啟動測試案例。

2 02_Thread Group


接下來於JPetStore點選[右鍵] [Add] [Config Element] [HTTP Request Defaults],指定預設的Web Server IPPortPath,同步驟加入[HTTP Cookie Manager]。在此設置HTTP Request Defaults的用意在於之後加入HTTP Request的取樣器時無需再指定起始網址路徑,而HTTP Cookie Manager用於在該測試計劃中支援Session,如圖3

3 HTTP Request DefaultsCookie Manager


現在我們可以正式加入取樣器了,參考筆者於八月份使用Maven的文章,啟動HSQLDBTomcat,並在JPetStore點選[右鍵] [Add] [Sampler] [HTTP Request],加入HTTP Request後設定Path指向[jpetstore_maven/shop/index.do]也就是JPetStore的首頁。並且再加入[Timer] [Constant Timer]模擬使用者間隔固定時間點取網頁,最後再加上取樣採集器[Listener] [Graph Results][Listener] [View Results Tree]就完成了一個簡易的Test Plan,將建構好的JPetStore Thread Group節點移至Test Plan根節點上如圖4

4 簡易的TestPlan


執行[Run] [Start]啟動JMeter進行壓力測試,在進行測試當中可隨時查看Graph ResultsView Results Tree執行狀況。亦可在取樣採集器中設定將所有取樣資料輸出至檔案,供外部程式,如Excel進行效能分析。在範例中我們從Graph Results看到了效能曲線並從View Results Tree中得知是否正確取得網頁資訊。


5 Graph Results效能曲線


使用側錄建置測試計劃

在上一節中,我們建構一個簡易的Test Plan,若只是要測試某特定網頁的效能,這樣的作法已經足夠了。但若欲以一個操作情節(Scenario)進行測試,如使用者輸入帳號密碼登入JPetStore網頁,瀏覽並選擇產品加入購物車,最後進行商品的購買並登出。則上述的測試計劃的建置就稍嫌不足了,況且手工加入多個HTTP Request進行網頁的導覽更是耗時費力。


這時對於有固定操作情節的測試計劃,可以使用JMeter建立HTTP Proxy Server對網頁操作進行側錄。而在這之前考量到在JPetStore的測試路徑,目前都指向http://localhost:8080/jpetstore_maven/ 起始的網址,在前述的操作中我們定義了預設的Server IPPort Number,但jpetstore_maven這個Context Path並未有預設值,因此必須將Context Path設定為變數,以免日後當jpetstore_maven改了之後導致Test Plan無法使用。


如圖6Test Plan的節點下加入變數名稱為CONTEXT_PATH,變數值為jpetstore_maven的使用者自定變數,並在先前設定的HTTP Request取樣器中Pathjpetstore_mavenEL語法${CONTEXT_PATH}進行替代,如先前首頁指定路徑[jpetstore_maven/shop/index.do]修改為[${CONTEXT_PATH}/shop/index.do],完成後再次進行測試,看看設定是否正確。

6 使用者自行定義變數


接下來開始進行HTTP Proxy Server的設定,在WorkBench節點執行[右鍵] [Add] [Non-Test Elements] [HTTP Proxy Server],參考圖7設定Proxy ServerPort Number8090(Tomcat已用掉8080port),指定側錄資料放置路徑(Target Controller)[Test Plan>JPetStore]節點上,並將資料元素編組方式設為[Store 1st sampler of each group only]以免側錄到太多不必要的資料。當按下[Start]時即啟動代理伺服器進行側錄,最後開啟設定瀏覽器使用的Proxy伺服器為localhost:8090並進行網頁的側錄即可。


7 HTTP Proxy Server進行側錄


結語

經過本文的說明讀者將能夠很方便的使用JMeter進行負荷與效能測試,通過使用JMeter提供的功能,我們可以使用圖型化介面建構測試計劃,同時,除了Graph ResultsView Results Tree之外讀者亦可使用其他的Listener來圖形化的測試資料,使我們能夠簡單的進行測試工作和分析測試結果。


沒有留言: