? ? ? ? 應項目組要求對負責的搜索平臺做性能測試,當時測試組前輩推薦使用jmeter,和jmeter由此結緣。當然學習過程中,知識儲備少,也順帶學習了很多其他相關的知識。這篇博客,是將平時學習的關于jmeter一些皮毛基礎和使用技巧整合下來,方便自己回顧的同時方便其他同行參考。
一、優點
1、開源工具,可擴展性非常好。
2、高可擴展性,用戶可自定義調試相關模塊代碼。
3、精心簡單的GUI設計,小巧靈活。
4、完全的可移植性和100%純java。
5、完全swing和輕量組件支持(預編譯的HAR使用javax.swing.*)包。
6、完全多線程框架,允許通過多個線程并發取樣以及單獨的線程對不同的功能同時取樣。
7、支持腳本取樣器。
二、安裝及下載
jmeter官網下載URL:Apache JMeter - Download Apache JMeter,目前最新版本是5.0版本,jmeter本身不需要安裝,只需要配置好JDK環境,然后在在jmeter文件中的bin文件中打開jmeter.bat文件即可。最新版本,建議配置的JDK最好用1.8及以上版本。
JDK官網下載URL:Java SE Development Kit 8 - Downloads
jmeter官網學習文檔URL:Apache JMeter - User's Manual
三、基礎構成
1、組成部分
1)負載發生器:產生負載,多進程或多線程模擬用戶行為。
2)用戶運行器:腳本運行引擎,用戶運行器附加在進程或線程上,根據腳本模擬指定的用戶行為。
3)資源生成器:生成測試過程中服務器、負載機的資源數據。
4)報表生成器:根據測試中獲得的數據生成報表,提供可視化的數據顯示方式。
2、基本概念
2.1測試計劃(test plan)
描述一個性能測試,包含本次測試所有相關功能。
2.2.threads(users)線程
Setup thread group:一種特殊類型的線程,可用于執行預測試操作。即執行測試前進行定期線程組的執行。
Teardown thread group:一種特殊類型的線程,可用于執行測試后動作。即執行測試結束后執行定期的線程組。
Thread group:通常添加使用的線程,一般一個線程組可看做一個虛擬用戶組,其中每個線程為一個虛擬用戶。
2.3測試片段(test fragment)
2.5版本之后新增的一個選項,是一種特殊的線程組,在測試樹上與線程組一個層級,但是它不被執行,除非它是一個模塊控制器或者被控制器所引用時才會被執行。
2.4控制器
Jmeter有2種控制器:取樣器(sampler)和邏輯控制器(Logic Controller)。
作用是用這些原件驅動處理一個測試。
1)取樣器(Sampler)
性能測試中向服務器發送請求,記錄響應信息,記錄響應時間的最小單元,jmeter原生支持多種不同的的sample,
如?HTTP?Request?Sampler?、?FTP??Request?Sampler 、TCP??Request?Sampler 、JDBC?Request?Sampler?等。
每一種不同類型的?sampler?可以根據設置的參數向服務器發出不同類型的請求。
Java?Request?Sampler?和?Beanshell?Request?Sampler?是兩種特殊的可定制的?Sampler?(暫不討論)。
2)邏輯控制器(Logic Controller)
Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。
意思是說,邏輯控制器可以控制采樣器(samplers)的執行順序。由此可知,控制器需要和采樣器一起使用,否則控制器就沒有什么意義了。放在控制器下面的所有的采樣器都會當做一個整體,執行時也會一起被執行。
邏輯控制器包含兩類原件:一類是控制Test Plan中Sampler節點發送請求的邏輯順序控制器,例如If Controller、Swith Controller、Loop Controller、Random Controller等。另一類是用來組織和控制Sampler節點的,即對測試計劃中的腳本進行分組、方便JMeter統計執行結果以及進行腳本的運行時控制等,例如Transaction Controller、Throughput Controller等。
jmeter控制器之一:
3)簡單控制器(Simple Controller)
這是Jmeter里最簡單的一個控制器,它可以讓我們組織我們的采樣器和其它的邏輯控制器(分組功能),提供一個塊的結構和控制,并不具有任何的邏輯控制或運行時的功能。
4)循環控制器(Loop Controller)
可以理解為:循環該控制器下子節點的次數。
線程組里循環次數設置了n次,循環控制器下的循環次數也設置了m次,則該控制器下的請求運行的次數是(n*m)次。
5)僅一次控制器(Once Only Controller)
在測試計劃執行期間,該控制器下的子結點對每個線程只執行一次,登錄場景經常會使用到這個控制器。
PS:將Once Only Controller作為Loop Controller的子節點,Once Only Controller在每次循環的第一次迭代時均會被執行。
6)ForEach控制器(ForEach Controller)
ForEach控制器一般和用戶自定義變量一起使用,其在用戶自定義變量中讀取一系列相關的變量。該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。
參數:
? ? ? ?Input Variable Prefix:輸入變量前綴
? ? ? ?Output variable name:輸出變量名稱
? ? ? ?Start index for loop(exclusive):循環開始的索引(這里如果不填寫,默認從1開始,如果沒有1開始的變量,執行時會報錯)
? ? ? ?End index for loop(inclusive):循環結束的索引
? ? ? ?Add”_”before number:輸入變量名稱中是否使用“_”進行間隔。
用戶自定義變量:
變量名前綴為ForEach Controller中Input variable prefix定義的name +?下劃線(上圖中我們勾選了下劃線)+數字編號
執行結果:
總共執行了3次,每次執行時會把獲取到的變量值賦值給輸出變量outNmae,其它地方可以通過${outNmae}進行調用。
7)事務控制器(Transaction Controller)
事務控制器會生產一個額外的采樣器,用來統計該控制器子結點的所有時間。
應用場景:?完成一個完整的頁面請求或一組請求
參數:
? ? ? ? ?Generate parent sample:勾選后,所有的結果將在父結點中展示(選中這個參數結果展示如下圖紅框,否則顯示為下圖藍框)。
? ? ? ? ?Include duration of timer and pre-post processors in generated sample:選中這一項會統計定時器(timer)的時間,否則只統計采樣器(sample)的時間。
jmeter控制器之二 :
8)If?控制器(If Controller)
? ? ? ? 根據給定表達式的值決定是否執行該節點下的子節點,默認使用javascript的語法進行判斷(如下圖紅框內的文字)。
參數:
? ? ? ? Interpret Condition as Variable Expression?:選中這一項時表示:判斷變量值是否等于字符串true(不區分大小寫)。
? ? ? ? Evaluate for all children:如果選中這一項,在每個子結點執行前都會計算表達式 。
9)Switch控制器(Switch Controller)
Switch控制器通過給該控制器中的Value賦值,來指定運行哪個采樣器。
有兩種賦值方式:
? ? ? ? ? ?第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來確定執行哪個元素。
? ? ? ? ? ?第二種是直接指定子元素的名稱,比如采樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
? ? ? ? ? ?當Value為空時,默認執行第1個子節點元素。
10)吞吐量控制器(Throughput Controller)
控制其下的子節點的執行次數與負載比例分配,別被名字迷惑了,跟吞吐量沒任何關系。也有兩種方式:Total Executions和Percent Executions。
Total Executions:設置運行次數,整個測試計劃中總計執行次數。
Percent Executions:設置運行比例(1~100之間),整個測試計劃中總計執行百分比。
Throughtput:?設計的數值。
Per User:?依據網上的說明在選擇Total Executions時,勾選時會在每個線程中執行的次數。但在3.0版本中嘗試使用無效 。
11)隨機控制器(Random Controller)
隨機執行其下的某個子結點,隨機選擇控制器中的請求進行執行。
應用場景:?頁面的隨機訪問。
配置說明:ignore sub-controller blocks:?忽略子控制器 。
12)隨機順序控制器(Random Order Controller)
隨機執行其下的所有子結點。與Random Controller不同的是,這個控制器會先將需要隨機的內容均執行一遍,但次序不定。
應用場景:?頁面的隨機訪問,但均需要訪問,且次序不限。
jmeter控制器之三:
13)Critical Section Controller?關鍵部分控制器
用于核心部分的控制,確保其子節點下的取樣器或控制器在一個線程中僅會執行一次。
應用場景:?用戶登錄。
配制說明: Lock name:?鎖名稱,這里可以填入其子節點下執行的線程的名稱,這個線程作為一個全局鎖存在。
14)Include Controller?引用外部測試計劃控制器
應用場景:?測試過程中,需要引用外部的測試計劃。
配制說明:Include Test Plan-Filename:?選擇需要引入的外部測試計劃文件 。
15)Interleave Controller?間隔控制器
也稱交替控制器,使該控制器包含的取樣器步驟交錯執行在每個循環中,每個線程用戶僅執行一次控制器內的請求,線程用戶依據循環的次數請求控制器中的請求數。
配制說明:ignore sub-controller blocks:?是否忽略子控制器 。
16)Module Controller?模塊控制器
模塊控制器,用于跳轉到選定的控制器位置并執行對應的控制器。
應用場景:?業務邏輯的跳轉。
配制說明:Module to Run:?選擇需要跳轉到的目標控制器 。
尋找目標元素(Find target element):尋找測試計劃中需要特定測試的元素,模塊;也可理解為該控制器可以控制已經封裝好的模塊元素。
PS01:一個測試計劃由一個控制器和所有的測試元素(取樣器等)組成,測試計劃可以位于任何線程組或工作臺;如果計劃位于線程組,則可以禁用其他控制器,防止正在運行的測試計劃被影響(除了模塊控制器)。
PS02:模塊控制器的優勢在于:當存在多個線程組時,該控制器可以輕松切換,只需要選擇對應的取樣器,方便快捷,替代了創建很多測試計劃的繁瑣操作。
PS03:任何一個模塊所用的控制器名字必須唯一,因為其名字被用來找到目標控制器時重新加載;出于這個原因,最好保證控制器名字不同,否則執行測試時候可能發生意外。
PS04:模塊控制器與遠程測試不應使用或非gui測試與工作臺部件,因為工作臺測試元素并沒有測試計劃的一部分?jmx?文件。 任何這樣的測試就會失敗。
17)Runtime Controller?運行時間控制器
運行時間控制器,設置控制器中的請求運行時間,單位:秒。
應用場景:?對業務請求時間進行限制。
?配制說明: Runtime(seconds):?配制需要設置的運行時間,單位秒 。
18)While Controller?循環控制器
循環控制器,與開發語言中的While功能一致。直到條件為false時,停止運行。
應用場景:?循環執行一個請求,僅判斷一種狀態下退出循環。
配制說明: Condition(function or variable):?可配制為空/LAST/變量或方法 。
可能的條件值有:
? ? ? ? 空:最后一個示例循環失敗時退出循環。
? ? ? ? LAST:最后一個示例循環失敗時退出循環。?如果之前的最后一個示例只是循環失敗,不進入循環。
? ? ? ? false:退出時(或不輸入)循環條件等于字符串“?假?”。
? ? ? ? 條件可以是任何變量或函數,最終等于字符串”?假?”。需要注意的是:條件是評估兩次,一次取樣前,一次隨機取樣。
2.5監聽器(Listener)
對測試結果進行處理和可視化展示的一系列組件,常用的有圖形結果、查看結果樹、聚合報告等。
以上的五類原件(測試計劃、線程、測試片段、控制器、監聽器)就可以構成一個簡單的性能測試腳本。
下面以訪問百度為例子寫一個測試的腳本。
步驟:
1、打開jmeter,右擊測試計劃>添加線程組。
2、右擊線程組>添加邏輯控制器>簡單控制。
3、右擊簡單控制器>添加sample>HTTP請求。
4、右擊線程組>添加監聽器>查看結果樹。
5、點擊運行/綠色的運行按鈕>查看結果樹>HTTP請求顯示綠色為請求成功,紅色為請求失敗。
PS:不是顯示綠色就是請求成功了,還要檢查請求和響應的數據是否正確。最好的辦法的是通過添加斷言的方式來判斷。
斷言:用于檢查測試中得到的響應數據等是否符合預期,Assertions一般用來設置檢查點,用以保證性能測試過程中的數據交互與預期一致。