經過一個實例掌握測試工具JMeter的一些基本概念

JMeter主要是一個用於load/stress test的工具。因爲它具備一套專門的術語和概念,對於我等不是專門作測試的人員來講初次使用它時確實有點無從下手的感受。只有搞清楚了它的幾個基本概 念,用起來才能作到心中有數。雖然JMeter的用戶文檔講得很詳細,可是那裏畢竟沒有結合JMeter全部概念講一個綜合應用的例子(實際測試中的 Test Plan每每須要綜合運用不少概念的),不失爲一個小小的遺憾。 本文結合一個webapplication測試的例子介紹JMeter的完整概念。javascript

 

JMeter使用的概念有:Thread,Sampler,LogicController, Config Element(配置元素),Timer,Pre-/Post Processor,Assertions, Listener。css

 

從總體結構上來說,首先一個測試就是一個Test Plan(測試計劃),每個Test Plan能夠設定Thread Group,Thread Group下面的樹形結構就是下面設置的測試配置信息。html

下面是本實例的一個總體配置:java

(圖1)web

 

一個Thread模擬單個測試用戶,例以下面的是ThreadGroup元素中的配置信息,它表示模擬100個用戶的訪問,ramp-up表示100個用戶線程5秒鐘以內才能所有啓動完成。ajax

(圖2)正則表達式

 

*****Sampler是核心概念:express

要經過http訪問web server,免不了須要使用Sampler(對於這裏的Web測試是HttpRequest Sampler)。所謂Sampler就是對Server的訪問,至關於瀏覽器(可是不解析html/css和javascript),每一次訪問請求得 到的響應在JMeter中做爲一個Sample保存並經過Listener讓用戶察看HTTP response的結果和統計圖表。因此Sampler是JMeter的核心概念。其餘的概念都是圍繞着Sampler服務的,好比Pre- processor(預處理器)能夠在Sampler向Server發送請求以前定義一些變量或作處理(好比本例圖1中的User Parameters);而Post-Processor能夠在獲得Response以後做一些操做(好比本例圖1中的「RegEx extractor - tableuseid」)。圖1中包括的Sampler有四個:編程

1) Login.action(在Once Only Controller下面)json

2) Main.action (位於Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位於SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位於SimpleController下面)

 

下面圍繞着以上四個samplers介紹JMeter的其餘概念。

 

*****如何設置多個HTTP Requests的缺省值:

首先在測試一個web application的時候,每一個Sampler都須要設定web server的主機IP地址等信息,而這些信息在每一個Sampler中是相同的,所以能夠經過一個Config Element—Http Request Defaults將這些共同信息(好比Web Server主機IP)提取出來保存,而後在上面四個Samplers中就不須要再設置了。

(圖3)

 

*****Once Only Controller:

Login.action是web程序的login功能,每個用戶(Thread)都須要單獨login,可是在一個 用戶的全部HTTP requests中(即一個session)只須要login一次。所以若是能夠將這個Sampler放到Once Only Controller下面,保證login只在一個session中執行一次。Once Only Controller是JMeter中的另外一個概念--Logic Controller。Logic Controller相似於編程語言中的for循環那樣的控制結構,它能夠控制樹形結構下面包含的Samplers的執行方式。經常使用的Logic Controller有Simple Controller(就是一個簡單的容器,將樹形結構下面的Samplers放到一塊兒,見圖1), 這裏的Once Only Controller,還有Interleave Controller(上一次執行下面的一個某個Sampler A,下一次執行下面的一個某個Sampler B)等。

下圖是Login.action這個Sampler的設置:

(圖4)

 

*****Sampler中每個用戶能夠有不一樣的URL參數值:

從上圖中能夠看到在調用login.action的URL參數中使用了一個參數funcType,它的值是從另一個變量${FUNCTYPE}中 讀取的。那麼FUNCTYPE變量在那裏定義的呢?答案是User Parameters中定義了該變量。前面說過,User Parameters是一個Pre-processor,只在Sampler執行以前使用該元素,因此在執行Login.action以前,其中一個變量 FUNCTYPE能夠從User Parameters中設置。在本例中,咱們模擬了100個用戶,但願每個用戶能夠從funcType的兩個值{1,2}中依次選一個,所以User Parameters的做用就是在每一個Sampler執行以前,給它設置一個funcType值,每個funcType變量能夠設定多個用戶,好比本例 中設置了user1和user2,可是實際上測試用戶數是100,這種狀況下就輪流從user1和user2中選取(好比用戶3使用user1的值,用戶 4使用user2的值,用戶5使用user1的值)。

下圖是本例中UserParameters的設置:


(圖5)

 

*****Cookie管理:

幾乎全部的Web Application都須要cookie管理,JMeter能夠模擬瀏覽器的作法管理cookie,只須要添加一個Config Element – HTTP Cookie Manager(如上圖所示)。

 

*****如何定義變量:

另外在Simpler Controller下面有一個UserDefined Variables,它也是一個Config Element。在本例中,因爲其中一個Sampler 「ClickTable(afterSelectTable_ajax.action)」須要一個參數tableId做爲輸入,可是又不但願把這個參數值 hard code進去,所以設置一個用戶定義的變量TABLEID(注意圖中變量的做用域是Simpler Controller下的三個Samplers,可是隻有Main.action中用到該變量):

(圖6)

 

*****如何在Http Request Sampler中使用變量:

而後在Sampler 「Click Table(afterSelectTable_ajax.action)」中能夠按${TABLEID}的方式引用這個變量:

(圖7)

 

*****Regular Expression Extractor提取Http Response信息並保存成變量:

除了上面使用User Defined Variables的方法定義變量以外,本例中仍是用了Regular Expression Extractor從HTTP response的輸出結果中獲取一個字符串做爲一個變量。Regular Expression Extractor是JMeter中的另外一個概念—Post-processor,它的做用是獲得HTTP響應後,對結果(好比一個html標籤頁面的內 容或json輸出數據等)進行處理,經過regular expression抽取字符值,存成一個變量給後面的Sampler使用。

例如在Click Table(afterSelectTable_ajax.action)這個Sampler執行完一次HTTP Request以後獲得以下的HTTP Response(一個json格式的輸出):

 

{"free":false,"hasError":false,"singleEntry":true,"table_nr":"05","tableid":5,"tableuseid":130}

 

如今要獲得tableuseid的值130,能夠用這樣一個regular expression:

^.+?"tableuseid":([^} ,]+).*$

上面括號中的內容就是提取130的值,用括號的做用是能夠把該值做爲一個組,並存成一個變量以便在下一個Sampler--CreateOrder(doOpenGuestTable_ajax.action)中使用。

注:能夠用下面的perl命令行交互式測試正則表達式:
perl -n -e '/^.+?"tableuseid":([^} ,]+).*$/ && print "$1\n"'


(圖8)

 

*****在另外一個Sampler中使用RegEx提取的變量:

按照上圖的設置,在CreateOrder(doOpenGuestTable_ajax.action)中如何引用該變量呢?根據JMeter的用戶參考文檔,應該是${tableuse_g1}。

下圖是該變量在Sampler--CreateOrder(doOpenGuestTable_ajax.action)中的使用。

(圖9)

 

 

*****JMeter的函數:

在上圖中,還有一個URL參數nocache,它使用一個函數${__time}獲取client中的當前時間。

 

*****Timer:

在上圖的Sampler--CreateOrder(doOpenGuestTable_ajax.action)下面 有一個constant timer--delay executing CreateOrder,它的做用是在執行完上一個Sampler(這裏的Click Table)以後,延時一個時間段,這樣不至於給服務器形成過多的影響。

 

*****HTTP Response的html內容校驗:

在CreateOrder(doOpenGuestTable_ajax.action)的HTTP響應(一個html標籤頁面的內容)中,咱們需 要檢測是否包含一個單詞「Beer」,若是沒有這個單詞,說明HTTP響應出錯。這就是自動化的功能測試的思想。可使用JMeter的另一個概念— Assertion完成這項工做,本例中使用ResponseAssertion,以下圖所示:

(圖10)

 

*****測試結果的顯示:

測試結果能夠輸出每個Sample的HTTP Request/Response的內容,也能夠用圖表統計全部的Samples,並保存到文件中。在JMeter中使用Listener這個概 念,Listener的做用就在每一個Sample執行以後根據設置作相應的統計處理。本例中使用到的Listener有兩個:View Results Tree和Graph Results。

 

參考圖1(爲方便起見,從新貼在下面),總結一下本例Test Plan中用的元素和它們在JMeter中的概念對應關係:

 

1. Thread: 模擬一個用戶

2. Sampler:

1) Login.action(在Once Only Controller下面)

2) Main.action (位於Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位於SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位於SimpleController下面)

 

3. Logic Controller:Once Only Controller和SimpleController
4. Config Element: HTTP Request Defaults, HTTP Cookie Manager和User DefinedVariables

5. Timer: delay executing CreateOrder

6. Pre-Processor:User Parameters

7. Post-Processor:RegEx extractor - tableuseid

8. Assertions: Response Assertion

9. Listener: View Results Tree和Graph Results

總結:以上介紹的是JMeter的核心概念,JMeter還有不少其餘功能,好比分佈式測試(在一臺機器上測試受單機的性能限制,每每壓力測試結果 不能反映真實狀況),無圖形界面(non-GUID)的測試等等。可是掌握了這些核心的概念,已經能夠自如地應對普通的測試方案了。

相關文章
相關標籤/搜索