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/
·使用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下分隔符是冒號":".
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的官方幫助文檔(英文版)。
Jmeter的界面風格,相似於LR的tree模式。
注意事項:
·錄製完成以後,須要經過菜單File-export to Jmeter的方式將腳本導出爲Jmeter的腳本格式--*.jmx。
·第一次使用Jmeter打開badboy錄製的腳本,須要對全部名稱和step有關的組件(循環控制器)執行一次Change Controller操做。
優勢:錄製過程簡單、生成的腳本簡潔(至關於LR中的HTML模式)。
缺點:·僅適用於B/S架構
·經過內置瀏覽器錄製,就會由於瀏覽器的兼容問題致使沒法錄製。
什麼叫錄製?錄製的本質就是工具自動抓包、自動按協議進行解析、自動生成腳本
操做步驟:
第一步:右鍵 測試計劃組件,添加 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協議。
·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的做用都是和做用域有關。
和做用域有關的組件都是會對其父組件、全部的同級組件和同級組件的子組件有效(做用)。和組件在測試計劃下出現的前後次序無關的。
其中:
·定時器、前置處理器是運行在其做用域內的每個請求以前,和組件自己的前後次序無關,並且運行次數等於做用域內的請求數量。
·後置處理器、斷言是運行在其做用域內的每個請求以後,和組件自己的前後次序無關,並且運行次數等於做用域內的請求數量。
腳本須要的處理有:參數化、關聯、事務、檢查點、思考時間、集合點。
參數化:爲了實現不一樣用戶的不一樣請求;即邏輯相同、數據不一樣
·在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 模式運行測試腳本時可使用的一些命令:
-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地址。
通常來講,該處須要作參數化處理。
第一種 設置全局變量:
${__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);
jdbc:mysql://192.168.4.136:3306/test
com.mysql.jdbc.Driver
test
raxtone_Test@2017
jmeter -n -t testplan.jmx -l listener.jtl