最近開始接觸和使用JMeter進行性能測試,也是由於工做須要,不得不學習更多新技能,在此以前一直使用LR進行WEB系統的壓力測試,可是在ZK開發的WEB系統,我選擇使用JMeter。css
主要是由於ZK腳本安全性在代碼中產生的隨機值太多,LR關聯起來太麻煩。JMeter就不一樣了, ZK官方針對這個問題,專門爲JMeter工具寫了測試插件,全部生成的隨機碼(dtid、uuid)都能自動關聯上。既然官方已有插件的支持,爲什麼要盯着代碼在LR中作體力活呢(還不必定有效果至少目前在網上能搜到的成功案例寥寥無幾),所以選擇JMeter。html
下面我將本身對JMeter的一些認識和使用作小結,以備學習之用,部分概念內容摘自於網絡多個文檔,只取其精華。java
JMeter是Apache組織的開放源代碼項目,100%的用java實現應用。用於壓力測試和性能測量。它最初被設計用於Web應用測試但後來擴展到其它測試領域。正則表達式
JMeterFAQ: http://wiki.apache.org/jmeter/JMeterFAQshell
l 下載安裝JDKexpress
下載地址: http://www.oracle.com/technetwork/java/javase/downloads/index.htmlapache
l 下載解壓JMeter壓縮包 編程
下載地址: http://jmeter.apache.org/download_jmeter.cgi 瀏覽器
l 單機部署安全
下載JMeter源碼包,解壓以後便可使用,無需安裝。 進入安裝目錄bin文件夾中點擊「JMeter.bat」文件啓動工具窗口。
l 多臺機器分佈式部署 (一般在模擬大批量用戶一臺機器資源不夠用時使用分佈式部署)
實現步驟以下:
1. 在全部機子上裝上JMETER
2. 在Agent機子上運行bin目錄下的JMeter-server.bat
3. 在Controller找到bin目錄裏的文件JMeter.properties,用記事本打開
4. 在文件中查找」remote_hosts=」,你會看到這樣一行」remote_hosts=127.0.0.1」.其中的 127.0.0.1表示運行JMeter Agent的機器,這裏須要修改成」remote_hosts=192.168.0.1:1099,192.168.0.2:1099,192.168.0.3:1099」——其中1099爲 JMeter的Controller和Agent之間進行通信的默認RMI端口號,不寫也行,總之默認會用1099;
5. 保存文件,並從新啓動Controller機器上的JMeter.bat,在菜單Run下的Remote Start菜單項,你將能夠看到全部能鏈接的Agent。
• JMeter支持的協議
• Web(HTTP/ HTTPS),SOAP,FTP,Database(JDBC), LDAP, JMS, Mail(POP3/IMAP),JAVA
• JMeter支持的協議相對Loadrunner較少,可是能夠經過二次開發來實現
• Loadrunner支持的協議
• WEB(Http/Html)、FTP、LDAP、Palm、Web/WinsocketDual Protocol
• SQL Server、 MS ODBC、 Oracle、 DB2、 Sybase CTlib、 Sybase DBlib、 Domain Name Resolution(DNS)、Windows Socket
• COM/DCOM、Corba-Java、Rmi_Java EJB、Rmi_Java
• Oracle NCA、SAP-Web、SAPGUI、SAPGUI/SAP-Web Dual Protocol、 PropleSoft_Tuxedo、Siebel Web、Siebel-DB2 CLI、Sieble-MSSQL、Sieble Oracle
• ……
功能對比:
對比項
|
JMeter
|
Loadrunner
|
支持的協議
|
少
|
多
|
結果報表
|
少
|
豐富
|
測試場景
|
靈活
|
靈活
|
運行環境
|
Windows/Unix/Linux
|
Windows/Linux(部分支持)
|
IP欺騙功能
|
無
|
有
|
使用對比:
對比項
|
JMeter
|
Loadrunner
|
安裝
|
簡單
|
複雜
|
腳本錄製
|
很好
|
較好
|
腳本語言
|
C,JAVA,VB
|
XML
|
編輯方式
|
圖形界面/腳本
|
圖形界面修改
|
成本
|
免費
|
昂貴
|
學習資料
|
較少(逐漸豐富)
|
不少
|
Jmeter工具和LR性能工具在原理上徹底一致,包含4個部分:
(1)負載發生器:用於產生負載,一般以多線程或是多進程的方式模擬用戶行爲。
(2)用戶運行器:一般是一個腳本運行引擎,用戶運行器附加在線程或進程上,根據腳本要求模擬指定的用戶行爲。
(3)資源生成器:用於生成測試過程當中服務器、負載機的資源數據。
(4)報表生成器:根據測試中得到的數據生成報表,提供可視化的數據顯示方式
用來描述一個性能測試,包含與本次性能測試全部相關的功能。也就說本的性能測試的全部內容是於基於一個計劃的。
下面看一下一個計劃下面都有哪些主要的功能模塊(右鍵單擊「測試計劃」彈出菜單)。
默認有三個添加線程組的選項,名字不同, 建立以後,其界面是徹底同樣的。以前的版本只有一個線程組的名字。如今多一個setUp theread Group 與terDown Thread Group
1) setup thread group
一種特殊類型的ThreadGroup的,可用於執行預測試操做。這些線程的行爲徹底像一個正常的線程組元件。不一樣的是,這些類型的線程執行測試前進行按期線程組的執行。
2) teardown thread group.
一種特殊類型的ThreadGroup的,可用於執行測試後動做。這些線程的行爲徹底像一個正常的線程組元件。不一樣的是,這些類型的線程執行測試結束後執行按期的線程組。
可能你仍是不太理他們與普通的線程組有什麼不一樣。 如 果您用過junit,想必你不會對setup ,teardown這2個字眼陌生。 即便沒用過,也不要緊。 熟悉loadrunner的應該知道,loadrunner的腳本除了action裏是真正的腳本核心內容,還有初始化「環境」的初始化腳本和測試完畢後對應的清除信息的腳本塊。
那麼這裏 setup thread group 和 teardown thread group 就是分別指這兩部分。 其實從本質上來看,他們並無什 麼不一樣。
3) thread group(線程組).
這個就是咱們一般添加運行的線程。通俗的講一個線程組,,能夠看作一個虛擬用戶組,線程組中的每一個線程均可以理解爲一個虛擬用戶。線程組中包含的線程數量在測試執行過程當中是不會發生改變的。
測試片斷元素是控制器上的一個種特殊的線程組,它在測試樹上與線程組處於一個層級。它與線程組有所不一樣,由於它不被執行,除非它是一個模塊控制器或者是被控制器所引用時纔會被執行。
控制器
JMeter有兩種類型的控制器:取樣器(sample)和邏輯控制器(Logic Controller),用這些元件來驅動處理一個測試。
取樣器(Sample)是性能測試中向服務器發送 請求,記錄響應信息,記錄響應時間的最小單元,JMeter 原生支持多種不一樣的sampler , 如 HTTP Request Sampler 、 FTP Request Sample 、TCP Request Sample 、 JDBC Request Sampler 等,每一種不一樣類型的 sampler 能夠根據設置的參數向服務器發出不一樣類型的請求。(在 jmeter 的全部sampler 中,Java Request Sampler 和 Beanshell Request Sampler 是兩種 特殊的可定製的 Sampler ,後面會深刻討論。)
邏輯控制器,包括兩類無件,一類是用於控制 test plan 中 sampler 節點發送請求的邏輯順序的控制器,經常使用的有 若是(If)控制器 、switch Controller 、 Runtime Controller、循環控制器等。另外一類是用來組織可控制 sampler 來節點的,如 事務控制器、吞吐量控制器。
配置元件(config element)用於提供對 靜態數據配置的支持。CSV Data Set config 能夠將本地數據文件造成數據池(Data Pool),而對應於 HTTP Request Sampler和 TCP Request Sampler等類型的配製無件則能夠修改Sampler的默認數據。(例 如,HTTP Cookie Manager 能夠用於對 HTTP Request Sampler 的cookie 進行管理)
定時器(Timer)用於操做之間設置等待時間,等 待時間是性能測試中經常使用的控制客戶端QPS的手端。相似於LoadRunner裏面的「思考時間」。JMeter 定義了 Bean Shell Timer、Constant Throughput Timer、固定定時器等不一樣類型的Timer。
用於在實際的請求發出以前對即將發出的請求進行特殊處理。例如,HTTP URL重寫修復符則能夠實現URL重寫,當RUL中有sessionID 一類的session信息時,能夠經過該處理器填充發出請求的實際的sessionID 。
用於對Sampler 發出請求後獲得的服務器響應進行處理。通常用來提取響應中的特定數據(相似LoadRunner測試工具中的關聯概念)。例如,XPath Extractor 則能夠用於提取響應數據中經過給定XPath 值得到的數據。
斷言用於檢查測試中獲得的相應數據等是否符合預期,斷言通常用來設置檢查點,用以保證性能測試過程當中的數據交互是否與預期一致,相似於LR中的檢查點。
這個監聽器可不是用來監聽系統資源的元件。它是用來對測試結果數據進行處理和可視化展現的一系列元件。 圖行結果、查看結果樹、聚合報告。都是咱們常常用到的元件。
聚合報告:
Label:這裏對應一個HTTP Request ,顯示的就是 Name 屬性的值;
#Samples: 表示你此次測試中一共發出了多少個請求;
Average: 平均響應時間 , 默認狀況下是單個 Request 的平均響應時間,當使用了 「事務控制器」時,以事務爲單位爲單位顯示平均響應時間
Median: 中位數,也就是 50 %用戶的響應時間
90% Line: 90 %用戶的響應時間
Min: 最小響應時間
Max:最大響應時間
Error%: 本次測試中出現錯誤的請求的數量 / 請求的總數
Throughput: 吞吐量 ,默認狀況下表示每秒完成的請求數。
KB/Sec: 每秒從服務器端接收到的數據量
使用Badboy工具進行錄製,導出JVM格式,使用jmeter打開,適合純JSP站點。我一開始選擇用這個進行錄製,以爲簡單即錄即用,可是後來發現,對於ZK平臺,使用它錄製那麼ZK的自動關聯插件就徹底沒做用了(全部優缺點一會兒體現出來了),後來仍是使用HTTP代理錄製。
優勢:不用手動建立元件,不用設置代理,即錄即用
缺點:不支持插件自動關聯。
下載地址:http://www.badboy.com.au/
1. 在工做臺可使用排除模式提早優化錄製腳本,將錄製過程當中請求的圖片、樣式、js等鏈接給排除出去。以下圖要排除錄製中請求js ,png,gif,jpg,css等連接。使用 .*.[後綴名]的格式進行排除。
2.或者也可使用包含模式,將錄製過程當中須要保留的請求給保留下來。添加方法也可使用後綴方法進行區分,原理同1.
• 一般錄製腳本中會提交一些參數,使用不一樣的參數值來模擬才更接近實際狀況(如不一樣的登陸用戶名、密碼等)。
• 參數定義後, 使用${paramName}既可使用
下面主要介紹介紹下文件參數化和函數參數化。
1. 新建用戶名、密碼存放文件 (E:\UserPass.csv)以下:
admin,admin
test1,111111
test2,111111
test3,111111
說明:這裏用英文逗號爲分隔符,也能夠用其餘爲分隔符,在CSV Data Set Config中能夠設置。
2. 右鍵點擊Jmeter中須要參數化的某個請求,選擇添加——配置原件——CSV Data Set Config,會添加一個CSV Data Set Config,須要設置相關的一些內容,具體以下:
Filename --- 參數項文件,填寫文件路徑和名稱(默認路徑讀取腳本文件jmx同級目錄)
File Encoding --- 文件的編碼,通常爲空
Vaiable Names --- 文件中各列所表示的參數項;各參數項之間利用逗號分隔;參數項的名稱應該與HTTP Request中的參數項一致。
Delimiter --- 如文件中使用的是逗號分隔,則填寫逗號;如使用的是TAB,則填寫\t;
Recycle on EOF? --- True=當讀取文件到結尾時,再重頭讀取文件
False=當讀取文件到結尾時,中止讀取文件
Stop thread on EOF? --- 當Recycle on EOF?一項爲False時起效;True=當讀取文件到結尾時,中止進程
Share mode --- 參數共享模式,ALL threads 全部線程可用
以下圖參數配置:
引用參數:
1. 新建用戶名、密碼存放文件 (E:\UserPass.csv)以下:
admin,admin
test1,111111
test2,111111
test3,111111
2. 構建函數,點擊JMeter的「選項」——「函數助手對話框」打開函數助手,選擇_CSVRead功能
第一行值輸入文件的路徑
第二行值輸入要參數化變量在文件中的列數(從0開始)
完成後,點擊「生成」按鈕,生成函數字符串,拷貝字符串到要參數化變量的位置。
_Random
打開「函數助手」對話框,在「選擇一個功能」的下拉框中選擇「_Random」,而後在「函數參數」中會出現三個參數讓用戶來設置。
第一個參數是「一個範圍內的最小值」,即所要取的隨機數的最小值,咱們設置成1
第二個參數是「一個範圍內的最大值」,即所要取的隨機數的最大值,咱們設置成100
第三個參數是「函數名稱」,即用於存儲在測試計劃中其餘的方式使用的值,咱們設置成Random。
設置好上面的三個參數後,點擊「生成」按鈕,這樣就會在對話框的最下面生成一個字符串「${__Random(1,100,隨機數)}」,而後咱們找到要替換的參數,把它的值換成前面生成的字符串就能夠了,而後每次運行的時候,這個參數會變成一個1到100之間的隨機數。
_threadNum
它用於獲得當前運行的線程編號,獲取值的方式:${__threadNum}這個函數沒有任何參數,
_StringFromFile
這個函數是從文件中讀取字符串,一次讀取一行。有一下四個參數值。
第一個參數:文件的完整路徑,即文件路徑+文件名.擴展名
第二個參數:函數名稱
第三和第四個參數的用途有兩個,若是一塊兒使用能夠從多個文件中讀取字符串。若是隻 使用第四個參數則表示對同一個文件讀取屢次。
例如:${__StringFromFile(E:\User.dat,,1,2)}能夠讀取User1.dat和 User2.dat,從User1.dat的第一行記錄開始讀取,User1的記錄讀取完成後,自 動從User2.dat的第一行繼續讀取。
${_StringFromFile(E:\User.dat,,,2)} 讀取User.dat兩次
如用戶名文件 User.dat
admin
test1
test2
test3
上圖,所示能夠讀取兩次User.dat文件中內容。
_javaScript
這個函數是很好用的函數,經過它能使用JavaScript所支持的全部函數,好比當前的系統日期,系統時間等,它的參數也有兩個,第一個是「JavaScript expression to evaluate」,這個參數是JavaScript的語句表達式,咱們能夠輸入任何的JavaScript支持語句,調用JavaScript自帶的函數。
能夠經過JS來判斷腳本執行狀態,讀取文件,操做文件等功能。(更多用法須要摸索)
參數關聯,與LR中的關聯功能做用基本相同,關聯腳本中的一些動態參數,使的腳本能夠正確運行。
從前一個請求中取,用正則表達式提取器。
具體方法,在須要得到數據的請求上右擊添加一個「後置處理器」-->「正則表達式提取器」
引用名稱即下一個請求要引用的參數名稱,如填寫ticketid,則可用${ticketid}引用它。
正則表達式中()括起來的部分就是要提取的。.表明任意字符,*表明出現任意次。
模板,用$$引用起來,若是在正則表達式中有多個正則表達式(多個括號括起來的內容),則能夠是$2$,$3$等等,表示解析到的第幾個值給ticketid。
匹配數字,0表明隨機,-1表明全部,其他正整數表明將在檢查的內容中,第幾個匹配的內容提取出來。
例如:
下面圖登陸腳本中用戶須要使用ticket認證,ticket爲隨機生成的動態變量
要對ticket進行關聯,對它的前一個請求,添加「後置處理器」-->「正則表達式提取器」如:
正則表達如何去匹配,此處跟LR的原理幾乎相同,括號中的內容是要關聯的內容,括號左右兩邊內容爲參數在響應數據源碼中的匹配內容。
如:ticket=(.+?)"
括號左邊:ticket=
括號右邊:」
括號中(.+?):表示任意內容
運行一次腳本,經過結果樹查看響應數據中ticket內容:
這種形式比較適合於返回爲xml、HTML片斷的狀況。
在須要得到數據的請求上右擊添加一個「後置處理器」-->「xPath Extractor」。
以下圖所示,獲取獲取當前請求HTML中的title。(這個只是個簡單的例子,更高級的功能,須要介紹可看Jmeter的用戶手冊)
http://jmeter.apache.org/usermanual/component_reference.html#XPath_Extractor
斷言就相似LoadRunner中的檢查點。對上一個請求返回的信息,作字符串、數據包大小、HTML、XML、圖片等作判斷,確保返回的信息的準確性。
添加斷言
添加響應斷言:${tl_login} 登陸後頁面顯示的用戶名是否存在。這裏使用參數化,動態判斷,直接寫固定文本也是能夠的。
響應代碼中位置:
添加斷言結果:右鍵單擊請求,添加——「監聽器」——「斷言結果」,運行腳本:
運行結束後,找到文本,則返回文本所在文件路徑。如未匹配到文本則結果樹顯示紅色。斷言返回以下:
• JMeter的邏輯控制器提供了一系列的組件,能夠實現多樣化的場景控制。
• 經常使用的邏輯控制器有:循環控制器,事務控制器
模擬用戶併發運行場景主要經過線程組屬性進行設置:
線程數:可看作模擬用戶數量
Ramp-Up Period:告訴JMeter 達到最大線程數須要多長時間。假定共有10 個線程,Ramp-Up Period 爲100 秒,那麼JMeter 就會在100 秒內啓動全部10 個線程,並讓它們運轉起來。若是有30 個線程和一個120秒的ramp-up period,那麼每一個連續的線程會延遲4秒。
循環次數:設置執行測試的次數
調度器:在裏面你能夠輸入啓動和結束時間。當測試啓動時,若是必須JMeter會等待啓動時間到達。在每一個週期 結束,JMeter檢驗結束時間是否到達,若是是,運行中止,若是不是測試被容許繼續,直到迭代限制到達。
用過LoadRunner的人都知道,LoadRunner自己提供了不少函數能夠對收集回來的結果進行一些初步的分析。例如能夠作到判斷返回的結果是否正確;判斷request的response time是否大於x秒之類的。相比起LoadRunner,Jmeter在這方面沒有那麼強大,可是我的認爲,對於一些編程基礎不是太好的測試人員來講,Jmeter比LoadRunner易用性上面作得更出色。
用過LoadRunner的人應該都知道,LoadRunner會爲咱們提供一大堆圖標和曲線。可是在Jmeter裏,咱們只能找到幾個可憐的Listener來方便咱們查看測試結果。可是,對於初學者來講,一些簡單的結果分析工具可使咱們更容易理解性能測試結果的分析原理。因此,千萬別小看這幾個簡單的Listener啊。
經過這份報告咱們就能夠獲得一般意義上性能測試所最關心的幾個結果了。
Label:每一個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這裏顯示的就是 Name 屬性的值
#Samples:表示你此次測試中一共發出了多少個請求,若是模擬10個用戶,每一個用戶迭代10次,那麼這裏顯示100
Average:平均響應時間——默認狀況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也能夠以Transaction 爲單位顯示平均響應時間
Median:中位數,也就是 50% 用戶的響應時間
90% Line:90% 用戶的響應時間
Note:關於 90% 併發用戶數的含義,經過查看官方囉嗦的解釋
我以爲能夠簡單總結爲:
有90%用戶沒有超過顯示的響應時間。
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——默認狀況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也能夠表示相似 LoadRunner 的 Transaction per Second 數
KB/Sec:每秒從服務器端接收到的數據量,至關於LoadRunner中的Throughput/Sec
經過這個Listener,咱們能夠看到很詳細的每一個transaction它所返回的結果,其中紅色是指出錯的transaction,綠色則爲經過的。
若是你測試的場景會有不少的transaction完成,建議在這個Listener中僅記錄出錯的transaction就能夠了。要作到這樣,你只須要將Log/Display:中的Errors勾中就能夠了。
在性能測試過程當中,咱們每每須要將測試結果保存在一個文件當中,這樣既能夠保存測試結果,也能夠爲往後的性能測試報告提供更多的素材。
Jmeter中,結果都存放在.jtl或.csv文件。我是把文件保存到.jtl中,進行編碼轉換後,再將其改爲.csv文件格式記錄,這樣作是由於csv文件格式看起來比較方便,更重要的是這樣作能夠爲二次分析提供不少便利。
我這裏所說的二次分析是指除了使用Listener以外,咱們還能夠對.jtl文件進行再次分析。
選擇某個Listener,點擊頁面中的configure按鈕。此時,一個設置界面就會彈出來,建議多勾選以下項:Save Field Name,Save Assertion Failure Message。
通過了以上設置,此時保存下來的jtl文件會有以下項:
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,Latency
請求發出的絕對時間,響應時間,請求的標籤,返回碼,返回消息,請求所屬的線程,數據類型,是否成功,失敗信息,字節,響應時間
其中聚合報告中的,吞吐量=完成的transaction數/完成這些transaction數所須要的時間;平均響應時間=全部響應時間的總和/完成的transaction數;失敗率=失敗的個數/transaction數。
————————————————————————————————————————————————————————————
尊重原創轉載請說明來源。
Ray
tsbc@vip.qq.com