1、優勢javascript
一、開源工具,可擴展性很是好html
二、高可擴展性,用戶可自定義調試相關模塊代碼java
三、精心簡單的GUI設計,小巧靈活linux
四、徹底的可移植性和100%純javagit
五、徹底swing和輕量組件支持(預編譯的HAR使用javax.swing.*)包github
六、徹底多線程框架,容許經過多個線程併發取樣以及單獨的線程對不一樣的功能同時取樣web
七、支持腳本取樣器正則表達式
2、安裝及下載redis
這裏附一個最新的jmeter官網下載地址:http://jmeter.apache.org/download_jmeter.cgi算法
該連接是3.0版本的jmeter安裝包
jmeter自己不須要安裝,只須要配置好JDK環境,而後在在jmeter文件中的bin文件中打開jmeter.bat文件便可
最新版本,建議配置的JDK最好用1.7及以上版本
3、基礎構成
一、組成部分
1)負載發生器:產生負載,多進程或多線程模擬用戶行爲
2)用戶運行器:腳本運行引擎,用戶運行器附加在進程或線程上,根據腳本模擬指定的用戶行爲
3)資源生成器:生成測試過程當中服務器、負載機的資源數據
4)報表生成器:根據測試中得到的數據生成報表,提供可視化的數據顯示方式·
二、主要概念
2.1測試計劃(test plan)
描述一個性能測試,包含本次測試全部相關功能
2.2.threads(users)線程
Setup thread group:
一種特殊類型的線程,可用於執行預測試操做。即執行測試前進行按期線程組的執行
Teardown thread group:
一種特殊類型的線程,可用於執行測試後動做。即執行測試結束後執行按期的線程組
以上兩個線程組,舉個例子:loadrunner的腳本除了action裏是真正的腳本核心內容,還有初始化「環境」的初始化腳本和測試完畢後對應的清除信息的腳本塊,與其對應
Thread group:
一般添加使用的線程,通常一個線程組可看作一個虛擬用戶組,其中每一個線程爲一個虛擬用戶
2.3測試片斷(test fragment)
2.5版本以後新增的一個選項,是一種特殊的線程組,在測試樹上與線程組一個層級,可是它不被執行,除非它是一個模塊控制器或者被控制器所引用時纔會被執行
2.4控制器
Jmeter有2種控制器:取樣器(sampler)和邏輯控制器(Logic Controller)
做用:用這些原件驅動處理一個測試
1)取樣器(Sampler)
是性能測試中向服務器發送請求,記錄響應信息,記錄響應時間的最小單元,JMeter 原生支持多種不一樣的sampler
如 HTTP Request Sampler 、 FTP Request Sampler 、TCP Request Sampler 、JDBC Request Sampler 等
每一種不一樣類型的 sampler 能夠根據設置的參數向服務器發出不一樣類型的請求。
Java Request Sampler 和 Beanshell Request Sampler 是兩種特殊的可定製的 Sampler (暫不討論)
2)邏輯控制器(Logic Controller)
包含兩類原件:
一類是控制Test Plan中Sampler節點發送請求的邏輯順序控制器,經常使用的有:If Controller、Swith Controller、Loop Controller、Random Controller等
另外一類是用來組織和控制Sampler節點的,如Transaction Controller、Throughput Controller等
2.5監聽器(Listener)
對測試結果進行處理和可視化展現的一系列組件,經常使用的有圖形結果、查看結果樹、聚合報告等
以上的五類原件就能夠構成一個簡單的性能測試腳本
下面再介紹幾種jmeter提供的其餘組件:
2.6配置原件(Config Element)
用於提供對靜態數據配置的支持。CSV Date Set Config能夠將本地數據文件造成數據池(Date Pool),而對應於HTTP Request Configuration
和TCP Request Sample等類型的Configuration元件則能夠修改這些Sample的默認數據等
2.7定時器(Time)
用於操做之間設置等待時間,等待時間使性能測試中經常使用的控制客戶端QPS的手段,jmeter定義了Constant Times、
Constant Throughput Times、Guass Ramdon Times等不一樣類型的Times
2.8斷言(Assertions)
用於檢查測試中獲得的響應數據等是否符合預期,Assertions通常用來設置檢查點,用以保證性能測試過程當中的數據交互與預期一致
2.9前處理器(Pre Processors)
用於在實際請求發出以前對即將發出的請求進行特殊處理。
例如:Count處理器能夠實現自增操做,自增後生成的的數據能夠被將要發出的請求使用,而HTTP URL Re—Writing Modifier處理器則能夠實現URL重寫,
當URL中有sessionID一類的session信息時,能夠經過該處理器填充發出請求實際的sessionID。
2.10後處理器(Post Processors)
用於對Sampler發出請求後獲得的服務器響應進行處理。通常用來提取響應中的特定數據(相似loadrunner中的關聯)。
例如:Regular Expression Extractor用於提取響應數據中匹配某正則表達式的數據段,並將其填充在參數中,Xpath Extractor則能夠用於提取響應數據中經過給定Xpath值得到的數據。。。
通常來說,錄製腳本有兩種方法
1、利用badboy進行腳本錄製
一、下載安裝
badboy官網地址:http://www.badboy.com.au
提示:官網下載時候會有用戶郵件驗證的,直接continue跳過,下載便可
安裝:和通常的Windows安裝程序沒區別,無腦下一步就行;安裝完成後通常都會在桌面和開始菜單裏面有badboy的快捷方式,若是沒有,在badboy安裝目錄下找到badboy.exe文件,雙擊啓動便可
啓動:啓動badboy以後,界面以下
二、錄製
1)如上圖,在地址欄(紅色標註區域)中輸入你須要錄製的web應用的URL,這裏以http://www.baidu.com爲例子
2)點擊開始錄製按鈕(地址欄上方圈出來的地方)開始錄製
3)開始錄製後,你能夠在badboy內嵌的瀏覽器(界面右側)對被測應用進行操做,全部操做過程都會記錄在界面左側的編輯窗口(黃色標註區域)
錄製的腳本並非一行行代碼,而是一個web對象,有點相似於loadrunner中VuGen中的tree view視圖
4)錄製完成後,點擊工具欄中的中止按鈕(綠色標註區域),完成腳本的錄製
5)點擊file→save或者export to jmeter,將文件保存爲jmeter的腳本格式:.jmx;啓動jmeter,打開剛錄製保存的文件,就能夠進行測試了
2、利用jmeter代理服務器進行腳本錄製
一、啓動jmeter:在測試計劃中添加線程組,線程組中添加邏輯控制器→錄製控制器
二、工做臺:添加非測試元件→http代理服務器
三、端口(代理服務器監聽端口):設置爲8080(通常來講)
目標控制器:測試計劃——線程組
分組選擇:每一個組放入一個新的控制器
四、http代理服務器:右鍵單擊,添加定時器→高斯隨機定時器(告知jmeter在其生成的http請求中自動增長一個定時器)
定時器會使相應的取樣器被延遲:上一個請求發送被響應且延時指定時間後,下一個被定時器影響的取樣請求才會被髮送
若是在代理服務器中使用了高斯隨機定時器,則應在其中的固定延遲偏移裏添加:${T}:用於自動引用記錄的延遲時間
五、打開瀏覽器,網絡設置,將局域網設置中的代理服務器設爲localhost,端口設置爲8080
六、代理服務器配置後以後,點擊啓動,代理服務器就會開始記錄所接受的http請求
七、在瀏覽器地址欄輸入須要測試的地址並進行相關操做,錄製完成後,中止http代理服務器,在錄製控制器上點擊右鍵,保存錄制的腳本
注意:別忘了將代理服務器設置恢復原樣
八、腳本錄製完畢,啓動jmeter,就能夠進行測試了
項目背景:公司的微信端H5界面新開發了會員註冊功能,須要對其進行壓力測試
項目目標:須要承受每分鐘最少6000的壓力
1、創建一個測試計劃(test plan)
以前有說過,jmeter打開後會自動生成一個空的test plan,用戶能夠基於該test plan創建本身的test plan
一個性能測試的負載必須有一個線程組完成,而一個測試計劃必須有至少一個線程組。添加線程組操做以下:
在測試計劃處右鍵單擊:添加→Threads(Users)→線程組
每一個測試計劃都必須包含至少一個線程組,固然,也能夠包含多個,多個線程組的運行在jmeter中採用的是並行的方式,即:同時被初始化且同時執行其下的sampler
線程組主要包含三個參數:
線程數:虛擬用戶的數量,一個線程指一個線程或者進程
Ramp—Up Period(in seconds):準備時長。設置的線程數須要多久所有啓動,好比上圖,線程數爲6000,啓動時間爲60,那麼須要60S內啓動6000個線程;
循環次數:每一個線程發送請求的次數。如上圖,6000個線程,每一個線程發送1次,若是勾選了永遠,那麼它將永遠發送下去,直到中止腳本;
設置合理的線程數對可否達到測試目標有決定性影響。好比在本例中,若是線程數太少,則沒法達到設定的要求;
另外,設置合理的循環次數也很重要,除了給定的設置循環次數和永遠,還能夠經過勾選調度器,設置開始和結束時間來控制。
2、添加sampler
添加完線程組後,在線程組上右鍵單擊:添加→Sampler→SOAP/XML-RPC Request(SOAP/XML-RPC:都是報文中不一樣的數據格式)
前面說過,取樣器(Sampler)是與服務器進行交互的單元。一個取樣器一般進行三部分的工做:向服務器發送請求,記錄服務器的響應數據和記錄相應時間信息
這裏解釋一下,由於微信H5界面的會員註冊,向微信端發送的是xml文件,因此這裏我選擇的取樣器是SOAP/XML-RPC Request
上面的圖中,選擇SOAP/XML-RPC Request取樣器,而後URL一欄輸入咱們須要進行加壓的URL
而後默認選項,Use KeepAlive的意思是:保持鏈接,這個是http協議報文中的一個首部字段,以前的關於HTTP協議的隨筆寫過
下面的SOAP/XML-RPC Data輸入須要發送的xml格式的文件就行(也能夠導入xml文件的文件夾進行讀取),下面是xml和json的區別:
添加完取樣器和具體的地址參數以後,接下來就是添加監聽器,對測試結果進行獲取
3、添加監聽器
在線程組上右鍵單擊,添加你須要的監聽器,通常經常使用的就是結果樹和聚合報告
添加後啓動線程組進行測試,等線程執行完成後,根據結果樹中的請求和響應結果(成功或者失敗)就能夠分析咱們的測試是否成功,以及根據聚合報告結果來確認咱們此次確認是否達成了預期結果。
4、聚合報告簡析
Aggregate Report: JMeter 經常使用的一個 Listener,中文被翻譯爲「聚合報告」
Label:每一個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這裏顯示的就是 Name 屬性的值
#Samples:表示你此次測試中一共發出了多少個請求,若是模擬10個用戶,每一個用戶迭代10次,那麼這裏顯示100
Average:平均響應時間——默認狀況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也能夠以Transaction 爲單位顯示平均響應時間
Median:中位數,也就是 50% 用戶的響應時間
90% Line:90% 用戶的響應時間
Note:關於 50% 和 90% 併發用戶數的含義,請參考下文
http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——默認狀況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也能夠表示相似 LoadRunner 的 Transaction per Second 數
KB/Sec:每秒從服務器端接收到的數據量,至關於LoadRunner中的Throughput/Sec
啓動jmeter,創建一個測試計劃
這裏再次說說怎麼安裝和啓動jmeter吧,昨天下午又被人問到怎樣安裝和使用,我也是醉了;在我看來,百度能解決百分之八十的問題,特別是基礎的問題。。。
安裝:去官網下載一個安裝包,官網地址:jmeter.apache.org(Windows系統下載.zip包,Linux系統下載.tgz包)
環境:jmeter是一個純java工具,所以,JDK必不可少,如今最新版的jmeter是3.1,作了不少的優化,建議使用1.7及以上的JDK
JDK版本請注意和操做系統吻合,下載後默認安裝,通常不須要修改環境變量
啓動:打開jmeter文件夾,bin文件→jmeter.bat(Windows執行文件)文件,就能夠啓動jmeter了
啓動jmeter,默認有一個測試計劃,而後,修改計劃名稱,儘可能使其變得有意義,容易看懂,而後,新建一個線程組
這裏線程數我設置爲1,方便演示
而後,添加一個http信息頭管理器
這裏解釋一下爲何要添加http信息頭管理器:
JMeter不是瀏覽器,所以其行爲並不和瀏覽器徹底一致。這些JMeter提供的配置元件中的HTTP屬性管理器用於儘量模擬瀏覽器行爲,在HTTP協議層上發送給被測應用的http請求
(1)HTTP Request Defaults(請求默認值)
用於設置其做用範圍內的全部HTTP的默認值,可被設置的內容包括HTTP請求的host、端口、協議等
(2)HTTP Authorization Manager(受權管理器)
用於設置自動對一些須要NTLM驗證的頁面進行認證和登陸
(3)HTTP Cache Manager
用於模擬瀏覽器的Cache行爲。爲Test Plan增長該屬性管理器後,Test Plan運行過程當中會使用Last-Modified、ETag和Expired等決定是否從Cache中獲取相應的元素
(4)HTTP Cookie Manager(cookie管理器)
用於管理Test Plan運行時的全部Cookie。HTTP Cookie Manager能夠自動儲存服務器發送給客戶端的全部Cookie,並在發送請求時附加上合適的Cookie
同時,用戶也能夠在HTTP Cookie Manager中手工添加一些Cookie,這些被手工添加的Cookie會在發送請求時被自動附加到請求
(5)HTTP Header Manager(信息頭管理器)
用於定製Sampler發出的HTTP請求的請求頭的內容。不一樣的瀏覽器發出的HTTP請求具備不一樣的Agent
訪問某些有防盜鏈的頁面時須要正確的Refer...這些狀況下都須要經過HTTP Header Manager來保證發送的HTTP請求是正確的
http信息頭管理器添加好以後,須要填入信息頭的名稱以及對應的值,以下
Content-Type意思能夠理解爲參數名稱、類型,值下面輸入對應的參數類型就好了,這裏我測試時候須要傳輸json類型,所以就填入了application/json
接着,添加Sampler(取樣器)→http請求
按照截圖所示,填入測試的服務器地址、端口、所用的戶協議、方法,這裏方法我用的是POST,而後填入路徑,選擇Body Data;
關於http請求的的屬性參數說明:
1)名稱:用於標識一個sample。建議使用一個有意義的名稱
2)註釋:對於測試沒任何影響,僅用來記錄用戶可讀的註釋信息
3)服務器名稱或IP:http請求發送的目標服務器名稱或者IP地址,好比http://www.baidu.com
4)端口號:目標服務器的端口號,默認值爲80,可不填
5)協議:向目標服務器發送http請求時的協議,http/https,大小寫不敏感,默認http
6)方法:發送http請求的方法(連接:http://www.cnblogs.com/imyalost/p/5630940.html)
7)Content encoding:內容的編碼方式(Content-Type=application/json;charset=utf-8)
8)路徑:目標的URL路徑(不包括服務器地址和端口)
9)自動重定向:若是選中該項,發出的http請求獲得響應是301/302,jmeter會重定向到新的界面
10)Use keep Alive:jmeter 和目標服務器之間使用 Keep-Alive方式進行HTTP通訊(默認選中)
11)Use multipart/from-data for HTTP POST :當發送HTTP POST 請求時,使用
12)Parameters、Body Data以及Files Upload的區別:
1. parameter是指函數定義中參數,而argument指的是函數調用時的實際參數
2. 簡略描述爲:parameter=形參(formal parameter), argument=實參(actual parameter)
3.在不很嚴格的狀況下,如今兩者能夠混用,通常用argument,而parameter則比較少用
While defining method, variables passed in the method are called parameters.
當定義方法時,傳遞到方法中的變量稱爲參數.
While using those methods, values passed to those variables are called arguments.
當調用方法時,傳給變量的值稱爲引數.(有時argument被翻譯爲「引數「)
四、Body Data指的是實體數據,就是請求報文裏面主體實體的內容,通常咱們向服務器發送請求,攜帶的實體主體參數,能夠寫入這裏
五、Files Upload指的是:從HTML文件獲取全部有內含的資源:被選中時,發出HTTP請求並得到響應的HTML文件內容後還對該HTML
進行Parse 並獲取HTML中包含的全部資源(圖片、flash等):(默認不選中)
若是用戶只但願獲取特定資源,能夠在下方的Embedded URLs must match 文本框中填入須要下載的特定資源表達式,只有能匹配指定正則表達式的URL指向資源會被下載
接下來能夠給這個測試計劃添加一個監視器,經常使用的監視器有「查看結果樹」和「聚合報告」
添加好監視器,點擊運行,開始測試
如上,測試結束後,若是咱們的請求成功發送給服務器,那麼結果樹裏面的模擬請求會顯示爲綠色,能夠經過取樣器結果裏面的響應狀態碼信息來判斷
也能夠點擊請求模塊,查看咱們發送的請求
裏面有咱們發送的請求的方法、協議、地址以及實體主體數據,以及數據類型,大小,發送時間,客戶端版本等信息
響應數據:裏面包含服務器返回給咱們的響應數據實體,以下圖
jmeter中取樣器(Sampler)是與服務器進行交互的單元。一個取樣器一般進行三部分的工做:向服務器發送請求,記錄服務器的響應數據和記錄響應時間信息
有時候工做中咱們須要對數據庫發起請求或者對數據庫施加壓力,那麼這時候就須要用到JDBC Request
JDBC Request能夠向數據庫發送一個請求(sql語句),通常它須要配合JDBC Connection Configuration配置元件一塊兒使用
首先,仍是先創建一個測試計劃,添加線程組
爲了方便,這裏線程數我設置爲1,而後在線程組上面右鍵單擊選擇配置元件→ JDBC Connection Configuration(JDBC鏈接配置)
JDBC Connection Configuration界面以下:
Variable Name(變量名):這裏寫入數據庫鏈接池的名字
Database URL:數據庫鏈接地址
JDBC Driver class:數據庫驅動(能夠將須要鏈接的數據庫驅動jar包複製到jmeter的lib/目錄下,而後在設置測試計劃界面,最下面的Library中導入)
Username:數據庫登陸名
Password:數據庫登錄密碼
這裏順帶說說不一樣數據庫的驅動類和URL格式:
設置好JDBC鏈接配置後,添加JDBC請求,界面以下:
Variable name:這裏寫入數據庫鏈接池的名字(和JDBC Connection Configuration名字保持一致 )
Query:裏面填入查詢數據庫數據的SQL語句(填寫的SQL語句末尾不要加「;」)
parameter valus:數據的參數值
parameter types:數據的參數類型
cariable names:保存SQL語句返回結果的變量名
result cariable name:建立一個對象變量,保存全部返回結果
query timeout:查詢超時時間
handle result set:定義如何處理由callable statements語句返回的結果
完成了上面的操做後,就能夠添加監聽器,來查看咱們的請求是否成功了
這是請求內容,即SQL語句
這是響應數據,正確的顯示了我查詢的該表的對應字段的數據
jmeter這個工具仍是蠻強大的,每一個組件的做用都不一樣,不一樣組合的狀況下,能夠實現95%的性能測試的輔助工做。
jmeter是一個開源的性能測試工具,它能夠經過鼠標拖拽來隨意改變元件之間的順序以及元件的父子關係,那麼隨着它們的順序和所在的域不一樣,它們在執行的時候,也會有不少不一樣。
jmeter的test plan經過圖形化的方式表達腳本,域代碼方式的腳本不一樣,圖形方式表達的腳本中沒法使用變量和函數等描述元件的做用域,所以jmeter主要依靠test plan中元件的相對位置、
父子關係以及元件自己的類型來決定test plan中各元件的執行順序;原件在test plan中的位置不一樣,可能致使該元件的行爲有很大差別。(新版jmeter均可以自主選擇語言,對號入座便可)
一、元件的做用域
jmeter中共有8類可被執行的元件(test plan和thread group不屬於元件),其中,sampler(取樣器)是不與其餘元件發生交互的做用的元件,Logic Controller
(邏輯控制器)只對其子節點的sampler有效,而其餘元件須要與sampler等元件交互。
Config Elements(配置元件):影響其範圍內的全部元件
Pre-porcessors(前置處理器):在其做用範圍內的每個sampler元件以前執行
Timer(定時器):對其做用範圍內的每個sampler有效
Post-porcessors(後置處理器):在其做用範圍內的每個sampler元件以後執行
Assirtions(斷言):對其做用範圍內的每個sampler元件執行後的結果執行校驗
Listener(監聽器):收集其做用範圍內的每個sampler元件的信息而且呈現出來
在jmeter中,元件的做用域是靠test plan的樹形結構中元件的父子關係來肯定的,其原則以下:
1) sampler不與其餘元件相互做用,所以不存在做用域問題
2) Logic Controller只對其子節點中的sampler和Logic Controller做用
3) 除sampler和Logic Controller外的其餘元件,若是是某個sampler的子節點,則該元件僅對其父節點做用
4) 除sampler和Logic Controller外的其餘元件,若是其父節點不是sampler,則其做用域是該元件父節點下的其餘全部後帶節點(包括子節點,子節點的子節點等)
二、元件的執行順序
在同一做用域範圍內,test plan中的元件按照如下順序執行:
1) Config Elements
2) Pre-porcessors
3) Timer
4) Sampler
5) Post-porcessors(除非Sampler獲得的返回結果爲空)
6) Assirtions(除非Sampler獲得的返回結果爲空)
7) Listener(除非Sampler獲得的返回結果爲空)
注意:Pre-porcessors、Post-porcessors和Assirtions等元件僅對Sampler做用,如在它們做用域內沒有任何Sampler,則不會被執行;
若是在同一做用域範圍內有多個同一類型的元件,則這些元件按照它們在test plan中的上下順序依次執行。
jmeter提供了不少元件,幫助咱們更好的完成各類場景的性能測試,其中,定時器(timer)是很重要的一個元件,最新的3.0版本jemter提供了9種定時器(以前6種),下面一一介紹:
1、定時器的做用域
一、定時器是在每一個sampler(採樣器)以前執行的,而不是以後(不管定時器位置在sampler以前仍是下面);
二、當執行一個sampler以前時,全部當前做用域內的定時器都會被執行;
三、若是但願定時器僅應用於其中一個sampler,則把定時器做爲子節點加入;
四、若是但願在sampler執行完以後再等待,則能夠使用Test Action;
2、定時器的做用
一、固定定時器(Constant Timer)
若是你須要讓每一個線程在請求以前按相同的指定時間停頓,那麼能夠使用這個定時器;須要注意的是,固定定時器的延時不會計入單個sampler的響應時間,但會計入事務控制器的時間。
對於「java請求」這個sampler來講,定時器至關於loadrunner中的pacing(兩次迭代之間的間隔時間);
對於「事務控制器」來講,定時器至關於loadrunner中的think time(思考時間:實際操做中,模擬真實用戶在操做過程當中的等待時間)。
這裏有對loadrunner中的pacing和think time有比較全面的解釋:
https://zhidao.baidu.com/question/1431215934913423459.html
咱們一般說的響應時間,應該大部分狀況下是針對某一個具體的sampler(http請求),而不是針對一組sampler組合的事務 。
二、高斯隨機定時器(Gaussian Random Timer)
如須要每一個線程在請求前按隨機時間停頓,那麼使用這個定時器,上圖表示暫停時間會分佈在100到400之間,計算公式參考:Math.abs((this.random.nextGaussian() * 300) + 100)
什麼是高斯隨機分佈:https://zhidao.baidu.com/question/89318504.html
三、均勻隨機定時器(Uniform Random Timer)
和高斯隨機定時器的做用差別不大,區別在於延時時間在指定範圍內且每一個時間的取值機率相同,每一個時間間隔都有相同的機率發生,總的延遲時間就是隨機值和偏移值之和。
下面表示的是隨機延遲時間的最大值是100毫秒:
(1)Random Delay Maximum(in milliseconds):隨機延遲時間的最大毫秒數
(2)Constant Delay Offset(in milliseconds):暫停的毫秒數減去隨機延遲的毫秒數
四、固定吞吐量定時器(Constant Throughput Timer)
可讓JMeter以指定數字的吞吐量(即指定TPS,只是這裏要求指定每分鐘的執行數,而不是每秒)執行。
吞吐量計算的範圍能夠爲指定爲當前線程、當前線程組、全部線程組等範圍,而且計算吞吐量的依據能夠是最近一次線程的執行時延。這種定時器在特定的場景下,仍是頗有用的。
五、同步定時器(Synchronizing Timer)
這個定時器和loadrunner當中的集合點(rendezvous point)做用類似,其做用是:阻塞線程,直到指定的線程數量到達後,再一塊兒釋放,能夠瞬間產生很大的壓力(人多力量大- -哈哈!)
(1)Number of Simulated Users to Group by:模擬用戶的數量,即指定同時釋放的線程數數量
(2)Timeout in milliseconds:超時時間,即超時多少毫秒後同時釋放指定的線程數
六、BeanShell定時器(BeanShell Timer)
這個定時器,通常狀況下用不到,但它能夠說是最強大的,由於能夠本身變成實現想要作的任何事情,例如:但願在每一個線程執行完等待一下,或者但願在某個變量達到指定值的時候等待一下。
這裏給你們介紹下BeanShell:
BeanShell是一種鬆散類型的腳本語言(這點和JS相似),一種徹底符合java語法的java腳本語言,而且又擁有本身的一些語法和方法。
七、bos(Poisson Random Timer)
這個定時器在每一個線程請求以前按隨機的時間停頓,大部分的時間間隔出如今一個特定的值,總的延遲就是泊松分佈值和偏移值之和。
上面表示暫停時間會分佈在100到400毫秒之間:
(1)Lambda(in milliseconds):蘭布達值
(2)Constant Delay Offset(in milliseconds):暫停的毫秒數減去隨機延遲的毫秒數
泊松隨機數: https://baike.baidu.com/item/%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83?fr=aladdin
八、JSR223定時器(JSR223 Timer)
在jemter最新的版本中,新增了這個定時器,能夠這麼理解,這個定時器至關於BeanShell定時器的「父集」,它能夠使用java、JavaScript、beanshell等多種語言去實現你但願完成的事情;
咱們都知道jemter是一種開源的純java工具,能夠本身構件各個組件,jar包去完成各類事情。
關於JSR223 : https://wenku.baidu.com/view/8803a30af78a6529647d53ff.html
九、BSF定時器(BSF Timer)
BSF Timer,也是jmeter新的版本中新增的定時器,其使用方法和JSR223 Timer很類似,只須要在jmeter的lib文件夾導入其jar包,就能夠支持腳本語言直接訪問Java對象和方法的必定時器。
有了它 , 你就能在java application中使用javascript, Python, XSLT, Perl, tcl, ……等一大堆scripting language. 反過來也能夠;
就是在這些scripting language中調用任何已經註冊過了的JavaBean,java object。它提供了完整的API實現經過Java訪問腳本語言的引擎。
因爲本人對java瞭解不深,只能經過查閱相關資料,簡單描述下其做用,不足之處,但願指正。
BSF : https://baike.baidu.com/item/BSF/5847319?fr=aladdin
jmeter中有個元件叫作斷言(Assertion),它的做用和loadrunner中的檢查點相似;
用於檢查測試中獲得的響應數據等是否符合預期,用以保證性能測試過程當中的數據交互與預期一致。
使用斷言的目的:在request的返回層面增長一層判斷機制;由於request成功了,並不表明結果必定正確。
使用斷言的方法:
△在選擇的Sampler下添加對應的斷言(由於不一樣類型的斷言檢查的內容不一樣);配置好響應的檢查內容(根據斷言狀況而定,有的斷言控制面板不須要添加任何內容,如XML Assertion)。
△添加一個斷言結果的監聽器(從監聽器中添加),經過「斷言結果」能夠看到是否經過斷言;對於一次請求,若是經過的話,斷言結果中只會打印一行請求的名稱;
若是失敗,則除了請求的名稱外,還會有一行失敗的緣由(不一樣類型的斷言,結果不一樣)。
PS:一個Sampler能夠添加多個斷言,根據你的檢查需求來添加相應的斷言,當Sampler下全部的斷言都經過了,那麼纔算request成功。
最新版本的3.0jmeter中有13種不一樣的斷言,下面簡單介紹下每一個斷言各自擁有什麼樣的做用以及它們的適用場景:
一、BeanShell斷言
BeanShell以前關於定時器的隨筆中有介紹過,是一種鬆散類型的腳本語言(這點和JS相似),一種徹底符合java語法的java腳本語言,而且又擁有本身的一些語法和方法;
做用對象:針對sampler中的Bean Shell sampler而使用的斷言
Name:斷言的名字(能夠用一個比較容易理解和分辨的名稱)
Comments:註釋(對這個斷言進行一個解釋,備註)
Reset bsh.interpreter before each call:在每次調用Bean Shell以前重置bsh.interpreter類(bsh.interpreter是Bean Shell腳本語言的一種類,也能夠理解爲一種解析器)
Parameters(String Parameters and String []bsh.args):String參數(String []bsh.args是主類main函數的形式參數,是一個String 對象數組,能夠用來獲取命令行用戶輸入進去的參數)
Script file:腳本文件(能夠填入腳本文件路徑)
Script(see below for variables that are defined):參照下文定義的變量(使腳本文件參照定義的變量來運行)
二、 BSF斷言
BSF(Bean Scripting Framework)以前也介紹過,是一個支持在Java應用程序內調用腳本語言 (Script),而且支持腳本語言直接訪問Java對象和方法的一個開源項目;
做用對象:針對sampler中的BSF sampler而使用的斷言
Script language(e.g.beanshell,javascirpt,jexl):腳本語言(能夠從下面的下拉框中選擇對應的腳本語言JavaScript、beanshell等)
parameters to be passed to script(=> String Parameters and String []args):(傳遞給腳本的參數→能夠理解爲使用BSF斷言腳本時候一塊兒引用的參數 )
Script file(overrides script):重寫腳本(能夠經過選擇腳本文件的狀態,是瀏覽調用已有的腳本仍是在在下方的輸入框內寫入腳本;)
Script:下面的輸入框表示能夠輸入變量類型,運用的腳本(取樣結果、斷言結果、取樣日誌文件等參數)
三、比較斷言(compare assertion)
這是一種比較特殊的斷言元件,針對斷言進行字符串替換時使用;
做用對象:須要替換的字符串
Select Comparison Operators:選擇比較運算符
Compare Content:能夠選擇比較的內容類型(true/false或者自定義,編輯)
Compare Time:比較時間(能夠設定比較的時間,單位爲秒,默認爲-1)
Comparison Fitters:比較修改工具
regular expression substitutions:替換正則表達式
Regex String:要替換的字符串(可從斷言結果中選擇)
substitutions:替換的字符串(替換結果)
四、HTML斷言
對響應類爲XML類型的文件進行斷言;
做用對象:針對sampler中的SOAP/XML-RPC Request而使用的斷言
Tidy Settings:Tidy 環境(Tidy是一個HTML語法檢查器和打印工具,能夠將HTML轉換爲XML類型的文件)
Doctype:文檔類型(可經過下拉框選擇不一樣文檔類型→ omit疏忽遺漏的/auto動態的/strict嚴格的/loose寬泛的。。。。。。我也不太懂這裏什麼意思GG)
Format:文件格式(可選擇HTML/XHTML/XML三種不一樣類型的文件格式來檢查返回內容)
Errors only:偏差校訂(能接受的最大值)
Error threshold:偏差/錯誤範圍(可選擇偏差/錯誤數量的範圍,最大值)
Warning threshold:警告範圍(可選擇偏差警告的數量範圍,最大值)
若是勾選「Error only」這裏忽略Warning,只對偏差做統計檢查;若是對返回內容的檢查結果不超過指定結果,則斷言經過,不然失敗。
Write JTidy report to file:寫入JTidy報告的文件(JTidy是Tidy的一個java移植,能夠將它當成一個處理HTML文件的DOM解析器)
五、JSR223斷言
JSR223即Java 規範請求,是指向JCP(Java Community Process)提出新增一個標準化技術規範的正式請求;
做用對象:針對sampler中的JSR223 sampler而使用的斷言
Script language(e.g.beanshell,javascirpt,jexl):腳本語言(能夠從下面的下拉框中選擇對應的腳本語言JavaScript、beanshell等)
parameters to be passed to script(=> String Parameters and String []args):(傳遞給腳本的參數→能夠理解爲使用JSR223斷言腳本時候一塊兒引用的參數 )
Script file(overrides script):重寫腳本(能夠經過選擇腳本文件的狀態,是瀏覽調用已有的腳本仍是在在下方的輸入框內寫入腳本;)
Script:下面的輸入框表示能夠輸入變量類型,運用的腳本(取樣結果、斷言結果、取樣日誌文件等參數)
六、MD5Hex斷言
MD5是一種消息摘要算法,用以提供消息的完整性保護(具體關於MD5的知識請自行查詢);
做用對象:針對參數類型爲MD5Hex加密的參數的斷言
MD5Hex:將已被MD5加密的參數寫入其中,添加取樣器等其餘元件
七、Size斷言
用於判斷返回內容的大小;
做用對象:返回信息,響應報文
APPly to:應用範圍(返回內容的斷言範圍)
Main sample and sub-samples:做用於父節點取樣器及對應子節點取樣器
Main sample only:僅做用於父節點取樣器
Sub-samples only:僅做用於子節點取樣器
JMeter Variable:做用於jmeter變量(輸入框內可輸入jmeter的變量名稱)
Response Size Field to Test:響應字節的測試範圍(能夠選擇用於判斷的響應範圍)
Full Response:所有響應
Response Headers:響應頭部
Response Body:響應主體
響應代碼:響應報文相關的代碼
響應信息:響應報文的信息
Size to Assert:斷言字節範圍
字節大小單位爲:字節;比較順序是①返回內容的大小②比較類型③指定字節大小
八、SMIME斷言
SMIME是一種多用途網際郵件擴充協議,相比於以前的SMAP郵件傳輸協議,增長了安全性,對郵件主題進行保護;
做用對象:針對採用了該種郵件傳輸協議的信息
signature:簽名(可選擇對協議的簽名驗證狀態)
Verify signature:驗證簽名
Message not signed:沒有簽名消息
Signer certificate:簽名證書(由於SMIME協議增長了安全傳輸,須要證書驗證)
No check:不檢查
Check values:檢查
Signer distinguished name:簽名證書者名稱(證書註冊者的名稱)
Sigmer email address:簽名者的郵件地址(註冊的郵件地址)
Issuer distinguished name:發行者名稱(由誰發行的證書)
Serial Number:證書序號
Certificate file:選擇證書文件
Execute assertion message at position:執行斷言消息的位置(在返回消息的具體哪一個位置執行斷言)
九、XML概要斷言
亦能夠稱爲XML模型斷言/XML數據類型斷言;XML Schema 定義了兩種主要的數據類型:①xml document schema 文檔架構 ;② 文檔架構xml-schema xml模式
做用對象:返回結果爲XML概要斷言的2中數據類型的消息
XML Schema:XML概要模型
File Name:文件名(寫入須要斷言的文件名稱)
十、XML斷言
XML(可擴展標記語言) 提供一種描述結構化數據的方法。與主要用於控制數據的顯示和外觀的 HTML 標記不一樣,XML 標記用於定義數據自己的結構和數據類型;
做用對象:判斷返回結果是否和xml的格式即<></>成對出現
十一、XPath斷言
XPath即爲XML路徑語言,它是一種用來肯定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。
做用對象:針對返回信息爲XPAth的數據類型進行斷言
Apply to:適用範圍
Main sample and sub-samples:主要樣本和次級樣本
Main sample only:僅主要樣本
Sub-samples only:僅次級樣本
JMeter Variable:jmeter變量(輸入框內可輸入jmeter的變量名稱)
XML Parsing Options:XML解析選項
Use Tidy(tolerant parser):使用Tidy(容錯解析器),默認選擇quiet(不顯示)
Quiet:不顯示
Report errors:錯誤報告
Show warnings:顯示錯誤
Use Namespaces:使用名稱空間
Validate XML:驗證XML(文件包/數據)
Ignore Whitespace:忽略空格(這容許你指定語法分析器能夠忽略哪一個空格,而哪一個空格是重要的)
Fetch external DTDs:獲取外部DTDs(一些XML元素具備屬性,屬性包含應用程序使用的信息,屬性僅在程序對元素進行讀、寫操做時,提供元素的額外信息,這時候須要在DTDs中聲明)
XPath Assertion:輸入框中寫入xpath斷言,點擊Validate驗證其正確性
True if nothing matches:確認都不匹配
十二、響應斷言
判斷返回內容中的內容
做用對象:響應報文中的全部對象
APPly to:適用範圍
Main sample and sub-samples:做用於父節點取樣器及對應子節點取樣器
Main sample only:僅做用於父節點取樣器
Sub-samples only:僅做用於子節點取樣器
JMeter Variable:做用於jmeter變量(輸入框內可輸入jmeter的變量名稱)
要測試的響應字段:要檢查的項
響應報文
Documeng(text):測試文件
URL樣本
響應代碼
響應信息
Response Headers:響應頭部
Ignore status:忽略返回的響應報文狀態碼
模式匹配規則:
包括:返回結果包括你指定的內容
匹配:(好像跟Equals查很少,弄不明白有什麼區別)
Equals:返回結果與你指定結果一致
Substring:返回結果是指定結果的字串
否:不進行匹配
要測試的模式:即填寫你指定的結果(可填寫多個),按鈕【添加】、【刪除】是進行指定內容的管理
1三、斷言持續時間
用於判斷服務器的響應時間
做用對象:服務器
APPly to:適用範圍
Main sample and sub-samples:做用於父節點取樣器及對應子節點取樣器
Main sample only:僅做用於父節點取樣器
Sub-samples only:僅做用於子節點取樣器
Duration to assert:持續斷言
Duration in milliseconds:響應時間設置(單位:毫秒),若是響應時間大於設置的響應時間,則斷言失敗,不然成功!
jmeter中邏輯控制器(Logic Controllers)的做用域只對其子節點的sampler有效,做用是控制採樣器的執行順序。
jmeter提供了17種邏輯控制器,它們各個功能都不盡相同,大概能夠分爲2種使用類型:
①.控制測試計劃執行過程當中節點的邏輯執行順序,如:Loop Controller(循環控制器)、If Controller(若是if控制器)等;
②.對測試計劃中的腳本進行分組,方便JMeter統計執行結果以及進行腳本的運行時控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事務控制器)等
jmeter提供以下17種邏輯控制器:
1、臨界區控制器(critical section Controller)
做用:臨界區控制器確保其子節點下的取樣器或控制器將被執行(只有一個線程做爲一個鎖)
名稱和註釋很簡單,就是給控制器添加一個備註,令人明白這個控制器的解釋含義的意思
Lock name:鎖名稱,這裏能夠填入其子節點下執行的線程的名稱,這個線程做爲一個全局鎖存在
二、遍歷循環控制器(ForEach Controller)
做用:用來遍歷當前元素的全部可執行場景;在用戶自定義變量中讀取一系列相關的變量,該控制器下的採樣器或控制器都會被執行一次或屢次,每次讀取不一樣的變量值;
輸入變量前綴:在其中輸入須要遍歷的用戶參數(User Parameter)
Start index for loop(exclusive):循環指數開始(惟一)→ 遍歷查詢的變量範圍,開始的值(這裏若是不填寫,默認從1開始,若是沒有1開始的變量,執行時會報錯)
End index for loop(inclusive):循環指數結束(包含)→ 遍歷查詢的變量範圍,結束的值
輸出變量名稱:將遍歷查詢到的符合條件的用戶參數賦值給輸入變量(Vname),而後就能夠在控制器下的取樣器使用,格式爲${輸出變量名}
Add」_」before number:輸入變量名稱中是否使用「_」進行間隔
PS:這個控制器通常配合配置元件→ 正則表達式提取器來一塊兒使用,可對頁面上的某些元素進行重複處理。
三、包含控制器(Include Controller)
做用:用於引用外部的Jmx文件;從而控制多個測試計劃組合
include Test Plan:包含測試計劃的文件名,能夠點擊瀏覽,從文件夾保存的JMX文件夾目錄下選擇對應的JMX文件
使用方法:建立一個測試計劃,下面可添加取樣器/控制器等,而後保存測試計劃,爲了方便起見, 線程組也能夠添加外部JMX文件中用於調試;
若是測試使用Cookie或用戶定義的變量,這些應放置在頂層(包括文件),不然沒法正常工做;此元素不支持變量/函數在文件名字段中;可是,若是屬於包含控制器定義的內容,則使用前綴路徑名。
四、生命週期/運行週期控制器(Runtime Controller)
做用:用於控制該控制器下的取樣器/控制器的運行時間
Runtime(seconds):運行時間,單位爲:秒
五、轉換控制器(Switch Controller)
做用:經過給該控制器中的value賦值,來指定運行哪一個取樣器(也能夠理解爲開關控制器)
Switch value:控制器具體賦值的value值字段
有兩種賦值方式:
①.第一種是數值,Switch控制器下的子節點從0開始計數,經過指定子節點所在的數值來肯定執行哪一個元素。
②.第二種是直接指定子元素的名稱,好比採樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
當Value爲空時,默認執行第1個子節點元素。
六、當/判斷控制器(While Controller)
做用:運行其子節點下的取樣器/控制器,直到條件爲「假」
Condition(function or variable):條件(函數或變量):裏面可填入判斷依據的條件,參照
使用方法:可能的條件值有:
①.空白:最後一個示例循環失敗時退出循環
②.最後一個值:最後一個示例循環失敗時退出循環。 若是以前的最後一個示例只是循環失敗,不進入循環。
③.不然:退出時(或不輸入)循環條件等於字符串「 假 」
七、事務控制器(transaction controller)
做用:生成一個額外的採樣器來測量其下測試元素的整體時間;值得注意的是,這個時間包含該控制器範圍內的全部處理時間,而不只僅是採樣器的
Generate parent sample:生成父樣本(不一樣的模式選擇)
include duration of timer and pre-post processors in generated sample:包含時間的計時器和先後處理器生成的示例(不一樣的模式選擇)
對於Jmeter2.3以上的版本,有兩種模式的操做
①.事務採樣器是添加到其下采樣器後面的
②.事務採樣器是做爲其下采樣器的父採樣器
生成的事務採樣器的測量的時間包括其下采樣器以及其餘的一切時間。因爲時鐘頻率問題,這個時間可能略大於單個採樣器的時間之和;
時鐘開始時間介於控制器記錄開始時間與第一個採樣器開始之間,時鐘結束時間亦然。
事務採樣器只有在其子採樣器都成功的狀況下才顯示成功。
在父模式下,事務控制器下的各個採樣器只有在結果樹裏才能看到;同時,子採樣器的數據也不會在CSV文件中顯示,可是在XML文件中能夠看到。
八、交替控制器(creatleave controller)
做用: 交替控制,使得該控制器包含的取樣器步驟交錯執行在每一個循環中
忽略子控制器模塊(Ignore sub-contorller blocks):若是勾選此項,交錯控制器將sub-controllers像單一請求元素同樣,一次只容許一個請求/控制器
使用方法:假使該控制器下有2個取樣器A和B,交替執行A和B2個請求,即每次傳遞一個子請求到這個測試,按子元件的排列順序
九、僅一次控制器(once only controller)
做用:在多線程循環的時候,將使其子節點下的取樣器請求只運行一次
十、流量控制器(throughput controller)
做用:jmeter自帶的翻譯這裏是錯誤的,由於它並不能控制吞吐量(吞吐量的概念請自行百度);其實質做用是容許用戶控制執行的頻率
總共有兩種執行模式:百分比執行和總執行
總執行(Total Executions):使控制器中止執行必定數量的測試計劃
百分比執行(Percent Executions):使控制器按必定比例執行迭代的測試計劃
流量(Throughput):對應上面的執行數量或者比例
每一個用戶(Per User):每一個用戶
若是勾選此項,將致使控制器計算是否應該執行在每一個用戶(每一個線程)的基礎上;若是不加以控制,那麼將計算全球全部用戶
十一、IF控制器(If Controller)
做用:容許用戶控制該控制器下面的取樣器/控制器是否執行該節點下的子節點;
條件(默認JavaScript)(Condition(default javascript)):使用JavaScript的函數或變量進行評估判斷條件爲真或假
條件解釋爲變量表達式(interpret condition as variable expression):若是勾選該項,那麼變量表達式會進行求值,並與「ture」或「false」進行比較,而無需使用JavaScript
對全部子條件執行(evaluate for all children):若是勾選該項,則該controller在沒一個子節點執行時執行一次;
默認狀況下,該控制器能夠對包含在其下面的全部可運行的元素進行執行,但只在入口執行一次
十二、錄製控制器(Recording Controller)
做用:相似代理服務器的做用,在測試執行期間記錄測試樣本
清除全部記錄的樣本(Clear all the recorded samples):點擊能夠清除全部已經記錄的測試樣本
通常狀況下,在測試執行時候,它沒有效果,可是在執行HTTPS測試腳本時,會記錄下全部測試樣本
1三、循環控制器(Loop Controller)
做用:該控制器下的取樣器請求能夠循環運行
循環次數(Loop Count):在輸入框中輸入須要循環的次數,控制器下的請求便可循環運行
永遠(forever):若是勾選該項,那麼控制器下的請求可一直運行
1四、模塊控制器(Module Controller)
做用:測試控制器子節點下的某一個模塊,而不是整個測試計劃
尋找目標元素(Find target element):尋找測試計劃中須要特定測試的元素,模塊;也可理解爲該控制器能夠控制已經封裝好的模塊元素
△ :一個測試計劃由一個控制器和全部的測試元素(取樣器等)組成,測試計劃能夠位於任何線程組或工做臺;若是計劃位於線程組,則能夠禁用其餘控制器,防止正在運行的測試計劃被影響(除了模塊控制器)
模塊控制器的優點在於:當存在多個線程組時,該控制器能夠輕鬆切換,只須要選擇對應的取樣器,方便快捷,替代了建立不少測試計劃的繁瑣操做
△ :任何一個模塊所用的控制器名字必須惟一,由於其名字被用來找到目標控制器時從新加載;出於這個緣由,最好保證控制器名字不一樣,不然執行測試時候可能發生意外
△ :模塊控制器與遠程測試不該使用或非gui測試與工做臺部件,由於工做臺測試元素並無測試計劃的一部分 jmx 文件。 任何這樣的測試就會失敗
1五、簡單控制器(Simple Controller)
做用:用來組合取樣器和其餘邏輯控制器
簡單控制器是最基本的控制器,對jmeter測試運行沒有任何影響,可用來命名某些操做
1六、隨機控制器(Random Controller)
做用:相似交替控制器,但該控制器隨機選取某一個取樣器請求並執行
忽略子控制器模塊(Ignore sub-controller blocks):若是勾選此項,交錯控制器將sub-controllers像單一請求元素同樣,一次只容許一個請求/控制器
1七、隨機順序控制器(Random Order Controller)
做用:相似於簡單控制器,將執行每一個子節點下的取樣器請求一次,可是執行是隨機的
參數化是自動化測試腳本的一種經常使用技巧。簡單來講,參數化的通常用法就是將腳本中的某些輸入使用參數來代替,在腳本運行時指定參數的取值範圍和規則;
這樣,腳本在運行時就能夠根據須要選取不一樣的參數值做爲輸入。這種方式一般被稱爲數據驅動測試(Data Driven Test),參數的取值範圍被稱爲數據池(Data Pool)。
jmeter的test plan中,支持以下4種參數化方式:
函數助手:_CSVRead
CSV Data Set Config:CSV數據控件
User Defined Variables:用戶定義的變量
User Variables:用戶參數
首先新建一個測試腳本,能夠經過工具(badboy)錄製或者本身手動編寫
登陸請求的界面以下:
這裏咱們對登陸的用戶名密碼進行參數化,將用戶名密碼寫入txt文檔,保存爲.dat格式,編碼類型選擇UTF-8;
由於配置元件——CSV Data Set Config對參數化的格式要求比較嚴格,用戶名密碼一一對應,之間用半角英文逗號隔開
而後將保存的.dat文件放入計算機的某個盤裏,這裏我放入路徑爲:F:\jmeter\csvtest.dat
下面具體介紹參數化經常使用的的兩種方法:
1、函數助手:_CSVRead
點擊jmeter的界面,功能欄選項→ 函數助手對話框→ _CSVRead
CSV file to get values from | *alias:CSV文件取值路徑,即這裏須要寫入以前的須要參數化的參數的文件路徑
CSV文件列號| next|*alias:文件起始列號:CSV文件列號是從0開始的,第一列爲0,第二列爲1,以此類推。。。
函數字符串:即生成的參數化後的參數,能夠直接在登錄請求中的參數中引用,第一列爲用戶名,函數字段號爲0,第二列爲密碼,函數字段號爲1,以此類推動行修改使用便可
替換參數化後的參數,而後修改線程數,執行腳本,經過監聽器裏結果樹的請求內容,能夠看到請求的參數都是參數化後的數據
2、配置元件——CSV Data Set Config
點擊線程組添加配置元件→ CSV Data Set Config:
說明:
Filename:F:\jmeter\csvtest.dat文件名,保存參數化數據的文件目錄,可選擇相對或者絕對路徑(建議填寫相對路徑,避免腳本遷移時須要修改路徑);
File encoding:UTF-8,F:\jmeter\csvtest.dat文件的編碼格式,在保存時保存編碼格式爲UTF-8便可;
Variable Names(comma-delimited):對對應參數文件每列的變量名,相似excel文件的文件頭,起到標示做用,同時也是後續引用的標識符,建議採用有意義的英文標示;
(如:有幾列參數,在這裏面就寫幾個參數名稱,每一個名稱中間用分隔符分割,這裏的 user,pwd,能夠被利用變量名來引用:user,user,{pwd};
Delimitet:參數文件分隔符,用來在「Variable Names」中分隔參數,與參數文件中的分隔符保持一致便可;
Allow quote data:是否容許引用數據,默認false,選項選爲「true」的時候對全角字符的處理出現亂碼 ;
Recycle on EOF?:是否循環讀取參數文件內容;由於CSV Data Set Config一次讀入一行,分割後存入若干變量中交給一個線程,若是線程數超過文本的記錄行數,那麼能夠選擇從頭再次讀入;
△ Ture:爲true時,當已讀取完參數文件內的測試用例數據,還需繼續獲取用例數據時,此時會循環讀取參數文件數據(即:讀取文件到結尾時,再重頭讀取文件);
△False:爲false時,若已至文件末尾,則再也不繼續讀取測試數據;一般在「線程組線程數* 線程組循環次數>參數文件行數」時,選用false(即:讀取文件到結尾時,中止讀取文件);
Stop thread on EOF?:當Recycle on EOF爲False時(讀取文件到結尾),中止進程,當Recycle on EOF爲True時,此項無心義;
△若爲ture,則在讀取到參數文件行末尾時,終止參數文件讀取線程;
△若爲false,此時線程繼續讀取,但會請求錯誤,所以時讀取的數據爲EOF;
Sharing mode:共享模式,即參數文件的做用域,有如下幾種方式:
△All threads:當前測試計劃中的全部線程中的全部的線程都有效,默認;
△Current thread group:當前線程組中的線程有效;
△Current thread:當前線程有效;
完成以後,將剛纔生成的參數寫入參數對應的值裏面:
以上兩種常見的參數化的方法,推薦使用CSV控件方法(由於函數助手參數化功能相比其較弱)
3、配置元件——User Defined Variables
點擊線程組添加配置元件→ User Defined Variables(用戶定義的變量):
如上圖所示,在該參數組中已經定義了兩個參數,經過界面下方的添加、刪除按鈕能夠向參數列表增長和刪除參數,Up和Down能夠上下移動參數的位置;
PS:User Defined Variables中定義的參數值在test plan執行過程當中不能發生取值的改變,所以通常僅將test plan中不須要隨迭代發生改變的參數(只取一次的參數)
設置在此處;例如:被測應用的host和port值。
4、前置處理器——User Variables
點擊線程組添加前置處理器——User Variables(用戶參數):
如上圖所示,在該參數組中已經設置了兩個參數,username和password分別有2組不一樣的取值,經過頁面下方的四個按鈕,能夠增長刪除參數的可能取值。
PS:User Variables中設置的參數能夠在test plan執行過程當中發生變化。
以上就是jmeter參數化的四種方式,其中:
一、函數助手_CSVRead的參數化功能相比CSV Data Set Config較弱;
二、CSV Data Set Config適用於參數取值範圍較大的時候使用,該方法具備更大的靈活性;
三、User Defined Variables通常用於test plan中不須要隨請求迭代的參數設置;
四、User Variables適用於參數取值範圍很小的時候使用;
PS:相比於loadrunner來講,jmeter參數化有如下不一樣:
1.jmeter參數文件第一行沒有列名稱
2.參數文件的編碼,儘可能保存爲UTF-8(編碼問題在使用CSV Data Set Config參數化時要求的比較嚴格)
3.Jmeter的參數化沒有LoadRunner作的出色,它是依賴於線程設置的(只有CSV Data Set Config參數化方法纔有)
工做中遇到這樣一個問題:
須要準備10W條測試數據,利用jmeter中的JDBC Request向數據庫中批量插入這些數據(只要主鍵不重複就能夠,利用函數助手中的Random將主鍵的ID末尾五位數隨機插入);
響應數據報錯:Can not issue data manipulation statements with executeQuery().後來查閱了不少資料,才發現跟JDBC Request中的Query Type類型選擇有關;
最後得出的結論是:若是SQL語句是update、insert等更新語句,應該使用statement的execute()方法;若是使用statement的executeQuery()就會出現報錯。
下面主要說jmeter的JDBC Request請求中的Query Type:
JDBC Request界面以下:
其中Query Type(SQL語句類型)包含十個類型,每一個類型做用都不一樣,下面分別介紹。
一、Select statement
這是一個查詢語句類型;若是JDBC Request中的Query內容爲一條查詢語句,則選擇這種類型。
PS:多個查詢語句(不使用參數的狀況下)能夠放在一塊兒順序執行,須要設置Query Type爲:Callable Statement;
若是Query Type爲:select Statement,則只執行第一條select語句。
二、Update statement
這是一個更新語句類型(包含insert和update);若是JDBC Request中的Query內容爲一條更新語句,則選擇這種類型。
PS:若是該類型下寫入多條update語句,依然只執行第一條(緣由同上,具體下面介紹)。
三、Callable statement
這是一個可調用語句類型,CallableStatement 爲全部的 DBMS 提供了一種以標準形式調用已儲存過程的方法。
已儲存過程儲存在數據庫中,對已儲存過程的調用是 CallableStatement 對象所含的內容。
這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參數,另外一種形式不帶結果參數;結果參數是一種輸出 (OUT) 參數,是已儲存過程的返回值。
兩種形式均可帶有數量可變的輸入(IN 參數)、輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數,問號將用做參數的佔位符。
在 JDBC 中調用已儲存過程的語法以下所示。注意,方括號表示其間的內容是可選項;方括號自己並非語法的組成部份。
{call 過程名[(?, ?, ...)]},返回結果參數的過程的語法爲: {? = call 過程名[(?, ?, ...)]};
不帶參數的已儲存過程的語法相似:{call 過程名}。
四、Prepared select statement
statement用於爲一條SQL語句生成執行計劃(這也是爲何select statement只會執行第一條select語句的緣由),若是隻執行一次SQL語句,statement是最好的類型;
Prepared statement用於綁定變量重用執行計劃,對於屢次執行的SQL語句,Prepared statement無疑是最好的類型(生成執行計劃極爲消耗資源,兩種實現速度差距可能成百上千倍);
PS:PreparedStatement的第一次執行消耗是很高的. 它的性能體如今後面的重複執行。
五、Prepared update statement
Prepared update statement和Prepared select statement的用法是極爲類似的,具體能夠參照第四種類型。
六、Commit
commit的意思是:將未存儲的SQL語句結果寫入數據庫表;而在jmeter的JDBC請求中,一樣能夠根據具體使用狀況,選擇這種Query類型。
七、Rollback
rollback指的是:撤銷指定SQL語句的過程;在jmeter的JDBC請求中,一樣能夠根據須要使用這種類型。
八、AutoCommit(false)
MySQL默認操做模式就是autocommit自動提交模式。表示除非顯式地開始一個事務,不然每條SQL語句都被當作一個單獨的事務自動執行;
咱們能夠經過設置autocommit的值改變是不是自動提交autocommit模式;
而AutoCommit(false)的意思是AutoCommit(假),即將用戶操做一直處於某個事務中,直到執行一條commit提交或rollback語句纔會結束當前事務從新開始一個新的事務。
九、AutoCommit(true)
這個選項的做用和上面一項做用相反,即:不管何種狀況,都自動提交將結果寫入,結束當前事務開始下一個事務。
十、編輯(${})
jmeter中的JDBC請求中的SQL語句是沒法使用參數的,好比: SELECT * FROM ${table_name} 是無效的。
若是需實現同時多個不一樣用戶使用不一樣的SQL,能夠經過把整條SQL語句參數化來實現;(把SQL語句放在csv文件中,而後在JDBC Request的Query 中使用參數代替 ${SQL_Statement})。
若是有這樣的狀況:一個完整的操做流程,須要先完成某個操做,得到某個值或數據信息,而後才能進行下一步的操做(也就是常說的關聯/將上一個請求的響應結果做爲下一個請求的參數);
在jmeter中,能夠利用正則表達式提取器來幫助咱們完成這一動做。
首先:在默認的測試計劃中添加一個線程組,而後添加取樣器,這裏我以JDBC請求作例子:
而後:右鍵添加後置處理器→正則表達式提取器,正則表達式提取器界面以下:
說明:
後置處理器:在請求結束或者返回響應結果時發揮做用
正則表達式提取器:容許用戶從服務器的響應中經過使用perl的正則表達式提取值。該元素會做用在指定範圍取樣器,用正則表達式提取所需值,生成模板字符串,並將結果存儲到給定的變量名中。
APPly to:做用範圍(返回內容的斷言範圍)
Main sample and sub-samples:做用於父節點的取樣器及對應子節點的取樣器
Main sample only:僅做用於父節點的取樣器
Sub-samples only:僅做用於子節點的取樣器
JMeter Variable:做用於jmeter變量(輸入框內可輸入jmeter的變量名稱)
要檢查的響應字段:須要檢查的響應報文的範圍
主體:響應報文的主體
Body(unescaped):主體,響應的主體內容且替換了全部的html轉義符,注意html轉義符處理時不考慮上下文,所以可能有不正確的轉換,不太建議使用
Body as a Document:從不一樣類型的文件中提取文本,注意這個選項比較影響性能
Response Headers:響應信息頭
Request Headers:請求信息頭
URL:統一資源定位符,即Internet上用來描述信息資源的字符串
Response Code:響應狀態碼,好比200、404等
Response Message:響應信息
PS:jmeter的中文翻譯有時候不太準確,建議儘可能選擇語言格式爲英文(爲了方便說明,這裏選擇中文語言,固然,本身明白最好,不用糾結這個)
引用名稱(Reference Name):Jmeter變量的名稱,存儲提取的結果;即下個請求須要引用的值、字段、變量名(例子中我提取的是SOCIAL_NO)
引用方法:引用方法:${引用名稱}
正則表達式(Regular Expression):使用正則表達式解析響應結果,「()」表示提取字符串中的部分值,請不要使用「||」,除非你自己須要匹配這個字符。
下面是經常使用的正則表達式操做符:
模板(Template):從匹配的結果中建立一個字符串,這是經過正則表達式匹配出來的一組值,意爲使用提取到的第幾個值(可能有多個值匹配,所以使用模板);從1開始匹配,以此類推.
參數能夠在取值模板組合使用,例如:「11-22」做爲模板獲得的值是使用「-」鏈接的第一個待匹配內容與第二個待匹配內容組合而成的字符串。
匹配數字(Match No):正則表達式匹配數據的結果能夠看作一個數組,表示如何取值:0表明隨機取值,正數n則表示取第n個值(好比1表明取第一個值),負數則表示提取全部符合條件的值。
缺省值:匹配失敗時候的默認值;一般用於後續的邏輯判斷,通常一般爲特定含義的英文大寫組合,好比:ERROR
最後,根據上面的說明,完成配置,而後能夠先添加一個監視器(查看結果樹),檢查是否取到了對應的值;
提取到的參數,調用時用${SOCIAL_NO_1},${SOCIAL_NO_2}...,若是想要獲得匹配出的參數的個數,用${SOCIAL_NO_matchNr},若是想隨機選取一個,只須要將
匹配數字設爲0,使用${SOCIAL_NO}調用便可。
jmeter做爲一個開源的純Java性能測試工具,工做中極大的方便了咱們進行接口、性能測試,但使用過程當中也遇到了不少的問題,下面就記錄一下本身遇到的問題,後續會不斷更新。。。
一、獲取日誌
在使用jmeter過程當中,若是想得到更詳細的日誌,能夠修改jmeter\bin\jmeter.properties文件中的一個屬性:全部log_level.jmeter的後綴由info改成debug,以下:
二、jmeter安裝
安裝使用jmeter時候不須要設置classpath以及class變量,只須要默認安裝好JDK便可(一般狀況下),而後解壓jmeter安裝包,啓動jmeter\bin\jmeter.bat程序便可;
由於jmeter是以Java_jar的方式啓動,並且會忽略該變量,這對全部Java程序都適用。
三、請求/響應數據顯示亂碼
有時候在發送請求/查看響應數據時,服務端接收到的請求中包含亂碼,致使沒法解析報錯,解決方法有以下幾種:
①請求數據顯示亂碼,能夠在請求中以下設置:
②返回數據包含亂碼時,能夠修改jmeter\bin\jmeter.properties文件中的一個屬性:將encoding=後面的編碼格式改成utf-8,以下:
四、內存OOM(OutOfMemoryError:內存溢出)
在執行壓力測試時候,有時候會遇到OutOfMemoryError這樣的異常;JMeter是一個純Java開發的工具,內存是由java虛擬機JVM管理;若是出現了內存溢出的問題,
能夠經過調整JVM內存相關的參數進行優化。
具體過程以下:
①找到jmeter.bat文件,也就是咱們啓動jmeter的腳本:
②打開jmeter.bat文件,對一下這些配置項進行編輯:
③參數調整:
調整堆內存的大小:
將默認的set HEAP=-Xms512m -Xmx512m,調整爲set HEAP=-Xms1024m -Xmx1024m;
調整堆內存中新生帶的大小:
將默認的set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m,調整爲set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m;
調整堆內存中永久帶的大小:
將默認的set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m,調整爲set PERM=-XX:PermSize=128m -XX:MaxPermSize=256m;
調整後重啓jmeter,問題通常能夠獲得解決(參數的調整不能一律而論,具體根據測試機的硬件配置來決定)。
五、Listener使用技巧
listener做爲一個收集sampler的結果數據和呈現結果的文件,其自己會在每次sampler運行完成後執行一次,即一個test plan中的listener數量越多,運行時listener自己帶來的資源消耗
就越大(尤爲是view results in table以及view results tree等)。
所以實際執行test plan時,應首先禁用不須要的listener,再開始執行;更好的方式是每次運行時將生成的結果寫入結果文件中,方便之後用不一樣的listener展示保存的結果數據。
固然,在併發量較大的狀況下,通常的測試機限於配置等因素,沒法支撐較大的併發數,能夠用如下的方法來進行測試,方法以下:
去掉listener,爲sampler添加斷言(通常是響應斷言),根據斷言結果來判斷請求是否成功,測試報告以plugins插件中的報告形式或文本形式寫入文件中來提高測試效率。
六、調試test plan
不少測試人員在初始進行性能測試時,腳本都是錄製獲得的,但錄製的腳本通常都包含不少對本次測試來講無用的sampler,以及錄製的sampler須要從新修改參數等內容,才能使用。
因此調試test plan就頗有必要,經常使用的有如下2種方法:
①使用listener觀察sampler的請求和相應
錄製的腳本,通常都須要剔除無用的sampler,而後修改參數,進行調試,才能用於測試執行,通常用於調試的listener是結果樹,能夠在測試計劃中將線程組的數量修改成1,而後執行。
listener顯示的每個sampler結果爲綠色(表示經過),但jmeter僅根據http返回碼來判斷sampler執行是否成功,這樣沒法判斷sampler語義上的錯誤;所以,通常都是在sampler
中插入對應的檢查點(Assertion:斷言),根據返回的內容,來判斷sampler是否真正成功。
②使用http Mirror server觀察sampler發出的請求
在調試和修改sampler時,常常會爲其增長一些額外的設置,例如額外的信息頭、cookie管理器等,但設置完成後直接運行腳本進行測試,並不能保證請求真的和咱們預期的一致。
若是不想將請求發送給被測應用,能夠使用http mirror server組件(http鏡像服務器)。
http mirror server能夠啓動一個鏡像服務器,其能夠把全部接收到的請求原封不動的返回,這樣就能夠查看發出的請求的具體內容。
使用方法以下:
點擊工做臺,右鍵添加→http mirror server,若有必要修改服務器端口(通常修改成localhost:8080,方便調試),而後啓動鏡像服務器;
其次修改須要調試的sampler,將其請求發送到mirror server啓動的端口,運行測試計劃,便可以從listener中查看響應數據。
PS:其實http mirror server更大的做用是檢查瀏覽器是否發送了特殊的http頭,啓動mirror server,使用瀏覽器訪問該server,則能夠在返回頁面看到瀏覽器發送請求的完整內容。
第一部分:目前工做中涉及到的content-type 有三種:
content-type:在Request Headers裏,告訴服務器咱們發送的請求信息是哪一種格式的。
1 content-type:application/x-www-form-urlencoded
默認的。若是不指定content-type,默認使用此格式。
參數格式:key1=value1&key2=value2
2 content-type:application/json
參數爲json格式
{
"key1":"value1",
"key2":"value2"
}
3 content-type:multipart/form-data [dinghanhua]
上傳文件用這種格式
發送的請求示例:
第二部分 不一樣的content-type如何輸入參數
1 content-type:application/x-www-form-urlencoded
參數能夠在Parameters或Body Data裏輸入,格式不一樣,以下圖所示。
這兩個參數輸入的tab頁只能使用一個,某一個有數據後不能切換到另外一個。
Parameters:
Body Data:
2 content-type:application/json
2.1 首先添加信息頭管理。http請求上點擊右鍵》添加》配置元件》 HTTP信息頭管理器
2.2 信息頭編輯頁面,點擊添加,輸入content-type application/json
2.3 在http請求,Body Data中輸入json格式的參數
3 content-type:multipart/form-data [dinghanhua]
在http請求編輯頁面,選中Use multipart/form-data for POST
Parameters中輸入除了上傳的文件之外的參數:參數名和參數值
Files Upload中上傳文件,參數名和MIME類型
上傳文件若是不成功,修改Implementation爲java試一下。
1、使用jmeter函數助手
啓動jmeter後,能夠在JMeter的選項菜單中找到函數助手對話框(快捷鍵:Ctrl+Shift+F1),以下圖所示:
打開函數助手,能夠從下拉列表中選擇一個函數,併爲其參數設定值,不一樣函數要求的參數也不一樣;表格的左邊一列是函數參數的簡要描述,右邊一列是供用戶填充參數的值。
2、經常使用JMeter函數
一、__regexFunction
正則表達式函數能夠使用正則表達式(用戶提供的)來解析前面的服務器響應(或者是某個變量值),函數會返回一個有模板的字符串,其中攜帶有可變的值。
__regexFunction還能夠被用來保存值,以便供後續使用。
在函數的第6個參數中,能夠指定一個引用名;在函數執行之後,能夠使用用戶定義值的語法來獲取一樣的值。例如,若是輸入"refName"做爲第6個參數,那麼能夠使用:
${refName}來引用第2個參數(Template for the replacement string)的計算結果,這依賴於函數的解析結果;
${refName_g0}來引用函數解析後發現的全部匹配結果;
${refName_g1}來引用函數解析後發現的第一個匹配組合;
${refName_g#}來引用函數解析後發現的第n個匹配組合;
${refName_matchNr}來引用函數總共發現的匹配組合數目;
參數以下表所示:
函數參數 |
描述 |
是否必需 |
第1個參數 |
第1個參數是用於解析服務器響應數據的正則表達式,它會找到全部匹配項;若是但願將表達式中的 某部分應用在模板字符串中,必定記得爲其加上圓括號。例如,<a href="(.*)">,這樣就會將鏈 接的值存放到第一個匹配組合中(這裏只有一個匹配組合)。又如,<input type="hidden" name="(.*)"value="(.*)">,在這個例子中,連接的name做爲第一個匹配組合,連接的value會 做爲第二個匹配組合,這些組合能夠用在測試人員的模板字符串中。 |
是 |
第2個參數 |
這是一個模板字符串,函數會動態填寫字符串的部份內容。要在字符串中引用正則表達式捕獲的匹配組 合,請使用語法:[groupnumber][groupnumber]。例如11或者 22,模板能夠是任何字符串。 |
是 |
第3個參數 |
第3個參數告訴JMeter使用第幾回匹配;測試人員的正則表達式可能會找到多個匹配項,對此, 有4種選擇: n 整數,直接告訴JMeter使用第幾個匹配項; n 「1」對應第一個匹配,「2」對應第二個匹配,以此類推; n RAND,告訴JMeter隨機選擇一個匹配項; n ALL,告訴JMeter使用全部匹配項,爲每一個匹配項建立一個模板字符串,並將它們鏈接在一塊兒 n 浮點值0到1之間,根據公式(找到的總匹配數目*指定浮點值)計算使用第幾個匹配項,計算值 向最近的整數取整 |
否,默認值爲1 |
第4個參數 |
若是在上一個參數中選擇了「ALL」,那麼這第4個參數會被插入到重複的模板值之間 |
否 |
第5個參數 |
若是沒有找到匹配項返回的默認值 |
否 |
第6個參數 |
重用函數解析值的引用名,參見上面內容 |
否 |
第7個參數 |
輸入變量名稱。若是指定了這一參數,那麼該變量的值就會做爲函數的輸入,而再也不使用前面的採樣結 果做爲搜索對象 |
否 |
二、__counter
每次調用計數器函數都會產生一個新值,從1開始每次加1。計數器既能夠被配置成針對每一個虛擬用戶是獨立的,也能夠被配置成全部虛擬用戶公用的。若是每一個虛擬用戶的計數器
是獨立增加的,那麼一般被用於記錄測試計劃運行了多少遍。全局計數器一般被用於記錄發送了多少次請求,計數器使用一個整數值來記錄,容許的最大值爲2,147,483,647。
目前計數器函數實例是獨立實現的(JMeter 2.1.1及其之前版本,使用一個固定的線程變量來跟蹤每一個用戶的計數器,所以多個計數器函數會操做同一個值)。
全局計數器(FALSE)每一個計數器實例都是獨立維護的。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
第1個參數 |
True,若是但願每一個虛擬用戶的計數器保持獨立,與其餘用戶的計數器相區別; false,全局計數器; |
是 |
第2個參數 |
重用計數器函數建立值的引用名。能夠這樣引用計數器的值:${refName}。這樣一來,就能夠建立一個 計數器後,在多個地方引用它的值(JMeter 2.1.1及其之前版本,這個參數是必需的) |
否 |
三、__threadNum
函數__threadNum只是簡單地返回當前線程的編號。線程編號不依賴於線程組,這就意味着從函數的角度看來,某個線程組的線程#1和另外一個線程組的線程#1是沒有區別的。
另外,該函數沒有參數。這一函數不能用在任何配置元件中(如用戶定義的變量),緣由在於配置元件是由一個獨立線程運行的。另外在測試計劃中使用也是沒有意義的。
4)__intSum
函數__intSum能夠被用來計算兩個或者更多整數值的合。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
第1個參數 |
第1個整數值 |
是 |
第2個參數 |
第2個整數值 |
是 |
第n個參數 |
第n個整數值 |
否 |
最後一個參數 |
重用函數計算值的引用名。若是用戶指定了這一參數,那麼引用名中必須包含一個非數字字母,不然它會被當成另 一個整數值,而被函數用於計算 |
否 |
JMeter 2.3.1及其之前版本,要求必須有引用名參數。後續JMeter版本中,引用名是可選的參數,可是引用名不能是整數值。
五、__longSum
函數__ longSum能夠被用來計算兩個或者更多長整型值的合。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
第1個參數 |
第1個長整型值 |
是 |
第2個參數 |
第2個長整型值 |
是 |
第n個參數 |
第n個長整型值 |
否 |
最後一個參數 |
重用函數計算值的引用名。若是用戶指定了這一參數,那麼引用名中必須包含一個非數字字母,不然它會被當成 另外一個長整型值,而被函數用於計算 |
否 |
六、__StringFromFile
__StringFromFile能夠被用來從文本文件中讀取字符串,這對須要大量可變數據的測試頗有用。例如,當測試一個銀行系統時,測試人員可能須要100條甚至1000條帳戶信息。
使用配置元件CSV Data Set Config ,也能達到相同的目的,並且方法更簡單,可是該配置元件目前不支持多輸入文件。
每次調用函數,都會從文件中讀取下一行。當到達文件末尾時,函數又會從文件開始處從新讀取,直到最大循環次數。若是在一個測試腳本中對該函數有屢次引用,那麼每一次引用
都會獨立打開文件,即便文件名是相同的(若是函數讀取的值,在腳本其餘地方也有使用,那麼就須要爲每一次函數調用指定不一樣的變量名)。
若是在打開或者讀取文件時發生錯誤,那麼函數就會返回字符串"**ERR**"。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
文件名 |
文件名(能夠使用相對於JMeter啓動目錄的相對路徑)。若是要在文件名中使用可選的序列號,那麼文件名 必須適合轉成十進制格式。參考下面的例子 |
是 |
變量名 |
一個引用名(refName)的目的是複用這一函數建立的值。能夠使用語法${refName}來引用函數建立的 值。默認值爲「StringFromFile_」 |
否 |
初始序列號 |
初始序列號(若是省略這一參數,終止序列號會做爲一個循環計數器) |
否 |
終止序列號 |
終止序列號(若是省略這一參數,序列號會一直增長下去,不會受到限制) |
否 |
當打開或者從新打開文件時,文件名參數將會被解析;每次執行函數時,引用名參數(若是支持)將會被解析。
使用序列號:當使用可選的序列號時,文件名須要使用格式字符串Java.text.DecimalFormat;當前的序列號會做爲惟一的參數,若是不指明可選的初始序列號,
就使用文件名做爲起始值。一些有用的格式序列以下:
#:插入數字,不從零開始,不包含空格。
000:插入數字,包含3個數字組合,不從零開始。
例如:
①pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat
②pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat
③pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999
若是不但願某個格式字符被翻譯,測試人員須要爲它加上單引號;注意"."是格式字符,必須被單引號所包含。
若是省略了初始序列號,而終止序列號參數將會做爲循環計數器,文件將會被使用指定的次數。例如:
${_StringFromFile(PIN#'.'DAT,,1,2)}:讀取 PIN1.DAT, PIN2.DAT。
${_StringFromFile(PIN.DAT,,,2)}:讀取 PIN.DAT 兩次。
七、__machineName
函數__machineName返回本機的主機名。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
變量名 |
重用函數計算值的引用名 |
否 |
八、__javaScript
函數__javaScript能夠用來執行JavaScript代碼片斷(非Java),並返回結果值。JMeter的_javaScript函數會調用標準的JavaScript解釋器;
JavaScript會做爲腳本語言使用,所以測試人員能夠作相應的計算;在腳本中能夠訪問以下一些變量:
Log:該函數的日誌記錄器;
Ctx:JmeterContext對象;
Vars:JmeterVariables對象;
threadName:字符串包含當前線程名稱 (在2.3.2 版本中它被誤寫爲"theadName");
sampler:當前採樣器對象(若是存在);
sampleResult:前面的採樣結果對象(若是存在);
props:JMeter屬性對象;
Rhinoscript容許經過它的包對象來訪問靜態方法;例如,用戶能夠使用以下方法訪問JMeterContextService靜態方法:
Packages.org.apache.jmeter.threads.JMeterContextService.getTotalThreads()
JMeter不是一款瀏覽器,它不會執行從頁面下載的JavaScript;
參數以下表所示:
函數參數 |
描述 |
是否必需 |
JavaScript代碼片斷 |
待執行的JavaScript代碼片斷;例如: n new Date():返回當前日期和時間 n Math.floor(Math.random()*(${maxRandom}+1)):在0和變量maxRandom之間的隨機數 n ${minRandom}+Math.floor(Math.random()*(maxRandom−maxRandom−{minRandom}+1)): n 在變量 minRandom和maxRandom之間的隨機數 n "${VAR}"=="abcd" |
是 |
變量名 |
重用函數計算值的引用名 |
否 |
請記得爲文本字符串添加必要的引號。另外,若是表達式中有逗號,請確保對其轉義。例如,{__javaScript('{__javaScript('{sp}'.slice(7\,99999))},對7以後的逗號進行了轉義。
九、__Random
函數__Random會返回指定最大值和最小值之間的隨機數。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
最小值 |
最小數值 |
是 |
最大值 |
最大數值 |
是 |
變量名 |
重用函數計算值的引用名 |
否 |
十、__CSVRead
函數__CSVRead會從CSV文件讀取一個字符串(請注意與StringFromFile 的區別)。
JMeter 1.9.1之前的版本僅支持從單個文件中讀取,JMeter 1.9.1及其之後版本支持從多個文件中讀取。在大多數狀況下,新配置元件CSV Data Set更好用一些。
當對某文件進行第一次讀取時,文件將被打開並讀取到一個內部數組中;若是在讀取過程當中找到了空行,函數就認爲到達文件末尾了,即容許拖尾註釋(JMeter 1.9.1版本引入);
後續全部對同一個文件名的引用,都使用相同的內部數組。另外,文件名大小寫對函數調用很重要,哪怕操做系統不區分大小寫,CSVRead(abc.txt,0)和CSVRead(aBc.txt,0)
會引用不一樣的內部數組;使用*ALIAS特性能夠屢次打開同一個文件,另外還能縮減文件名稱。
每個線程都有獨立的內部指針指向文件數組中的當前行;當某個線程第一次引用文件時,函數會爲線程在數組中分配下一個空閒行。如此一來,任何一個線程訪問的文件行,
都與其餘線程不一樣(除非線程數大於數組包含的行數)。
默認下,函數會在遇到每個逗號處斷行;若是但願在輸入列中使用逗號,那麼須要換一個分隔符(設置屬性csvread.delimiter實現),且該符號沒有在CSV文件任何列中出現。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
文件名 |
設置從哪一個文件讀取(或者*ALIAS) |
是 |
列數 |
從文件的哪一列讀取。0=第一列, 1=第二列,依此類推。「next」爲走到文件的下一行。*ALIAS爲打開 一個文件,並給它分配一個別名 |
是 |
例如,能夠用以下參數來設置某些變量:
①COL1a ${__CSVRead(random.txt,0)}
②COL2a {__CSVRead(random.txt,1)}{__CSVRead(random.txt,1)}{__CSVRead(random.txt,next)}
③COL1b ${__CSVRead(random.txt,0)}
④COL2b {__CSVRead(random.txt,1)}{__CSVRead(random.txt,1)}{__CSVRead(random.txt,next)}
上面例子會從一行中讀取兩列,接着從下一行中讀取兩列。若是全部變量都在同一個前置處理器中(用戶參數上定義),那麼行都是順序讀取的。不然,不一樣線程可能會讀取不一樣的行。
這一函數並不適合於讀取很大的文件,由於整個文件都會被存儲到內存之中。對於較大的文件,請使用配置元件CSV Data Set或者StringFromFile 。
十一、__property
函數__property會返回一個JMeter屬性的值。若是函數找不到屬性值,而又沒有提供默認值,則它會返回屬性的名稱。
例如:
${__property(user.dir)}:返回屬性user.dir的值;
${__property(user.dir,UDIR)}:返回屬性user.dir的值,並保存在變量UDIR中;
${__property(abcd,ABCD,atod)}:返回屬性abcd的值 (若是屬性沒有定義,返回"atod"),並保存在變量ABCD 中;
${__property(abcd,,atod)}:返回屬性abcd 的值(若是屬性沒有定義,返回"atod"),可是並不保存函數的返回值;
參數以下表所示:
函數參數 |
描述 |
是否必需 |
屬性名 |
獲取屬性值、所需的屬性名 |
是 |
變量名 |
重用函數計算值的引用名 |
否 |
默認值 |
屬性未定義時的默認值 |
否 |
十二、_P
函數_P是一個簡化版的屬性函數,目的是使用在命令行中定義的屬性。不一樣於函數_property,本函數沒有提供選項用於設置保存屬性值的變量。
另外,若是沒有設置默認值,默認值自動設爲1。之因此選擇1,緣由在於它對於不少常見測試變量都是一個合理值,例如,循環次數、線程數、啓動線程耗時間等。
例如:定義屬性值:
jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu
獲取值以下:
${__P(group1.threads)}:返回屬性group1.threads的值;
${__P(group1.loops)}:返回屬性group1.loops 的值;
${__P(hostname,www.dummy.org)}:返回屬性hostname的值,若是沒有定義該屬性則返回值www.dummy.org;
在上面的例子中,第一個函數調用返回7,第二個函數調用返回1,而最後一個函數調用返回www.dummy.org(除非這些屬性在其餘地方有定義);
參數以下表所示:
函數參數 |
描述 |
是否必需 |
屬性名 |
獲取屬性值、所需的屬性名 |
是 |
默認值 |
屬性未定義時的默認值。若是省略此參數,默認值自動設爲1 |
否 |
1三、__log
函數__log會記錄一條日誌,並返回函數的輸入字符串。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待記錄字符串 |
一個字符串 |
是 |
日誌級別 |
OUT、ERR、DEBUG、INFO(默認)、WARN或者ERROR |
否 |
可拋棄的文本 |
若是非空,會建立一個可拋棄的文本傳遞給記錄器 |
否 |
註釋 |
若是存在,註釋會在字符串中展現,用於標識日誌記錄了什麼 |
否 |
OUT 和ERR的日誌級別,將會分別致使輸出記錄到System.out和System.err中。在這種狀況下,輸出老是會被打印(它不依賴於當前的日誌設置)。
例如:
${__log(Message)}:寫入日誌文件,形如"...thread Name : Message";
${__log(Message,OUT)}:寫到控制檯窗口;
{__log({__log({VAR},,,VAR=)}:寫入日誌文件,形如"...thread Name VAR=value";
1四、__logn
函數__logn會記錄一條日誌,並返回空字符串。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待記錄字符串 |
一個字符串 |
是 |
日誌級別 |
OUT,ERR,DEBUG, INFO(默認),WARN 或者ERROR |
否 |
可拋棄的文本 |
若是非空,會建立一個可拋棄的文本傳遞給記錄器 |
否 |
OUT和ERR的日誌級別,將會分別致使輸出記錄到System.out和System.err中。在這種狀況下,輸出老是會被打印(它不依賴於當前的日誌設置)。
例如:{__logn(VAR1={__logn(VAR1={VAR1},OUT)}:將變量值寫到控制檯窗口中。
1五、__BeanShell
函數__BeanShell會執行傳遞給它的腳本,並返回結果。關於BeanShell的詳細資料,請參考BeanShell的Web站點:http://www.beanshell.org/ 。
須要注意,測試腳本中每個獨立出現的函數調用,都會使用不一樣的解釋器,可是後續對函數調用的援引會使用相同的解釋器;這就意味着變量會持續存在,並跨越函數調用。
單個函數實例能夠從多個線程調用。另外,該函數的execute()方法是同步的。若是定義了屬性"beanshell.function.init",那麼它會做爲一個源文件傳遞給解釋器。
這樣就能夠定義一些通用方法和變量。在bin目錄中有一個初始化文件的例子:BeanShellFunction.bshrc。
以下變量在腳本執行前就已經設置:
log:函數BeanShell(*)的記錄器;
ctx:目前的JMeter Context變量;
vars:目前的JMeter變量;
props:JMeter屬性對象;
threadName:線程名(字符串);
sampler:當前採樣器(若是存在);
sampleResult:當前採樣器(若是存在);
"*"意味着該變量在JMeter使用初始化文件以前就已經設置了。其餘變量在不一樣調用之間可能會發生變化;
參數以下表所示:
函數參數 |
描述 |
是否必需 |
BeanShell腳本 |
一個BeanShell腳本(不是文件名) |
是 |
變量名 |
重用函數計算值的引用名 |
否 |
例如:
${__BeanShell(123*456)}:回56088;
${__BeanShell(source("function.bsh"))}:行在function.bsh中的腳本;
請記得爲文本字符串及表明文本字符串的JMeter變量添加必要的引號;
1六、__plit
函數__split會經過分隔符來拆分傳遞給它的字符串,並返回原始的字符串。若是分隔符緊挨在一塊兒,那麼函數就會以變量值的形式返回"?"。
拆分出來的字符串,以變量${VAR_1}、{VAR_2}…以此類推的形式加以返回。JMeter 2.1.2及其之後版本,拖尾的分隔符會被認爲缺乏一個變量,會返回"?"。
另外,爲了更好地配合ForEach控制器,如今__split會刪除第一個不用的變量(由前一次分隔符所設置)。
在測試計劃中定義變量VAR="a||c|":{__split({__split({VAR},VAR),|} ,該函數調用會返回VAR變量的值,例如"a||c|",並設定VAR_n=4(3 ,JMeter 2.1.1及之前版本)、
VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?(null,JMeter 2.1.1及其之前版本)、VAR_5=null(JMeter 2.1.2及其之後版本)變量的值。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待拆分字符串 |
一個待拆分字符串,例如「a|b|c」 |
是 |
變量名 |
重用函數計算值的引用名 |
否 |
分隔符 |
分隔符,例如「|」。若是省略了此參數,函數會使用逗號作分隔符。須要注意的是,假如 要畫蛇添足,明確指定使用逗號,須要對逗號轉義,如「\,」 |
否 |
1七、__XPath
函數__XPath讀取XML文件,並在文件中尋找與指定XPath相匹配的地方。每調用函數一次,就會返回下一個匹配項。到達文件末尾後,會從頭開始。
若是沒有匹配的節點,那麼函數會返回空字符串,另外,還會向JMeter日誌文件寫一條警告信息;整個節點列表都會被保存在內存之中。
例如:
${__XPath(/path/to/build.xml, //target/@name)}
這會找到build.xml文件中的全部目標節點,並返回下一個name屬性的內容。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
XML文件名 |
一個待解析的XML文件名 |
是 |
XPath |
一個XPath表達式,用於在XML文件中尋找目標節點 |
是 |
1八、__setProperty
函數__setProperty用於設置JMeter屬性的值。函數的默認返回值是空字符串,所以該函數能夠被用在任何地方,只要對函數自己調用是正確的。
經過將函數可選的第3個參數設置爲"true",函數就會返回屬性的原始值。屬性對於JMeter是全局的,所以能夠被用來在線程和線程組之間通訊。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
屬性名 |
待設置屬性名 |
是 |
屬性值 |
屬性的值 |
是 |
True/False |
是否返回屬性原始值 |
否 |
1九、__time
函數__time能夠經過多種格式返回當前時間。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
格式 |
設置時間所採用的格式 |
否 |
變量名 |
待設置變量名 |
否 |
若是省略了格式字符串,那麼函數會以毫秒的形式返回當前時間。其餘狀況下,當前時間會被轉成簡單日期格式。包含以下形式:
YMD = yyyyMMdd;
HMS = HHmmss;
YMDHMS = yyyyMMdd-HHmmss;
USER1 = JMeter屬性time.USER1;
USER2 = JMeter屬性time.USER2;
用戶能夠經過修改JMeter屬性來改變默認格式,例如:time.YMD=yyMMdd。
20、_jexl
函數_jexl能夠用於執行通用JEXL表達式,並返回執行結果
參數以下表所示:
函數參數 |
描述 |
是否必需 |
表達式 |
待執行的表達式。例如,6*(5+2) |
是 |
變量名 |
待設置變量名 |
否 |
以下變量能夠經過腳本進行訪問:
log:函數記錄器;
ctx:JMeterContext對象;
vars:JMeterVariables對象;
props:JMeter屬性對象;
threadName:字符串包含當前線程名稱 (在2.3.2 版本中它被誤寫爲"theadName");
sampler:當前的採樣器對象(若是存在);
sampleResult:前面的採樣結果對象(若是存在);
OUT - System.out,例如 OUT.println("message");
JEXL能夠基於它們來建立類,或者調用方法,例如:
①Systemclass=log.class.forName("java.lang.System");
②now=Systemclass.currentTimeMillis();
須要注意的是,Web站點上的JEXL文檔錯誤地建議使用"div"作整數除法。事實上"div"和"/"都執行普通除法。
JMeter 2.3.2之後的版本容許在表達式中包含多個聲明。JMeter 2.3.2及其之前的版本只處理第一個聲明(若是存在多個聲明,就會記錄一條警告日誌)。
2一、__V
函數__V能夠用於執行變量名錶達式,並返回執行結果。它能夠被用於執行嵌套函數引用(目前JMeter不支持)。
例如,若是存在變量A一、A2和N=1,則:
${A1}:能正常工做;
{A{A{N}}:沒法正常工做(嵌套變量引用);
{__V(A${N})}:能夠正常工做。A{__V(A${N})}:能夠正常工做。A{N}變爲A1,函數 __V返回變量值A1;
參數以下表所示:
函數參數 |
描述 |
是否必需 |
變量名錶達式 |
待執行變量名錶達式 |
是 |
2二、__evalVar
函數__evalVar能夠用來執行保存在變量中的表達式,並返回執行結果。
如此一來,用戶能夠從文件中讀取一行字符串,並處理字符串中引用的變量。例如,假設變量"query"中包含有"selectcolumnfromcolumnfrom{table}",
而"column"和"table"中分別包含有"name"和"customers",那麼${__evalVar(query)}將會執行"select name from customers"。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
變量名 |
待執行變量名 |
是 |
2三、__eval
函數__eval能夠用來執行一個字符串表達式,並返回執行結果。如此一來,用戶就能夠對字符串(存儲在變量中)中的變量和函數引用作出修改。
例如,給定變量name=Smith、column=age、table=birthdays、SQL=select columnfromcolumnfrom{table} where name='${name}',
那麼經過{__eval({__eval({SQL})},就能執行"select age from birthdays where name='Smith'"。這樣一來,就能夠與CSV數據集相互配合;
例如:將SQL語句和值都定義在數據文件中。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
變量名 |
待執行變量 |
是 |
2四、__char
函數__char會將一串數字翻譯成Unicode字符,另外還請參考下面__unescape()函數。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
Unicode字符編碼(十進制數或者十六進制數) |
待轉換的Unicode字符編碼,能夠是十進制數或者十六進制數 |
是 |
Unicode字符編碼(十進制數或者十六進制數) 待轉換的Unicode字符編碼,能夠是十進制數或者十六進制數;
例如:
①${__char(0xC,0xA)} = CRLF
②${__char(165)} = � (yen)
2五、__unescape
函數__unescape用於反轉義Java-escaped字符串,另外還請參考上面的__char函數。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待反轉義字符串 |
待反轉義字符串 |
是 |
例如:
①${__unescape(\r\n)} = CRLF
②${__unescape(1\t2)} = 1[tab]2
2六、__unescapeHtml
函數__unescapeHtml用於反轉義一個包含HTML實體的字符串,將其變爲包含實際Unicode字符的字符串。支持HTML 4.0實體。
例如,字符串"<Français>"變爲"<Fran?ais>"。
若是函數不認識某個實體,就會將實體保留下來,並一字不差地插入結果字符串中。例如,">&zzzz;x"會變爲">&zzzz;x"。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待反轉義字符串 |
待反轉義字符串 |
是 |
2七、__escapeHtml
函數__escapeHtml用於轉義字符串中的字符(使用HTML實體)。支持HTML 4.0實體。
例如,"bread" & "butter"變爲"bread" & "butter"。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
待轉義字符串 |
待轉義字符串 |
是 |
2八、__FileToString
函數__FileToString能夠被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。
若是在打開或者讀取文件時發生錯誤,那麼函數就會返回字符串"**ERR**"。
參數以下表所示:
函數參數 |
描述 |
是否必需 |
文件名 |
包含路徑的文件名(路徑能夠是相對於JMeter啓動目錄的相對路徑) |
是 |
文件編碼方式(若是不採 用平臺默認的編碼方式) |
讀取文件須要用到的文件編碼方式。若是沒有指明就使用平臺默認的編碼方式 |
否 |
變量名 |
引用名(refName)用於重用函數建立的值 |
否 |
3、變量
一、預約義變量
大多數變量都是經過函數調用和測試元件(如用戶定義變量)來設置的;在這種狀況下用戶擁有對變量名的完整控制權。可是有些變量是JMeter內置的。例如:
Cookiename:包含Cookie值。
JMeterThread.last_sample_ok:最近的採樣是否能夠(true/false)。
二、預約義變量屬性
JMeter屬性集是在JMeter啓動時經過系統屬性初始化的;其餘補充JMeter屬性來自於jmeter.properties、user.properties或者命令行。
JMeter還另外定義了一些內置屬性。下面是具體列表。從方便的角度考慮,屬性START的值會被複制到同名變量中去。
START.MS:以毫秒爲單位的JMeter啓動時間;
START.YMD:JMeter啓動日期格式yyyyMMdd;
START.HMS:JMeter啓動時間格式HHmmss;
TESTSTART.MS:以毫秒爲單位的測試啓動時間;
請注意:START變量/屬性表徵的是JMeter啓動時間,而非測試的啓動時間。它們主要用於文件名之中。
先說說利用jmeter生成數據的幾種方法:
一、CSV Data Set Config
這個元件被用來在參數化生成數據時使用,簡單高效,容易生成有序數;只須要新建excel,而後經過拖拽、複製黏貼等方式產生不一樣的數據,而後讀取調用便可。
但它也有不足之處,以下:
①若是數據庫中某些表的某些字段不容許重複(好比訂單號),那麼在完成一輪測試後,再次測試須要從新手動構造新的不重複的數據;
②excel只有數字格式才能夠經過拖拽生成增加數據;
③數據量過大時,容易被excel修改成科學計數法;
二、${_Random}
${_Random}是jmeter函數助手裏面自帶的一個函數,做用是返回指定的最大值和最小值之間的一個隨機數。
缺點:數值可能會重複出現;
若是須要引用的數據量較大,且要求不能重複或者須要自增,那麼能夠使用計數器來實現。
計數器(counter):容許用戶建立一個在線程組以內均可以被引用的計數器。
計數器容許用戶配置一個起點,一個最大值,增量數,循環到最大值,而後從新開始,繼續這樣,直到測試結束。計數器使用long存儲的值,所取的範圍是2^63——2^63-1.
一、啓動jmeter,添加線程組,右鍵添加配置元件——計數器
計數器界面以下:
啓動(start):給定計數器的起始值、初始值,第一次迭代時,會把該值賦給計數器
PS:英文版是Start,Jmeter的中文語言將Start翻譯成了「啓動」,有些歧義
遞增(Increment):每次迭代後,給計數器增長的值
最大值(Maximum):計數器的最大值,若是超過最大值,從新設置爲初始值(Start),默認的最大值爲Long.MAX_VALUE,2^63-1(若是持續壓測,建議最好不要設置最大值)
Number format:可選格式,好比000,格式化爲001,002;默認格式爲Long.toString(),可是默認格式下,仍是能夠看成數字使用
引用名稱(Reference Name):用於控制在其它元素中引用該值,形式:$(reference_name}
與每用戶獨立的跟蹤計數器(Track Counter Independently for each User):全局的計數器,若是不勾選,即全局的,好比用戶#1 獲取值爲1,用戶#2獲取值仍是爲1;
若是勾選,即獨立的,則每一個用戶有本身的值:好比用戶#1 獲取值爲1,用戶#2獲取值爲2。
每次迭代復原計數器(Reset counter on each Thread Group Iteration):可選,僅勾選與每用戶獨立的跟蹤計數器時可用;
若是勾選,則每次線程組迭代,都會重置計數器的值,當線程組是在一個循環控制器內時比較有用。
二、具體過程
①計數器設置
②取樣器設置
③結果樹請求內容
從上圖能夠看出,計數器成功的生成了咱們所需的值。
PS:以上就是計數器的使用方法;爲了方便演示,請求地址和路徑是隨便選用的,忽略紅色報錯便可。。。
首先得了解一下這些東西,之後才能快速的找到某些配置文件進行修改(舉個例子,改配置只是其中之一)
1、bin目錄
examples: 目錄中有CSV樣例
jmeter.bat windows的啓動文件
jmeter.log jmeter運行日誌文件
jmeter.sh linux的啓動文件
jmeter.properties 系統配置文件
jmeter-server.bat windows分佈式測試要用到的服務器配置
jmeters-server linux分佈式測試要用的服務器配置
其中系統配置文件中的SSL設置重點關注以下幾個:
# 指定HTTPS協議層
https.default.protocol=TLS
# 指定SSL版本
https.default.protocol=SSLv3
# 設置啓動的協議
https.socket.protocols=SSLv2Hello SSLv3 TLSv1
# 緩存控制,控制SSL是否能夠在多個迭代中重用
https.use.cached.ssl.context=true
2、docs目錄
接口文檔目錄。例C:\apache-jmeter-3.0\docs\api下的index.html
3、extras目錄
擴展插件目錄。提供了對Ant的支持,能夠使用Ant來實現自動化測試,例如批量腳本執行,產生html格式的報表,測試運行時,能夠把測試數據記錄下來,jmeter會
自動生成一個.jtl文件,將該文件放到extras目錄下,運行"ant -Dtest=文件名 report",就能夠生成測試統計報表。
4、lib目錄
所用到的插件目錄,裏面均爲jar包。jmeter會自動在jmeter_HOME/lib和ext目錄下尋找須要的類,lib下存放JMeter所依賴的外部jar,
如:httpclient.jar、httpcore.jar、httpmime.jar等等。
其中lib\ext目錄下存放有Jmeter依賴的核心jar包,ApacheJMeter_core.jar、ApacheJMeter_java.jar在寫client端須要引用,JMeter插件包也在此目錄下。
lib\junit下存放junit測試腳本.
5、Licenses目錄
jmeter證書目錄
6、Printable_docs目錄
用戶使用手冊,例C:\apache-jmeter-3.0\printable_docs下的index.html
jmeter提供的對關聯的支持包括如下2個方面:
①可以將返回頁面上的指定內容保存在參數中;
②可以將GET或POST方法中的數據使用該參數來替換;
XPath Extractor的使用方法與正則表達式提取器(Regular Expression Extractor)相似,只不過該Expression中指定的不是正則表達式,而是給定的XPath路徑。
首先,新建一個線程組,而後右鍵-添加-後置處理器-XPath Extractor:
這裏簡單介紹下jmeter後置處理器的做用:
後置處理器(Post Processor)本質上是一種對sampler發出請求後接受到的響應數據進行處理(後處理)的方法,結合以前我介紹過的jmeter元件的做用域和執行順序 ,
必須將後置處理器元件放在合適的位置才能達到預期的效果。
XPath Extractor界面以下:
APPly to:做用範圍(返回內容的斷言範圍)
Main sample and sub-samples:做用於父節點的取樣器及對應子節點的取樣器
Main sample only:僅做用於父節點的取樣器
Sub-samples only:僅做用於子節點的取樣器
JMeter Variable:做用於jmeter變量(輸入框內可輸入jmeter的變量名稱)
XML Parsing Options:要解析的XML參數
Use Tidy:當須要處理的頁面是HTML格式時,必須選中該選項;若是是XML或XHTML格式(例如RSS返回),則取消選中;
Quiet表示只顯示須要的HTML頁面,Report errors表示顯示響應報錯,Show warnings表示顯示警告;
Use Namespaces:若是啓用該選項,後續的XML解析器將使用命名空間來分辨;
Validate XML:根據頁面元素模式進行檢查解析;
Ignore Whitespace:忽略空白內容;
Fetch external DTDs:若是選中該項,外部將使用DTD規則來獲取頁面內容;
Return entire XPath fragment of text content:返回文本內容的整個XPath片斷;
Reference Name:存放提取出的值的參數。
XPath Query:用於提取值的XPath表達式。
Default Value:參數的默認值。
PS:XPath是XML/XHTML中經常使用的選取給定節點和節點集的方法。
正則表達式提取器和XPath Extractor的區別:
①正則表達式提取器能夠用於對頁面任何文本的提取,提取的內容是根據正則表達式在頁面內容中進行文本匹配;
②XPath Extractor則能夠提取返回頁面任意元素的任意屬性;
③若是須要提取的文本是頁面上某元素的屬性值,建議使用XPath Extractor;
④若是須要提取的文本在頁面上的位置不固定,或者不是元素的屬性,建議使用正則表達式提取器。
jmeter是一個開源靈活的接口和性能測試工具,固然也能利用jmeter進行接口自動化測試。在咱們利用它進行測試過程當中,最經常使用的sampler大概就是Http Request,
使用這個sampler時,通常都須要使用配置元件裏的http屬性管理器,其做用就是用於儘量的模擬瀏覽器的行爲,在http協議層上定製發送給被測應用的http請求。
jmeter提供如下五種http屬性管理器:
HTTP Cache Manager:Cache管理器
HTTP Cookie Manager:cookie管理器
HTTP Header Manager:信息頭管理器
HTTP Authorzation Manager:受權管理器
HTTP Request Defaults:請求默認值
一、HTTP Cache Manager
Clear cache each iteration?(每次迭代清空緩存):若是選擇該項,則該屬性管理器下的全部Sampler每次執行時都會清除緩存;
Use Cache-Control/Expires header when processing GET requests:在處理GET請求時使用緩存/過時信息頭;
Max Number of elements in cache(緩存中的最大元素數):默認數值爲5000,固然能夠根據須要自行修改;
PS:若是Test Plan中某個Sampler請求的元素是被緩存的元素,則Test Plan在運行過程當中會直接從Cache中讀取元素,這樣獲得的返回值就會是空。
在這種狀況下,若是爲該Sampler設置了斷言檢查響應體中的指定內容是否存在,該斷言就會失敗!
爲test plan增長該屬性管理器後,test plan運行過程當中會使用Last-Modified、ETag和Expired等決定是否從Cache中獲取對應元素。
Cache:通常指的是瀏覽器的緩存
Last-Modified:文件在服務端最後被修改的時間
ETag:在HTTP協議規格說明中定義爲:被請求變量的實體標記
Expired:給出的日期/時間以後;通常結合Last-Modified一塊兒使用,用於控制請求文件的有效時間
二、HTTP Cookie Manager
Clear cookie each iteration?(每次迭代時清除本身會話區域的全部cookie);
Implementation:實現方式;
Cookie Policy:cookie的管理策略,建議選擇compatibility,兼容性強;
PS:對於JMeter來講,一個test plan只能有一個cookie管理器。由於當多個magager存在時,JMeter沒有方法來指定使用那個manager;
同時,一個cookie manager中的存儲的cookie也不能被其餘cookie manager所引用,因此同一個計劃中不建議使用多個cookie manager;
若是你想讓JMeter的cookie manager支持跨域, 修改JMeter.property :CookieManager.check.cookies=false;
HTTP cookie Manager管理cookie有兩種方法:
①、它能夠像瀏覽器同樣存儲和發送cookie,若是發送一個帶cookie的http請求,cookie manager會自動存儲該請求的cookies,而且後面若是發送同源站點的http請求時,
均可以用這個cookies;每一個線程都有本身的「cookie存儲區域」,因此當測試一個使用cookie來管理session信息的web站點時,每一個JMeter線程都有本身的session;
PS:以這種自動收集的方式收集到的cookie不會在cookie manager中進行展現,可是運行後經過查看結果樹能夠查看到cookie信息,接受到的cookie會被自動存儲在線程變量中,
可是從Jmeter2.3.2版本後,默認再也不存儲,若是你想要manager自動存儲收集到 的cookie,你須要修改JMeter.property:CookieManager.save.cookies=true;
存儲的時候,cookie的key會以「COOKIE_」爲前綴命名(默認狀況),若是你想自定義這個前綴,修改JMeter.property:CookieManager.name.prefix= ;
②、除了上面說的自動收集,還能夠手動添加cookie,點擊界面下方的Add按鈕,而後輸入cookie的相關信息;
PS:通常不建議手動添加,能夠將cookie經過瀏覽器插件(好比Firefox的firebug)導出cookie,而後點擊界面下方的load按鈕,載入剛纔導出的cookie文件便可。
關於Cookie:
cookie通常分爲2種:持久cookie(Permanent cookie)和會話cookie(Session cookie):
持久cookie:保存在客戶端本地硬盤上,在瀏覽器被關閉後仍然存在;
會話cookie:一般保存在瀏覽器進程的會話中,一旦瀏覽器會話結束或關閉,cookie就再也不存在。
三、HTTP Header Manager
一般Jmeter向服務器發送http請求的時候,後端須要一些驗證信息,好比說web服務器須要帶過去cookie給服務器進行驗證,通常就是放在請求頭(header)中,或者請求傳參
須要定義參數格式等;所以對於此類請求,在Jmeter中能夠經過HTTP信息頭管理器,在添加http請求以前,添加一個HTTP信息頭管理器,發請求頭中的數據經過鍵值對的形式放到
HTTP信息頭管理器中,在日後端請求的時候就能夠模擬web攜帶header信息。
PS:能夠點擊添加、刪除按鈕等來新增和刪減信息頭的數據,也可經過載入按鈕來將信息頭數據加載進去(信息頭數據較多時推薦使用)。
四、HTTP Authorzation Manager
該屬性管理器用於設置自動對一些須要驗證的頁面進行驗證和登陸;
基礎URL:須要使用認證頁面的基礎URL,如上圖,當取樣器訪問它時,jmeter會使用定義的username和password進行認證和登陸;
用戶名:用於認證和登陸的用戶名;
密碼:用於認證和登陸的口令;
域:身份認證頁面的域名;
Realm:Realm字串;
Mechanism:機制;jmeter的http受權管理器目前提供2種認證機制:BASIC_DIGEST和KERBEROS:
BASIC_DIGEST:HTTP協議並無定義相關的安全認證方面的標準,而BASIC_DIGEST是一套基於http服務端的認證機制,保護相關資源避免被非法用戶訪問,
若是你要訪問被保護的資源,則必須要提供合法的用戶名和密碼。它和HTTPS沒有任何關係(前者爲用戶認證機制,後者爲信息通道加密)。
KERBEROS:一個基於共享祕鑰對稱加密的安全網絡認證系統,其避免了密碼在網上傳輸,將密碼做爲對稱加密的祕鑰,經過可否解密來驗證用戶身份;
五、HTTP Request Defaults
HTTP請求默認值,這個屬性管理器用於設置其做用範圍內的全部HTTP Request默認值,包括:
服務器請求或IP:請求發送的目標服務器名稱或地址;
端口:目標服務器的端口號,默認80;
協議:箱目標服務器發送請求所採用的協議,HTTP或HTTPS,默認HTTP;
Content encoding :內容的編碼方式,默認值爲iso8859;
路徑:目標URL路徑(不包括服務器地址和端口);
同請求一塊兒發送參數 : 對於帶參數的URL ,jmeter提供了一個簡單的對參數化的方法:用戶能夠將URL中全部參數設置在本表中,表中的每一行是一個參數值對;
從HTML文件獲取全部有內含的資源:該選項被選中時,jmeter在發出HTTP請求並得到響應的HTML文件內容後,還對該HTML進行Parse 並獲取HTML中包含的
全部資源(圖片、flash等),默認不選中;若是用戶只但願獲取頁面中的特定資源,能夠在下方的Embedded URLs must match 文本框中填入須要下載的特定資源表達式,
這樣,只有能匹配指定正則表達式的URL指向資源會被下載。
注意事項:
①、一個測試計劃中能夠有多個Defaults組件,多個Defaults組件的默認值會疊加;
②、兩個default中都定義的"Server Name or IP",顯示在發送請求時只能使用一個;
性能測試中,有時須要模擬一種實際生產中常常出現的狀況,即:從某個值開始不斷增長壓力,直至達到某個值,而後持續運行一段時間。
在jmeter中,有這樣一個插件,能夠幫咱們實現這個功能,這個插件就是:Stepping Thread Group
一、下載配置方法
Stepping Thread Group是jmeter插件的一種,其做用就是模擬實際的生產狀況,不斷對服務器施加壓力,直至到某個值,而後持續運行一段時間。
下載地址:https://jmeter-plugins.org/downloads/old/
下載界面以下:
下載後須要解壓,而後將JMeterPlugins-Standard.jar包放在jmeter安裝目錄的jmeter-3.0\lib\ext路徑下,從新啓動jemter便可。
二、使用介紹
啓動jmeter,添加線程組——jp@gc - Stepping Thread Group,以下圖:
Stepping Thread Group界面以下:
功能以下:
This group will start 100 threads:設置線程組啓動的線程總數爲100個;
First,wait for N seconds:啓動第一個線程以前,須要等待N秒;
Then start N threads:設置最開始時啓動N個線程;
Next,add 10 threads every 30 seconds,using ramp-up 5 seconds:每隔30秒,在5秒內啓動10個線程;
Then hold load for 60 seconds:啓動的線程總數達到最大值以後,再持續運行60秒;
Finally,stop 5 threads every 1 seconds:每秒中止5個線程;
3、相關插件
Stepping Thread Group插件相對來講比較舊,在plugins插件組中,還有一個相似的優化過的插件,叫作:Concurrency Thread Group
相關介紹以及下載地址以下:https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/
其實最好的辦法,是直接下載jmeter的第三方插件Plugin Manager(其中包含了不少擴展支持插件),解壓後將其放入jmeter安裝目錄的jmeter-3.0\lib\ext路徑下,而後重啓便可。
下載地址:https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/
jmeter的第三方擴展插件功能是很豐富的,也算必定程度上彌補了jmeter做爲開源工具的某些不足之處,具體的做用仍是須要在實戰中摸索實踐。。。
1、下載安裝及使用
下載地址:https://jmeter-plugins.org/
安裝:下載後文件爲plugins-manager.jar格式,將其放入jmeter安裝目錄下的lib/ext目錄,而後重啓jmeter,便可。
啓動jemter,點擊選項,最下面的一欄,以下圖所示:
打開後界面以下:
Installed Plugins(已安裝的插件):即插件jar包中已經包含的插件,能夠經過選中勾選框,來使用這些插件;
Available Plugins(可下載的插件):即該插件擴展的一些插件,能夠經過選中勾選框,來下載你所須要的插件;
Upgrades(可更新的插件):便可以更新到最新版本的一些插件,通常顯示爲加粗斜體,能夠經過點擊截圖右下角的Apply Changes and Restart Jmeter按鈕來下載更新;
PS:通常不建議進行更新操做,由於最新的插件都有一些兼容問題,並且極可能致使jmeter沒法使用(常常報加載類異常)!!!
建議使用jmeter最新的3.2版原本嘗試更新這些插件。。。
2、Transactions per Second
即TPS:每秒事務數,性能測試中,最重要的2個指標之一。該插件的做用是在測試腳本執行過程當中,監控查看服務器的TPS表現————好比總體趨勢、實時平均值走向、穩定性等。
jmeter自己的安裝包中,監視器雖然提供了好比聚合報告這種元件,也能提供一些實時的數據,但相比於要求更高的性能測試需求,就稍顯乏力。
經過上面的下載地址下載安裝好插件後,重啓jmeter,從監視器中就能夠看到該插件,以下圖所示:
某次壓力測試TPS變化展現圖:
3、Response Times Over Time
即TRT:事務響應時間,性能測試中,最重要的兩個指標的另一個。該插件的主要做用是在測試腳本執行過程當中,監控查看響應時間的實時平均值、總體響應時間走向等。
使用方法如上,下載安裝配置好插件以後,重啓jmeter,添加該監視器,便可實時看到實時的TRT數值及總體表現。
某次壓力測試TRT變化展現圖:
4、PerfMon Metrics Collector
即服務器性能監控數據採集器。在性能測試過程當中,除了監控TPS和TRT,還須要監控服務器的資源使用狀況,好比CPU、memory、I/O等。該插件能夠在性能測試中實時監控服務器的各項資源使用。
下載地址:https://jmeter-plugins.org/install/Install/
下載界面以下:
其中JMeterPlugins-Standard和JMeterPlugins-Extras是客戶端的插件,ServerAgent是服務端的插件。
下載成功後,複製JmeterPlugins-Extras.jar和JmeterPlugins-Standard.jar兩個文件,放到jmeter安裝文件中的lib/ext中,重啓jmeter,便可看到該監視器插件。以下圖:
將ServerAgent-2.2.1.jar上傳到被測服務器,解壓,進入目錄,Windows環境,雙擊ServerAgent.bat啓動;linux環境執ServerAgent.sh啓動,默認使用4444端口。
如出現以下圖所示狀況,即代表服務端配置成功:
一、服務端啓動校驗
CMD進入命令框,觀察是否有接收到消息,若是有,即代表ServerAgent成功啓動。
二、客戶端監聽測試
給測試腳本中添加jp@gc - PerfMon Metrics Collector監聽器,而後添加須要監控的服務器資源選項,啓動腳本,便可在該監聽器界面看到資源使用的曲線變化。以下圖所示:
在腳本啓動後,便可從界面看到服務器資源使用的曲線變化,Chart表示主界面顯示,Rows表示小界面以及不一樣資源曲線所表明的顏色,Settings表示設置,可選擇本身須要的配置。
PS:注意測試腳本須要持續運行一段時間,才能夠看到具體的曲線變化,不然ServerAgent端會斷開鏈接!
jmeter是一個java開發的開源性能測試工具,在性能測試中可支持模擬併發壓測,但有時候當模擬併發請求較大或者腳本運行時間較長時,壓力機會出現卡頓甚至報異常————內存溢出,
這裏就介紹下如何解決內存溢出及相關的知識點。。。
首先來看看咱們常說的內存泄漏、內存溢出是什麼?
內存泄露是指你的應用使用資源以後沒有及時釋放,致使應用內存中持有了不須要的資源,這是一種狀態描述;
內存溢出是指你應用的內存已經不能知足正常使用了,堆棧已經達到系統設置的最大值,進而致使崩潰,這事一種結果描述;
一般都是因爲內存泄露致使堆棧內存不斷增大,從而引起內存溢出。
在利用jmeter測試過程當中,若是內存溢出的話,通常會出現這個提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆內存溢出,不夠用了。
說到堆棧內存,順帶簡單介紹下堆棧的相關知識:
內存溢出解決方法:調整堆內存大小
步驟:
一、打開jmeter安裝文件(能夠用notepad++打開),bin目錄下的jmeter.bat文件:
二、找到set HEAP開頭的內容,根據具體須要修改堆(heap)值大小,以及NEW分配的內存值大小:
這裏默認值爲:
set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
將其修改成:
set HEAP=-Xms512m -Xmx4096m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m
注意:通常而言,堆的最大值不要超過物理內存的一半,不然容易致使jmeter運行變慢、卡頓甚至內存溢出(由於java自己的垃圾回收機制是動態分配內存,
調整時候其自己會佔用不少內存),NEW分配的內存,不宜太大!
三、修改完成後,關閉文件,重啓jmeter既能夠:
jmeter用了一年多,也斷斷續續寫了一些相關的博客,忽然發現沒有寫過度布式測試的一些東西,這篇博客就介紹下利用jmeter作分佈式測試的一些技術點吧,權當參考。。。
關於jmeter的介紹和元件做用,以前的博客介紹過,不少其餘同行的博客也夠詳細的,這裏不作介紹,對jmeter不甚瞭解的能夠參考以前的博客:
1、爲何要使用分佈式測試
按照通常的壓力機配置,jmeter的GUI模式下(Windows),最多支持300左右的模擬請求線程,再大的話,容易形成卡頓、無響應等狀況,這是限於jmeter其自己的機制和硬件配置。
有時候爲了儘可能模擬業務場景,須要模擬大量的併發請求,這個時候單臺壓力機就顯得有心無力。針對這個狀況,jmeter的解決方案是支持分佈式壓測,即將大量的模擬併發分配給
多臺壓力機,來知足這種大流量的併發請求場景。
2、分佈式壓測的原理
一、分佈式測試中,選擇一臺做爲管理機(Contorller),其餘的機器做爲測試執行的代理機(Agent);
二、執行測試時,由Contorller經過命令行將測試腳本發給Agent,而後Agent執行測試(不須要啓動GUI),同時將測試結果發送給Contorller;
三、測試完成,能夠在Contorller上的監聽器裏面看到Agent發來的測試結果,結果爲多個Agent測試結果彙總而成;
3、分佈式設置步驟
一、修改Contorller配置
打開Contorller機下jmeter安裝文件下的bin目錄:jmeter.properties文件,搜索remote_hosts=127.0.0.1,將Agent機的IP和端口寫在後面,好比:
remote_hosts=127.0.0.1,127.0.0.2:80,127.0.0.3:80
其中127.0.0.2和127.0.0.3爲Agent機的IP,每一個Agent機之間用英文半角逗號隔開,修改保存。
二、啓動jemter
啓動jmeter後,設置線程組、配置元件、取樣器、監聽器等原件,點擊「運行-遠程啓動」:
能夠選擇遠程啓動一個Agent機,或者選擇遠程所有啓動,這樣,就能夠進行分佈式測試了。
PS:上面的例子中,127.0.0.2和127.0.0.3爲舉例說明,具體實踐請修改成對應的Agent機IP以及端口。
4、注意事項
一、保持Contorller和Agent機器的JDK、jmeter以及插件等配置版本一致;
二、若是測試數據有用到CSV或者其餘方式進行參數化,須要將data pools在每臺Agent上覆制一份,且讀取路徑必須保持一致;
三、確保Contorller和Agent機器在同一個子網裏面;
四、檢查防火牆是否被關閉,端口是否被佔用(防火牆會影響腳本執行和測試結構收集,端口占用會致使Agent機報錯);
五、分佈式測試中,經過遠程啓動代理服務器,默認查看結果樹中的響應數據爲空,只有錯誤信息會被報回;
六、若是併發較高,建議將Contorller機設置爲只啓動測試腳本和收集彙總測試結果,在配置文件裏去掉Contorller機的IP;
七、分佈式測試中,若是1S啓動100個模擬請求,有5個Agent機,那麼須要將腳本的線程數設置爲20,不然模擬請求數會變成500,和預期結果相差太大。
1、Dubbo簡介
dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。其核心部分包含以下幾點:
一、遠程通信:提供對多種基於長鏈接的NIO框架抽象封裝,包括多種線程模型,序列化,以及「請求-響應」模式的信息交換方式;
二、集羣容錯:提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集羣支持;
三、自動發現:基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方能夠平滑增長或減小機器;
四、dubbo簡化模型
2、Dubbo插件
一、jmeter自己並不支持dubbo接口的測試,須要下載第三方插件,而後將jar包放入${JMETER_HOME}\lib\ext路徑下,重啓便可。
插件下載地址:jmeter-plugins-dubbo
3、Dubbo Sample
啓動jmeter,添加線程組→Sampler→Listener,dubbo-sample界面以下:
各參數說明以下:
Protocol:註冊協議,包括zookeeper、multicast、Redis、simple;
Address:註冊地址,dubbo服務的IP+Port:
①、當使用zk,address填入zk地址,集羣地址使用","分隔;
②、使用dubbo直連,address填寫直連地址和服務端口;
Protocol:使用的dubbo協議,包括dubbo、rmi、hessian、webservice、memcached、redis,根據本身的協議類型選擇對應的選項便可;
Timeout:請求超時時間,單位ms,根據dubbo具體配置填寫;
Version:版本,dubbo不一樣版本之間差別較大,不一樣版本之間不能互相調用,這裏指定dubbo版本,是爲了方便識別和說明;
Retries:異常重試次數(相似這種分佈式服務通訊框架,大多都有重試機制,是爲了保證事務成功率);
Cluster:集羣類型,包括failover、failfast、failsafe、failback、failking;
Group:組類型,若是有的話,根據配置填寫便可;
Connections:鏈接數,同上,根據配置填寫;
Async:服務處理類型,包括sync(同步)、async(異步),根據配置填寫;
Loadbalance:負載均衡策略,包括random(隨機)、roundrobin(輪詢)、leastactive(最少活躍數)、consistenthash(一致性哈希);
Interface:接口名(由於dubbo服務大可能是開發根據規範自行命名的,所以這裏須要填寫完整的接口名+包名);
Method:當前接口下的方法名,按照開發提供的API文檔填寫便可;
Args:接口報文,根據API文檔填寫,如上圖所示,添加輸入行,輸入對應的參數類型和值便可(參數類型和值如何定義填寫,請參考上面的連接);
①、paramType:參數支持任何類型,包裝類直接使用java.lang
下的包裝類,小類型使用:int
、
float
、
shot
、
double
、
long
、
byte
、
boolean
、
char
,自定義類使用類徹底名稱;
②、paramValue:基礎包裝類和基礎小類型直接使用值,例如:int爲1,boolean爲true等,自定義類與List
或者Map
等使用json格式數據;
以上即爲利用jmeter的dubbo插件進行dubbo接口的測試,固然,一樣能夠進行性能測試。。
jmeter是一個java開發的利用多線程原理來模擬併發進行性能測試的工具,通常來講,GUI模式只用於建立腳本以及用來debug,執行測試時建議使用非GUI模式運行。
1、爲何要非GUI模式運行
jmeter是java語言開發,實際是運行在JVM中的,GUI模式運行須要耗費較多的系統資源,通常來講,GUI模式要佔用10%-25%的系統資源。
而使用非GUI模式(即linux或dos命令)能夠下降對資源的消耗,提高單臺負載機所能模擬的併發數。
啓動jmeter,提醒以下:
2、環境準備
一、安裝JDK
二、安裝jmeter
下載壓縮包,而後將安裝包上傳至linux服務器,通常有如下2種方式:
①、經過FileZilla或其餘相似工具上傳至linux服務器;
②、直接將zip文件拖至linux服務器;
方法以下:
輸入命令 yum install -y lrzsz ,安裝linux下的上傳和下載功能包,而後將jmeter壓縮包拖進去便可,示例以下:
而後輸入命令 unzip jmeter-3.2.zip ,進行解壓。
三、配置環境變量
輸入命令 vim /etc/profile ,在最下面添加以下內容:
export JAVA_HOME=/usr/java/1.8.0_181 export CLASSPATH=.:JAVA_HOME/lib/dt.jar:$JAVA_HOME.lib/tools.jar:$JRE_HOME.lib export PATH=$PATH:$JAVA_HOME/lib export PATH=/jmeter/apache-3.2/bin/:$PATH export JMETER_HOME=/jmeter/jmeter-3.2 export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH export PATH=$JMETER_HOME/bin:$PATH
保存後,輸入命令 source /etc/profile ,使修改的配置生效。
四、授予權限
在執行jmeter腳本執行,首先要確保監控工具、jmeter以及相關的文件有相應的權限,不然會報錯,常見的報錯以下:
①、文件沒有權限
②、沒法打開目錄下的文件
③、編碼格式錯誤
查看文件或工具是權限的命令以下:
# 查看當前目錄下全部文件的權限 ls -l # 查看當前目錄下全部文件的權限 ll # 查看某個文件的權限 ls -l filename # 查看某個目錄的權限 ls ld /path
五、linux文件顏色表明的含義
在linux中,不一樣顏色的文件表明不一樣的含義,下面是linux中不一樣顏色的文件表明的含義:
# 白色:普通的文件 # 藍色:目錄 # 綠色:可執行的文件 # 紅色:壓縮文件或者包文件 # 青色:鏈接文件 # 黃色:設備文件 # 灰色:其餘的文件
3、運行jmeter
一、啓動jmeter,建立腳本
這裏以訪問我博客首頁爲例:
腳本保存爲test.jmx,而後將文件上傳至linux服務器。
二、運行腳本
將腳本上傳至linux服務器,而後進入jmeter的bin目錄下,輸入命令 jmeter -n -t test.jmx -l test.jtl ,運行jmeter腳本。
PS:經常使用命令解析:
# 常見命令說明 -h 幫助:打印出有用的信息並退出 -n 非 GUI 模式:在非 GUI 模式下運行 JMeter -t 測試文件:要運行的 JMeter 測試腳本文件 -l 日誌文件:記錄結果的文件 -r 遠程執行:啓動遠程服務 -H 代理主機:設置 JMeter 使用的代理主機 -P 代理端口:設置 JMeter 使用的代理主機的端口號
運行結果以下圖:
三、查看測試報告
啓動jmeter,新建一個線程組,添加所需的監聽器,導入腳本運行產生的.jtl文件,以下:
性能測試工具Jmeter因爲其體積小、使用方便、學習成本低等緣由,在如今的性能測試過程當中,使用率愈來愈高,但其自己也有必定的缺點,好比提供的測試結果可視化作的很通常。
不過從3.0版本開始,jmeter引入了Dashboard Report模塊,用於生成HTML類型的可視化圖形報告(3.0版本的Dashboard Report模塊會中文亂碼,所以建議使用3.0以上的版本)。
1、生成HTML測試報告的兩種方式
一、利用已有.jtl文件生成報告
進入jmeter的bin目錄下,輸入以下命令:
jmeter -g test.jtl -o /path # -g:後跟test.jtl文件所在的路徑 # -o:後跟生成的HTML文件存放的路徑
PS:若是是在Windows環境命令行運行,必須指定生成的HTML文件存放文件夾,不然會報錯;若是是linux環境,如指定路徑下不存在該文件夾,會生成對應的文件夾存放報告文件!
二、無.jtl文件生成測試報告
若是還未生成.jtl文件,則能夠經過以下命令,一次性完成測試執行和生成HTML可視化報告的操做,進入jmeter的bin目錄下,輸入以下命令:
jmeter -n -t test.jmx -l test.jtl -e -o /path # -n:以非GUI形式運行Jmeter # -t:source.jmx 腳本路徑 # -l:result.jtl 運行結果保存路徑(.jtl),此文件必須不存在 # -e:在腳本運行結束後生成html報告 # -o:用於存放html報告的目錄
我本地Windows環境執行截圖以下:
PS:(linux系統和windows系統命令同樣)須要注意的是,生成的.jtl文件路徑下,不能存在同名的.jtl文件,不然會執行失敗。
執行完畢後,用瀏覽器打開生成的文件目錄下的index文件,效果展現以下:
2、圖表信息詳解
測試報告分爲兩部分,Dashboard和Charts,下面分開解析。
一、Dashboard(概覽儀表盤)
①、Test and Report informations
②、APDEX (應用性能指標)
③、Requests Summary
二、Charts(詳細信息圖表)
PS:因爲詳細信息圖表有點多,這裏我挑幾個性能測試過程當中比較關鍵的圖表解析!
Over Time
①、Response Times Over Time(腳本運行期間的響應時間變化趨勢圖)
說明:能夠根據響應時間和變化和TPS以及模擬的併發數變化,判斷性能拐點的範圍。
②、
③、Bytes Throughput Over Time(腳本運行期間的吞吐量變化趨勢圖)
說明:在容量規劃、可用性測試和大文件上傳下載場景中,吞吐量是很重要的一個監控和分析指標。
④、
Throughput
①、Transactions Per Second(每秒事務數)
說明:每秒事務數,即TPS,是性能測試中很重要的一個指標,它是用來衡量系統處理能力的一個重要指標。
Response Times
①、 Response Time Percentiles(響應時間百分比分佈曲線圖)
說明:即響應時間在某個範圍內的請求在全部請求數中所佔的比率,相比於平均響應時間,這個值更適合用來衡量系統的穩定性。
②、
轉載: https://www.cnblogs.com/imyalost