? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?初識測試計劃與線程組
前言:
Jmeter是一項非常優秀的,開源的性能測試工具。他的工作原理與其他工具的工作原理是一樣的,模擬用戶操作場景,通過負載發生器,以
多線程的方式進行運行腳本,最后收集測試過程中的數據,生成報表數據,分析系統性能。
一、性能工具的工作原理:
Jmeter工具和其他性能工具在原理上完全一致,工具包含以下四個部分:
(1)負載發生器:用于產生負載,通常以多線程或是多進程的方式模擬用戶行為。
(2)用戶運行器:通常是一個腳本運行引擎,用戶運行器附加在線程或進程上,根據腳本要求模擬指定的用戶行為。
(3)資源生成器:用于生成測試過程中服務器、負載機的資源數據。
(4)報表生成器:根據測試采集的數據生成報表,提供可視化的數據顯示方式。
在了解了Jmeter的工作原理后,我們來認識一下,如何使用Jmeter工具來完成一次完整的性能測試,通過情況下,一次完整的性能測試要通過測試分析、測試準備,測試執行、測試總結四個步驟。
二、Jmeter 測試計劃 的元素
2.1、測試計劃
任何測試計劃(test plan)的第一個元素,所有控制器(Controller)和取樣器(Sampler)必須作為線程組的子元素,其它元素,如監聽器(Listener),可直接作為測試計劃的子元素,這種情況下,子元素將作用于所有線程組,如圖,圖形結果監聽器作用于所有線程組
2.2 ?線程Threads(Users)
線程組主要用于控制執行測試的線程數量,如圖,允許:
1) 設置線程數量
2) 設置ramp-up period
3) 設置執行測試的次數
(1) 取樣錯誤后要執行的動作
a.繼續:默認選項,出錯后后續的線程繼續運行
b.Start Next Thread Loop:出錯后啟動下一組線程運行
c.停止線程:后續的線程停止運行,但是會返回出錯前的結果
d.停止測試:與停止線程的差異在于不返回出錯前的結果
(2)線程數:虛擬用戶數,代表發送請求的用戶數,一個線程數占用一個進程或線程。
(3)Ramp-Up Period(in seconds)-準備時長
-所有線程在多少時間內啟動,單位是秒,為0時代表一次請求即并發。如果線程數為30,Ramp-Up Period為2,由表示30個用戶線程在2s內全部啟動,這個設置,讓用戶并發廣義上的并發,也就是說是在2s內,這30個虛擬用戶,每個用戶以2/30s的間隔登錄系統,達到多用戶并發在線的狀態。
TIPS:ramp-up period時間設置要適當,不能太短,防止測試開始時會產生過大的工作負載,也不能太長,必須保證最后一個線程在第一個線程結束之前開始運行(除非故意要那樣做).一般情況下,可設置Ramp-up period = 線程數,在此基礎上,根據需要上下調整
2. 控制器(Controllers )
Jmeter擁有兩種類型的控制器:取樣器(Sampler)和邏輯控制器(Logical Controller),它們
(4)循環次數
-每個線程發送請求的次數。如果線程數為30,循環次數為8,那么每個線程發送100次請求,那么此次的性能測試計劃共向應用系統發送業務請求次數是30*100*8=24000次,以達到業務高請求。
(5)Delay Thread Creation until needed:直到需要時延遲線程的創建
(6)調度器:設定測試運行時間:比如,我們在要設置此線程組的執行時長為30分鐘,我們可以設置腳本運行的開始時間及結束時間,在工具欄點擊啟動按鈕,此測試計劃便可按指定的時間執行測試。
2.3 控制器(Controllers )
Jmeter 擁有兩種類型的控制器:取樣器(Sampler)和邏輯控制器(Logical Controller)
Sampler:用于發送請求給服務器.例如,如果你想發送一個HTTP請求,添加一個“HTTP請求”Sampler,按它們出現在測試計劃tree視圖中的順序執行Sampler。
Sampler包含:
FTP Request
HTTP Request
JDBC Request
Java object request
LDAP Request
SOAP/XML-RPC Request
WebService (SOAP) Request
……
如果要發送多個相同類型的請求(比如,HTTP請求)到相同服務器,可考慮使用一個默認配置元件.
一個控制器有一個或多個缺省的默認元件。
記得添加一個監聽器到測試計劃以便查看或存儲請求結果到磁盤.
添加Asertion到Sampler,查看Jmeter對請求響應的基本驗證.例如,在web應用壓測中,服務器
可能返回一個成功的"HTTP Response"的代碼,但是頁面可能有錯誤,或者缺失.你可以添加一
個assertion來檢查某些html標簽(tag),符串等.(可用正則表達式)
Logical Controller:用于自定義發送請求的邏輯.例如,可以添加一個交替邏輯控制器(Interleave Logic Controller)來交替使用兩個“HTTP請求”Sampler
2.4. 邏輯控制器(Logic Controller )
Logical Controller用于自定義發送請求的邏輯,可改變它的子元素的請求順序,重復次數等.
首先,僅一次控制器(Once Only Controller)控制登錄請求僅被執行一次,后續的迭代將跳過登錄請求的執行
登錄后,下一個Sampler將加載搜索頁面(設想用戶登錄web應用后,轉到搜索頁面進行搜索),
加載搜索頁面后,我們進行搜索,實際上,我們想進行兩次不同的搜索。然而,每次搜索完成我
們都想重新加載搜索頁面,本可通過4個簡單的HTTP請求Sampler(加載搜索頁面,搜索“A”,
加載搜索頁面,搜索“B”)來做這件事,取而代之,我們使用交替控制器(InterleaveController),它元素順序,每次執行一個請求
注意:交替控制器的子元素--HTTP請求默認值.設想搜索"A"和搜索"B"共享統一的PATH信息(一個HTTP請求規格包含domain, port, method, protocol, path, and arguments, 加其它可選項).兩個都是搜索請求,訪問相同的后臺搜索引擎.與其在兩個”HTTP請求”Sampler的PATH
輸入域中配置相同的信息,不如抽取那些相同的信息到單一配置元件中。當交替控制器執行搜索“A”或搜索“B”請求Smapler時,它將”HTTP請求默認值”Sampler中PATH輸入域的值填寫到
搜索請求Sampler中對應輸入域。所以,我們保留PATH輸入域為空,并把信息放到HTTP請求默認值配置元件中。
下一個元素為另一個”HTTP默認請求值”,添加到線程組,作為其子元素.線程組有個內置的邏輯
控制器,保證它可以正確使用配置元件。它可填補任意請求Sampler的PATH空白.在web測試中
保留所有HTTPqi Sampler元素的DOMAIN輸入域為空白,取而代之,把那些信息放入添加到線程
組的“HTTP默認請求值”元件,這樣做,僅改變一個輸入域,就可以在不同服務器上測試你的應用程序,否則,你每次都必須編輯每個取樣器.
最后的元素為HTTP Cookie Manager.Cookie Manager必須添加到所有web測試中,否則,Jmeter將忽略cookie.在線程組中添加cookie管理器,確保所有HTTP請求取樣器共享相同的cookie邏輯控制器可以混用來實現不同的結果。查看內置邏輯控制器列表
2.5. 測試片段(Test Fragments)
Test Fragment為一種特殊類型的控制器,和tree視圖中和線程組處在同一層次。和線程組不同的是,除非被模塊控制器(Module Controller)或者包含控制器(Include_Controller)引用,否則不會被執行
2.6. 監聽器(Listeners)
Listeners提供對Jmeter在運行測試案例時采集的信息訪問.圖形結果樹(Graph Results)監聽器在圖形上繪制響應時間;“查看結果樹(View Results Tree)”監聽器顯示request和response取樣器的詳細信息,且可展示基于HTML和XML的響應表現形式.其它監聽器提供,摘要或匯總信——此外,監聽器可指示保存數據到一個文件,供后續使用。每個監聽器提供一個輸入域來填寫,保存數據的文件
2.7?定時器(Timers )
Jmeter不間斷的線程發送每個請求。建議添加一個定時器到線程組,來設置一個延遲。如果你不添加延遲,Jmeter可能在一段很短的時間內制造大量請求壓倒服務器.定時器將導致Jmeter在發送定時器作用范圍內的每個sampler前等待一段時間。如果添加多于一個定時器到線程組,Jmeter采用定時器的設置的延遲時間的總和,執行每個請求取樣器前等待一段時間,該時間為前面的時間總合。定時器可以添加到sampler或controller以約束他們要影響的sampler.
為了在測試計劃中的某個單一位置,提供一個等待,可用Test Action Sampler.
2.8. 斷言(Assertions )
斷言允許你預測從被測服務器接收的真實結果.使用斷言,可測試你的應用程序是否返回你要的結果.
例如,你可以預測查詢返回包含一些特定文本.用于檢測的文本可以是Perl類型的正則表達式,
你可以指示返回包含這些文本,或者是設置的文本匹配整個響應.
可添加斷言到任意Sampler,例如,可添加檢測文本“”的斷言到HTTP請求。Jmeter將
檢測文本是否在HTTP響應中。如果Jmeter找不到文本,將標記請求失敗。
注意:斷言作用于它的作用范圍內的所有取樣器.可把斷言作為子元素添加到單個Sampler來限制斷言僅作用于某個單一Sampler
為了查看斷言結果,添加一個Assertion監聽器到線程組。失敗的斷言也會顯示在Tree視圖(Tree View)和Table Listener中,例如,在匯總和摘要報告中,將統計錯誤%age
9. 配置元件(Configuration Elements )
配置元件和Sampler緊密合作。它不發送請求[HTTP(S) Test Script Recorder除外],一個配置元件可被它所處的tree分支下的元素訪問.
例如,如果你把一個HTTP Cookie Manager放在一個簡單邏輯控制器下,該HTTP Cookie Manager僅能被該簡單邏輯控制器的HTTP請求訪
問(見figure 1)--可被HTTP請求"Web Page 1" 和"Web Page 2"訪問,但不能被"Web Page 3"訪問.
此外,在一個tree分支內的元素比位于“父”分支的相同元素的優先級高.例如,我們定義了兩個HTTP請求默認值元件,"Web Defaults 1"和"Web Defaults 2". 由于我們把 "Web Defaults1"放在一個循環控制器內(loop controller),僅"Web Page 2"可訪問它.其它HTTP requests
將使用"Web Defaults 2", 因為它放在線程組(所有tree分支的“父”分支)User Defined Variables元件則不一樣,不管它在哪個地方,測試開始時被執行,為了簡單起見,建議把它放在線程組開頭.
10. 前置處理器(Pre-Processor Elements )
一個Pre-Processor優先于Sampler Request.如果一個Pre-Processor關聯到一個Sampler,那么它優先于sampler運行. Pre-Processor最經常用來修改Sampler請求的的設置或更新非來字響應文本的變量.
11. 后置處理器 (Post-Processor Elements )
比Sampler Request后執行。常用來處理響應數據或從中提取值
12. 執行順序 (Execution order )
0 配置元件
2 前置處理器
3 定時器
4 Sampler
5 后置處理器(除非取樣器請求結果為空)
6 斷言(除非取樣器請求結果為空)
7 監聽器(除非取樣器請求結果為空)
注意:定時器,斷言,前、后置處理器僅在有Sampler的情況下才被執行,Logic Controllers 和
Samplers按tree視圖中的順序執行。其它元素依據他們的所處的作用域范圍和類型進行處理,
同種類型的元素按他們出現在tree視圖的順序進行處理
例如
Controller
Post-Processor 1
Sampler 1
Sampler 2
Timer 1
Assertion 1
Pre-Processor 1
Timer 2
Post-Processor 2
執行順序為:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1
Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1
13. (作用范圍 Scoping Rules )
JMeter測試樹包含的元素是分層次和有序的。一些元素有嚴格的層次之分(Listeners, ConfigElements, Post-Procesors, Pre-Processors, Assertions, Timers),一些有順序之分 (controllers, samplers).當創建測試計劃時,創建有序取樣器請求列表 (通過 Sampler)
代表將要執行的一系列步驟。通常在controller內按順序組織這些請求: ?執行順序為:One,Two, Three, Four
一些controller影響他們子元素的順序,可以查看具體controller說明 the component ?reference .其它元素是分層的。
比如,Assertion.如果它的父元素是個請求,那么它作用于那個請求,如果是個控制器,那么它作用于控制器下的所有子請求元素
Assertion #1作用于One,而Assertion作用域Two,Three
另一個例子,定時器
請求根據他們將被執行的順序進行命名. Timer #1作用于Two, Three和Four . Assertion #1
僅作用于Three. Timer #2影響所有請求.
14. 屬性和變量 (Properties and Variables )
JMeter properties定義在jmeter.properties (see Configuring JMeter for more
details).
屬性對Jmeter來說是全局的,主要用于定義一些缺省的Jmeter使用設置.例如,屬性
remote_hosts定義Jmeter將遠程運行的服務器.屬性可以被定義在測試計劃中--見Functions
- read a property - 但不是用于指定線程的值.
Jmeter為針對每個線程來說是局部的.對每個線程來說可能是相同的,也可能是不同的。如果某
個變量被線程更新,僅該線程變量的拷貝被更改。例如,正在表達式提取器后置處理器(Regular Expression Extractor Post-Processor)根據它的線程讀取的sample設置變量值,這些變量值可供后續的其它線程使用。關于怎么引用變量和函數的更詳細信息查看Functions and Variables
注意:測試計劃中定義的變量和User Defined Variables配置元件,在啟動時就對提供給整個測試計劃. 如果多個UDV元素定義了相同變量,那么最后一個起作用。一旦啟動線程,變量的初始設置被拷貝到每個線程.其它元素例如用戶參數前置處理器(User Parameters Pre-Processor)或正則表達式后置處理器,可用來重定義變量或創建新的變量.這些重定義僅作用于當前線程.
setProperty函數可用于定義一個Jmeter屬性。對測試計劃來說是全局的,在不同線程之間傳
遞信息.
變量和屬性都是大小寫敏感的。
15. 使用變量進行參數化測試 (Using Variables to parameterise tests )
例如,在測試中定義如下變量
HOST www.example.com
THREADS 10
LOOPS 20
可在測試計劃中以${HOST} ${THREADS}等方式引用它們。如果你稍后想改變host,僅改變HOST
變量對應的值即可。變量值的少時,這很有效,當數量多時則需要用屬性來定義變量的值,例如
HOST ${__P(host,www.example.com)}
THREADS ${__P(threads,10)}
LOOPS ${__P(loops,20)}
可命令行方式改變一些變量或所有變量的值,如下:
jmeter ... -Jhost=www3.example.org -Jloops=13
參考連接:
http://jmeter.apache.org/usermanual/test_plan