Jmeter不可不知的知識點

                         JMeter 知識點彙總

 

 

1,現有市場工具對比

 Jmeter:javascript

·爲何選擇Jmeter?css

Jmeter和Loadrunner的對比:java

·成本:Jmeter是開源的,Loadrunner是商業mysql

·功能:Jmeter可以完成Loadrunner95%左右的功能web

Jmeter是徹底不解析HTML的,而LOADRUNNER仍是會解析HTML的。正則表達式

·易用性、用戶友好性:Jmeter不如Loadrunnersql

·性能:Jmeter也是不如Loadrunner。shell

 

·可擴展性:Jmeter優於Loadrunner。apache

 

Jmeter是Apache組織的一款使用java語言開發的開源的性能測試工具windows

 

http://jmeter.apache.org/

2,使用工具環境要求

·使用Jmeter的環境要求:

Jmeter是一款java應用,須要有JDK環境。要求java和javac的版本保持一致。

·Windows:

環境變量:

JAVA_HOME:jdk的路徑

PATH:必定要包含%JAVA_HOME%\bin

·Linux:

JAVA_HOME:jdk的路徑

PATH:必定要包含$JAVA_HOME\bin

 

區別:

·windows下,系統變量的引用使用的格式:%變量名%;Linux下引用變量的格式:$變量名.

·windows下,path的值和值之間用分號「;」進行分隔;Linux下分隔符是冒號":".

 

3,工具目錄構成

Jmeter的目錄構成:

·bin目錄:存放了Jmeter的主jar包,主程序(BAT腳本或者shell腳本),配置文件、日誌等相關資源。

·jmeter.bat:windows下啓動Jmeter的主程序。

在jmeter.bat中是能夠設置相關的JVM屬性。

 

·Jmeter-server.bat:至關於LR中的Load generator(Loadrunner agent)組件,用於聯機負載。

 

           set HEAP=-Xms512m -Xmx512m 能夠設置成   2/3 ~ 1/2

 

·jmeter.properties:Jmeter的配置文件,Jmeter中80%以上的配置項是經過該文件實現。

PS:一旦配置文件被修改,須要重啓Jmeter才能生效。

 

 

·docs目錄:存放的是Jmeter的API文檔。

 

·extras目錄:存放的是和Jmeter集成有關的一些附件。

好比說ant

 

·lib目錄:是Jmeter啓動時的默認的classpath。意味着經過Jmeter進行測試時,全部須要import的包或者類都必須存放在該目錄中。

PS:須要先放jar包,再重啓Jmeter才能生效。

 

·lib\ext目錄:存放的是Jmeter的組件和插件,包括第三方的組件和插件。須要在圖形化模式可見、可以使用的部分都須要放在該目錄下。

 

·printable_docs目錄:存放的是Jmeter的官方幫助文檔(英文版)。

4,Jmeter的使用

Jmeter的界面風格,相似於LR的tree模式。

 

4.1 使用Badboy錄製:

注意事項:

·錄製完成以後,須要經過菜單File-export to Jmeter的方式將腳本導出爲Jmeter的腳本格式--*.jmx。

·第一次使用Jmeter打開badboy錄製的腳本,須要對全部名稱和step有關的組件(循環控制器)執行一次Change Controller操做。

 

優勢:錄製過程簡單、生成的腳本簡潔(至關於LR中的HTML模式)。

 

缺點:·僅適用於B/S架構

      ·經過內置瀏覽器錄製,就會由於瀏覽器的兼容問題致使沒法錄製。

4.2 Jmeter 自帶的代理服務器錄製

 

什麼叫錄製?錄製的本質就是工具自動抓包、自動按協議進行解析、自動生成腳本

 

操做步驟:

第一步:右鍵 測試計劃組件,添加 Threads(Users)-thread group組件。

 

第二步:右鍵 測試計劃組件,添加 配置元件--http cookie管理器 組件。

 

第三步:右鍵 工做臺,添加 非測試元件-http代理服務器(http proxy server)組件。

 

第四步:配置而且啓動http代理服務器。

http代理服務器的配置選項:

·端口:要求在本地沒有被其它應用所佔用。

使用命令:netstat -an

 

·目標控制器:是用來指定錄製的腳本的生成位置。

建議選擇第一步所添加的線程組組件。

 

·包含模式:只錄制所指定的模式

·排除模式:不錄製所指定的模式。

包含模式和排除模式容許咱們經過正則表達式的方式對要錄製的http的請求進行過濾。

由於Jmeter自己就是HTML模式,全部的靜態資源都是能夠屏蔽掉。通常建議只對常見的類型進行屏蔽:

js、css和圖片(.jpg\.png\.gif\.bmp)

要過濾js類型的資源請求,正則表達式以下:

.*\.js.*

 

第五步:設置IE選項,啓動本地代理。

IE選項-鏈接-局域網設置-爲LAN使用代理服務器。

·地址:localhost

·端口:和第四步中的端口保持一致。

PS:和要測試的服務器端口無關。

PS:前5個步驟,基本上沒有前後順序。

 sampleresult.default.encoding=utf-8

 

注意事項:

·必定要合理運用好包含模式和排除模式:

包含模式:

通常是指定測試服務器的域名便可。

假設被測的服務器的域名是:192.168.1.10

則包含模式中能夠填寫:

.*192\.168\.1\.10.*

 

·在錄製時,儘可能將全部和錄製無關的網絡應用都關閉。

 

·錄製完成以後,必定要記得中止代理服務器、還原IE選項。

 

優勢:錄製過程可控。

      適用於全部使用http協議的應用。

      不存在瀏覽器的兼容問題。

 

缺點:

·包含和排除模式使用不當,會致使沒法錄製。

·只適用於http協議。

5,Jmeter 工具組件說明和使用範圍

·Jmeter的組件:

Jmeter的腳本是由Jmeter所提供的各類組件構成的。

 

組件和組件之間有相互的包含、做用的關係。

 

·測試計劃:

   在Jmeter中,全部可運行的組件都必須位於測試計劃下。

   在測試計劃組件中,通常能夠定義全局的一些變量、控制線程組的執行方式等。

 

 

在測試計劃下能夠添加的組件有八大類型:

·Threads(Users):線程組件,Jmeter實現虛擬用戶的方式是線程方式。

線程組件默認有三種:setUp thread group、thread group、tearDown thread group,這三種線程組本質上都是同樣的,均可以實現多線程的效果。若是在測試計劃下只存在一種的話,是沒有區別的。區別在於同時存在於一個測試計劃下時,會存在執行前後的區別:setUp線程組執行完畢,再執行thread group、最後執行tearDown線程組。

 

·線程組:是用來指定當前線程組的執行計劃的。

·線程數:就是虛擬用戶數

·Ramp-Up Period:設定啓動全部線程所需的總時間。

PS:在Jmeter中,線程啓動的方式是採用平均方式,線程的最小單位是1.即最終的效果是1線程/N秒. N=線程數/Ramp-Up

  ·線程組只能指定線程第一次啓動時的間隔時間,不能控制以後的循環過程當中線程的間隔。

 

·循環次數:每個線程執行線程組內的組件的次數。

 

·調度器:容許咱們設置線程組計劃的啓動時間和持續時間。

PS:·調度器是在點擊啓動按鈕以後生效。

    ·啓動延遲的優先級別高於啓動時間。

    ·持續時間的優先級被高於結束時間。

    ·線程的中止條件是:循環次數到達或者時間到達。

 

 

·Test Fragment:測試片斷,在測試片斷下能夠添加的組件類型和線程組是徹底同樣的。測試片斷下的腳本自己是不會運行,必須被調用纔會執行。

對於測試片斷的調用有兩種狀況:

·腳本內的調用:通常是經過邏輯控制器-模塊控制器 實現。

·腳本外的調用:通常是經過邏輯控制器-Include Controller 實現。

 

 

·邏輯控制器:是用來控制Jmeter中各個組件的執行邏輯的。

 

·Sampler:取樣器。就是請求,是各類協議的請求的模板。

是腳本中的必加組件。

 

 

·配置元件:用來配置腳本運行時所需的一些環境值的,配置元件是全局的,是在Sampler運行以前編譯執行的。

 

·定時器:

 

·前置處理器:

 

·後置處理器:

 

·斷言:

 

·監聽器:

 

這六種組件單獨存在是沒有意義的,他們都是爲Sampler組件服務的。定時器、前置處理器、後置處理器、斷言、監聽器這五種組件對於Sampler的做用都是和做用域有關。

6,腳本做用域

和做用域有關的組件都是會對其父組件、全部的同級組件和同級組件的子組件有效(做用)。和組件在測試計劃下出現的前後次序無關的。

 

其中:

·定時器、前置處理器是運行在其做用域內的每個請求以前,和組件自己的前後次序無關,並且運行次數等於做用域內的請求數量。

·後置處理器、斷言是運行在其做用域內的每個請求以後,和組件自己的前後次序無關,並且運行次數等於做用域內的請求數量。

7,腳本處理

腳本須要的處理有:參數化、關聯、事務、檢查點、思考時間、集合點。

 

參數化:爲了實現不一樣用戶的不一樣請求;即邏輯相同、數據不一樣

·在Jmeter中、對於變量、參數、函數的使用都是遵循相同的調用格式:${變量名}、${參數名}、${函數名(形參...)}

·在Jmeter的組件中,通常來講,全部鼠標點擊能夠輸入的地方均可以作參數調用,均可以實現參數化。

 

在Jmeter中,參數化的實現方式通常有兩種:

·函數方式:

使用Jmeter所提供的一些函數來生成參數值。通常建議經過函數助手對話框來實現。

_javascript()函數容許咱們使用js代碼來生成一些參數值,可是要求最後一句話是一個變量或者變量表達式。這個函數會自動返回最後的變量或者變量表達式的值。

 

·文件方式:容許咱們將參數存在參數文件中,通常參數文件類型能夠是.csv或者.txt類型。經過函數或者配置元件-CSV Data Set Config組件實現讀取。

 

·CSV Data Set Config組件的配置項:

·FileName:這裏須要指定參數文件的路徑,路徑能夠是相對路徑,也能夠是絕對路徑。

PS:參數文件的路徑必須包含參數文件的全名。

 

·File Encoding:是要求和參數文件自身的編碼保持一致。

若是參數文件自己是ANSI編碼,則該處留空便可;若是參數文件自己是UTF-8編碼,則該處須要填寫UTF-8.

 

·Variable Names:參數名稱,能夠定義多個參數名稱,參數之間使用逗號分隔。每個參數會依次對應參數文件中的一列值。

·參數名稱能夠留空,若是留空的話,則參數文件的第一行值就會自動升級爲參數名稱,調用參數時就須要使用第一行的值做爲參數名來用。

 

·Delimiter:用來指定參數文件中列的分隔符。

要求和參數文件中的實際的列的分隔符保持一致。

 

·Allow quoted data?:是否容許使用雙引號來屏蔽分隔符。或者來定義一個總體的單元格數據。

 

·Recycle on EOF?:若是參數值不夠用時,是否循環使用。

 

·Stop thread on EOF?:若是參數值不夠用時,是否中止線程,該選項必須是在循環選項爲False時纔會生效。

 

·Sharing mode:是用來設置線程對於參數值的一個使用模式,共享模式:

·All threads:全部線程模式,參數文件只會生成一個副本(數組),全部線程共用該副本,採起先到先拿,順序獲取的方式。

 

·Current thread group:當前線程組模式,參數文件會根據線程組的數量生成多個副本(數組),每個線程組都擁有一個獨立的副本,線程組內的全部線程共享一個副本,採起先到先拿,順序獲取的方式。

 

·Current thread:當前線程,參數文件會根據線程的數量生成多個副本(數組),每個線程都擁有一個獨立的副本,採起先到先拿,順序獲取的方式。

 

在jmeter中,參數值的變動是受其做用域內最高級別的組件(不包含測試計劃)的執行次數決定的。

最高級別的組件執行一次,其就變動一次。

 

放在請求下,就至關於LR中的每次出現(each Occurrence)

放在線程組下或者循環控制器下,就至關於LR中的每次迭代(each Iteration)

關聯:

關聯最終要作的操做其實就是四個字:先存後用。

先存:保存服務器響應回來的一些特殊做用的值

後用:在後續的請求中使用保存的服務器動態響應的值。

 

 

A請求發送給服務器以後,服務器就會生成一些數據用來記錄A請求的操做狀態。後續的B請求中須要用到A請求所獲取的服務器的數據,就須要作關聯處理。

 

 

關聯的步驟:

第一步:找出出錯的請求

重點關心使用POST方法的請求。

PS:出錯並非指腳本運行出現error,出錯是指腳本運行沒有達到預期的功能目標。

 

第二步:過濾可疑數據

可疑數據:咱們認爲可能致使請求出錯的數據。

過濾原則:

·根據業務進行過濾

·根據鍵的名稱進行過濾

·根據值進行過濾

 

第三步:定位數據的來源

直接經過在出錯請求以前的請求的響應中查找。

找到以後,截取可疑數據的左右邊界。

由於服務器返回的數據會動態變化,可是返回數據的格式是不會變的。

左右邊界儘可能截取一些固定的,可以惟必定位可疑數據的字符串。

 

 

第四步:構建而且測試正則表達式。

在Jmeter中,要查找而且保持服務器響應的數據到參數,通常都是使用組件後置處理器-正則表達式提取器,使用的是正則表達式。

將帶左右邊界的可疑數據,直接替換爲(.*?)

 

第五步:添加正則表達式提取器

在第三步的來源的請求之下添加後置處理器-正則表達式提取器,而且完成配置。

 

 

第六步:替換

將腳本中全部的可疑數據,替換爲第五步的參數的調用格式。

可疑數據--》${引用名稱}

 

 

在Jmeter中,對於關聯的處理的原理和LR是沒有區別。

 

區別在於,Loadrunner是經過函數web_reg_save_param這一系列的函數來實現保存數據;

而在Jmeter中,是經過後置處理器-正則表達式提取器來實現。

 

 

·正則表達式提取器:

·引用名稱:就是輸出的參數的名稱,參數的值受到正則表達式、模板及匹配數字的影響。

·正則表達式:就是填寫要用來查找而且保存數據的正則表達式。

根據實際業務進行填寫。

 

·模板:這裏能夠填寫常量或者位置變量$N$

常量:最後引用名稱就會獲取常量的值。

位置變量$N$:表示將正則表達式的第N對括號所匹配的值賦值給引用變量。

·匹配數字:用來指定將第幾回匹配的值傳遞給引用變量。

等價於LR的關聯函數中的Ordinal屬性。

 

·正整數N:將第N次的模板指定的括號的值傳遞給變量。

·數字0:隨機將匹配的數據傳遞給變量。

以上兩種狀況,引用變量只會獲取一個值,能夠直接調用。

 

·負數:通常是-1,將全部匹配的數據以相似於數組的方式存入引用變量(引用變量數組):

ParamName_1=value1,ParamName_2=value2,..ParamName_N=valueN

與之同時,會自動生成一個叫ParamName_matchNr=N,用來保存匹配的數量。

通常此時就須要遍歷使用全部保存的數據,經過邏輯控制器-ForEach控制器來實現。

 

 

·缺省值:若是正則表達式匹配不到數據,則會使用缺省值,通常建議留空。

 

·事務

在Jmeter中,事務的處理是分兩種狀況的:

·要度量的操做只有一個請求:不須要作任何處理

·要度量的操做包含多個請求:就須要用到邏輯控制器-事務控制器。

 

·檢查點

通常是經過斷言組件來實現。

根據實際須要進行選擇。

 

·思考時間

通常是經過定時器組件來實現。

 

·集合點

通常是經過定時器組件-Synchronizing Timer來實現。

這裏的超時設置的是到達集合點的第一個虛擬用戶的等待超時時間。

和LR是不同的,LR中設置的超時是用戶和用戶之間的等待時間。

PS:對於檢查點、思考時間、集合點的使用,都要注意做用域問題。

八、分佈式壓力測試

操做步驟:

第一步:在負載機上啓動Jmeter-server.bat的程序

PS:通常來講Jmeter-server.bat是經過端口1099實現監聽和通訊的。若是1099端口被佔用,則須要經過修改控制機上的Jmeter的配置文件jmeter.properties中的屬性server_port來實現修改。

 

第二步:在控制機上添加負載機。

經過修改控制機上的jmeter的配置文件Jmeter.properties實現。

屬性是remote_hosts

示例:

remote_hosts=127.0.0.1

#remote_hosts=localhost:1099,localhost:2010

remote_hosts=192.168.1.9:1099,192.168.1.10:1099

 

192.168.1.9和192.168.1.10就是須要啓動Jmeter-server.bat的負載機的IP地址。1099就是負載機上的server_port.

 

第三步:重啓Jmeter,點擊遠程啓動或者遠程所有啓動。

 

 

注意事項:

·聯機負載時,腳本的運行環境是負載機的環境

所以在聯機負載時,除了Jmeter的腳本(*.jmx)之外的因素(運行環境、環境變量、jar包、參數文件等等),都必須保證負載機和控制機的同步。。

jar包:在控制機和負載機的Jmeter的lib目錄下都存放便可。

參數文件:

若是控制機和負載機的操做系統是相同類型,則可使用絕對地址。

若是不一樣,則只能使用相對路徑:

·在本地(控制機),當前路徑是指:腳本所在的目錄。

·在遠程(負載機),當前路徑是指Jmeter-server.bat所在的目錄

 

·在Jmeter中,線程組的計劃是分別、同時在不一樣的負載機上執行。

對於服務器而言:

總壓力=線程組設計的壓力×負載機的數量。

 

非GUI運行

此次咱們能夠清晰地看到每一個線程的執行狀況。
        這裏是咱們使用非 GUI 模式運行測試腳本時可使用的一些命令:

-h 幫助 -> 打印出有用的信息並退出

-n 非 GUI 模式 -> 在非 GUI 模式下運行 JMeter

-t 測試文件 -> 要運行的 JMeter 測試腳本文件

-l 日誌文件 -> 記錄結果的文件

-r 遠程執行 -> 啓動遠程服務

-H 代理主機 -> 設置 JMeter 使用的代理主機

-P 代理端口 -> 設置 JMeter 使用的代理主機的端口號

 

1,啓動本地腳本

D:\Jmeter\bin>jmeter -n -t testplan.jmx -l listener.jtl

Testplan.jmx腳本文件 或者攜帶地址的腳本 例如c:/testplan.jmx

Listener.jtl 監控文件,默認在 jmeter.bat 或 jmeter.sh 目錄下 同時也能夠 指定路徑 例如d:/listener.jtl

D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl

2,啓動分佈式指定代理

D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl -H 192.168.1.1 -P 8080

-H  指定代理機器ip  -P指定代理機器端口

D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx -l d:/listener.jtl -H 192.168.1.1 -P 8080 -H 192.168.2.1 -P 8080 ...

3,啓動全部分佈代理

 

D:\Jmeter\bin>jmeter -n -t c:/testplan.jmx  -r -l d:/listener.jtl

啓動時 添加 -r命令便可啓動全部分佈式的代理;

4,在代理機器上啓動多個server_agert

Jmeter默認端口是 1099 ;

假設:主機在本地  代理機器在服務器地址上,本地的jmeter 端口默認就是1099, 若是要在代理服務器啓動多個server_agert  首先啓動一個server_agent 他的端口是1099  而後操做以下:

修改 jmeter-server.bat  或 jmeter-server.sh  在最上面添加 SET SERVER_PORT=2000

保存後,啓動jmeter-sverver 當前的端口就是2000 ;

 

假如還想在代理機器啓動多個server-agert 呢怎麼辦呢?

而後操做以下:

修改 jmeter-server.bat  或 jmeter-server.sh  在最上面添加 SET SERVER_PORT=2001

保存後,啓動jmeter-sverver 當前的端口就是2001 ;

 

注意 :啓動多個server-agert時 須要添加一個啓動一個,不可一次性所有添加;

 

 

IP欺騙:

在jmeter中,IP欺騙只適用於HTTP請求。

 

 

操做步驟:

第一步:在負載機上添加IP地址。

 

第二步:修改腳本中的http請求的implementation屬性,選擇httpClient模式。

 

第三步:在http請求的Source IP Address屬性中,指定第一步綁定的IP地址。

通常來講,該處須要作參數化處理。

 

9,案例分享

跨線程組傳值

第一種 設置全局變量:

 

${__P(newstamp,)}

 

 

提取全部參數一塊兒使用

a1b甲c...a2b乙c...a3b丙c...a4b丁c...

 

a(.*?)b(.*?)c

 

 

int i;

String temp;

String str=vars.get("pa_1");

//String num=vars.get("pa_matchNr");

int num=Integer.parseInt(vars.get("pa_matchNr"));

for(i=2;i<=num;i++)

{

temp="pa_"+i;

//‘-’是鏈接符號,根據實際狀況能夠切換。

str=str+'-'+vars.get(temp);

}

 

vars.put("out_str",str);

 

按比例分配線程

 

mysql測試

jdbc:mysql://192.168.4.136:3306/test

com.mysql.jdbc.Driver

test

raxtone_Test@2017

 

jmeter -n -t  testplan.jmx -l listener.jtl

相關文章
相關標籤/搜索