性能測試工具之jmeter

性能測試工具之Jmeter

一、jmeter介紹

1、Jmeter是apache組織開發的開源項目,設計之初是用於做性能測試的,同事它在實現對各種接口的調用方面做的比較成熟,因此常被用做接口功能測試和性能測試。
它能夠很好的支持各種常見接口,如HTTP(s)、webservice、JDBC、JAVA、FTP等,並以多種形式展現測試結果。
2、開源免費,輕量級免安裝,支持插件很多,功能也日趨完善,報表分析功能較弱。

二、jmeter安裝及環境配置

1、安裝jdk
Jmeter是依賴java環境的,所以要先安裝jdk。
需要注意的是jmeter3.0以上的版本都需要jdk7以上才能支持,其他沒啥特別的。
安裝jdk並配置好環境變量。
2、安裝jmeter
其實jmeter是免安裝的,只需要下載解壓即可。
安裝包直接去jmeter官網下載即可,建議選擇3.0或以上版本。下載後解壓到非C盤的非中文目錄即可。
3、配置jmeter環境變量
JMETER_HOME=D:\apache-jmeter-3.3\apache-jmeter-3.3
CLASSPATH=%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar;
4、啓動jmeter
雙擊jmeter bin目錄下的jmeter.bat,稍等一會兒能夠正常打開如下界面,說明安裝成功。
在這裏插入圖片描述
Dos窗口不可關閉,否則jmeter界面也就關閉了。
在這裏插入圖片描述
注意事項:
從上面命令行可以看到:Don`t use GUI mode for load testing!,only for Test creation and Test debugging.For load testing,use CLI Mode(was NON GUI):
大致意思是:不要使用GUI模式進行負載測試!,僅用於測試創建和測試調試。對於負載測試請使用CLI模式(非GUI):

三、jmeter常見報錯及解決方法

1、錯誤一
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: connect timed out
查看Load time的時間要大於request設置的connect time out時間,所以拋出該異常。可能是由於服務端有較多請求正在處理(且處理時間較長),導致JMeter不能連接上服務器而產生的。
2、錯誤二
Java.NET.BindException: Address already in use: connect
原因:短時間內new socket操作很多,而socket.close()操作並不能立即釋放綁定的端口,而是把端口設置爲TIMEWAIT 狀態,過段時間(默認240s)才釋放,(用netstat -na可以看到),最後系統資源耗盡(windows上是耗盡了pool of ephemeral ports ,這段區間在1024-5000之間)
解決方法:在運行JMeter agent的機器上,添加註冊表條目HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort 65334
TcpTimedWaitDelay 30
3、錯誤三
java.lang.OutOfMemoryError: Java heap space(jmeter內存溢出)
原因:觀察運行jmeter機器的內存,佔用較高,超過了jmeter設置的內存上限。
解決方案:修改jmeter配置文件,調整內存可用的範圍
修改/bin/jmeter.bat文件:找到這2行
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改爲:
set HEAP=-Xms1024m –Xmx2048m(最大值不能超過系統內存的1/2)
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
4、錯誤四
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
發生該錯誤時,jmeter已經連接上服務器,查看load time沒有超過設定的request timeout時間,錯誤可能的原因是,服務器那邊未處理該線程的請求,或者爲保證服務能力,斷掉了連接。
爲了驗證該猜想,持續大於半小時向服務器發送該併發數量的請求,一段時間後,request收到503的response,證明猜想。
5、錯誤五
Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:
原因:分佈式測試時,server和agent之間的連接有問題。單個機器排查後,發現是某個agent機器安裝了多個網卡,rmi遠程的時候找的是虛擬機的網卡,導致連接失敗。
解決方案:禁掉不使用的虛擬機網卡,測試之後再恢復。
jmeter腳本運行的過程中,服務器性能參數沒有明顯變化(CPU,內存,I/O),但request的響應時間很長。
原因:觀察jmeter agent機器網絡使用情況,網絡使用持續達到帶寬的限制峯值。request 發送的過程中pending在網絡中,實際併發的request並沒有同一時間到達服務器,所以服務器沒有明顯變化。
解決方案:提高jmeter agent機器網絡帶寬。
6、錯誤六
Connection timed out: connect
java.net.ConnectException: Connection timed out: connect
原因分析:
可能是因爲端口號耗盡,一般一臺服務器的端口號最多是65535個,建議使用該命令分別查看下壓測機與服務器的端口使用情況,netstat -nat|grep -i 8080|wc -l,如果這個個數在6w左右,那可能就是端口號用盡,同時查看下大多數的端口狀態,應該都是time_wait狀態
解決方案:
如果是壓測機,端口號用盡,那就增加壓測機,使用jmeter分佈式壓測(jmeter默認開啓keep_alive的)
如果數服務器,端口號用盡,最大的可能是服務器端開了短鏈接,把短鏈接配置變成長連接即可
因爲如果服務器端是短鏈接,當jmeter每發起一個請求就會建立一次tcp三次握手,傳輸完數據後,連接其實沒有關,連接狀態是time_wait,下個請求來了,會重新開啓一個新的端口,建立tcp三次握手,傳輸數據…,這樣隨着請求的越來越多,端口就會變得越來越少,所以端口很快耗盡,而且大多數端口都處於time_wait狀態,如果服務器端也支持長連接,那麼下次請求來了,就會在上次請求的通道上繼續傳輸,端口使用率大大的降低,就有效的避免了端口耗盡問題。
原因:Jmeter默認禁掉了運行過程中每個request的具體response信息收集,只保留了status。
解決方法:修改jmeter.properties文件中Results file configuration。把所有和response相關False的項改爲True。運行後將輸出保存.jtl文件中。添加tree監聽器,過濾只顯示error request,可以查看到request和response的具體信息,從而判斷出錯原因。
tree report中顯示socket time out相關的錯誤,如何判斷是jmeter工具的原因,還是服務器的原因。

四、jmeter使用實例

1、在windows和Linux環境下壓測的區別:暫無
2、在Windows的dos窗口下進行壓測
命令介紹:
在這裏插入圖片描述
參數介紹:
在這裏插入圖片描述
具體含義:
在這裏插入圖片描述
例如:jmeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080

3、執行出的壓測結果如何查看
①、打開Jmeter GUI界面
②、在測試計劃下,添加對應的測試報告元件,此處演示,增加了:聚合報告、查看結果樹、Summary Report測試報告
③、在所有數據寫入一個文件,瀏覽中選擇對應的日誌文件
④、下面就會有對應的表格展示,具體見下圖
在這裏插入圖片描述
4、在Linux環境下進行壓測
Ⅰ.在Linux下安裝jmeter:
①.將jmeter的壓縮包上傳到Linux下的/software目錄下;
②…進入Linux下的/software目錄,解壓jmeter的壓縮文件;
Ⅱ.將本地調試好的jmx文件上傳至/software/jmeter/bin目錄下:
Ⅲ.進入Linux下的//software/jmeter/bin目錄下:
①.在命令行輸入:
jmeter -n -t search.jmx -r -l search.jtl -e -o /tmp/apache-jmeter-5.1.1/resultReport:
大致意思是:執行search.jmx文件,生成search.jtl文件,再將search.jtl文件轉換成報告;
②.執行完成之後,在命令行輸入:tar zcvf resultReport.tar.gz ./resultReport:將報告打成壓縮包,再下載到本地即可查看輸出的報告;

五、jmeter工具使用

1、創建線程組
在TestPlan下創建線程組,右擊TestPlan->線程(用戶)->線程組
在這裏插入圖片描述
2、線程組介紹
在這裏插入圖片描述
Ⅰ.名稱:線程組自定義名稱;
Ⅱ.註釋:添加的一些備註說明信息,設置後,在目錄樹中鼠標懸停會顯示配置的註釋信息;
Ⅲ.在取樣器錯誤後要執行的動作
①.繼續:即取樣器執行錯誤後,仍然繼續執行後續的操作,直到整個線程完成;(默認)
②.Start Next Thread Loop:即取樣器執行錯誤後,終止當前循環,進入下一個循環;
③.停止線程:即取樣器執行錯誤後,停止當前線程;
④.停止測試:即取樣器執行錯誤後,等待當前執行的採樣器結束後停止執行測試;
⑤.stop test now:即取樣器執行錯誤後,出現錯誤立刻終止測試;
Ⅳ.線程屬性
①.線程數:即模擬的用戶個數;
②.Ramp-Up Period(in seconds):設置多少秒內完成所有的線程創建;----該時間的設置需要根據項目需要去判斷。如:線程數設置爲10,時間設置爲2—表示:兩秒內啓動10個線程,平均每秒啓動5個線程;
③.循環次數:即線程執行的次數,1表示循環1次後停止;如果勾選永遠,即線程會一直執行,如果配置了調度器,會受調度器配置影響。
④.Delay Thread creation until need:勾選代表線程將在需要的時候才構建;不勾選,代表線程組在開始的時候就被創建,需要時執行。
Ⅴ.調度器
只有在調度器勾選後,纔可以進行配置;也只有勾選調度器後,配置的值才能生效;
①.持續時間:即線程的執行時間是多少秒,在達到時間後,將停止執行;
②.啓動延遲:即手動開始運行線程後,jmeter自動延遲設置的時間纔開始執行測試;----注意:在勾選循環次數爲永遠,設置了持續時間時,會在持續時間達到後,停止測試;循環次數設置爲非永遠時,設置的調度時間無效,會在執行完循環次數後,停止測試。
3、配置元件
Ⅰ.在我們剛剛創建的線程組上右鍵 【添加】–>【配置元件】–>【HTTP請求默認值】。
在這裏插入圖片描述
Ⅱ.配置我們需要進行測試的程序協議、地址和端口
在這裏插入圖片描述
當所有的接口測試的訪問域名和端口都一樣時,可以使用該元件,一旦服務器地址變更,只需要修改請求默認值即可。
Ⅲ.構造HTTP請求
在“線程組”右鍵 【添加-】->【samlper】–>【HTTP 請求】設置我們需要測試的API的請求路徑和數據。我這裏是用的json
在這裏插入圖片描述
Ⅳ.在我們剛剛創建的線程組上右鍵 【添加】–>【配置元件】–>【HTTP信息頭管理器】。
因爲我要傳輸的數據爲json,所以設置一個 Content-Type:application/json
在這裏插入圖片描述
Ⅴ.在我們剛剛創建的線程組上右鍵 【添加】–>【斷言】–>【響應斷言】。
根據響應的數據來判斷請求是否正常。我在這裏只判斷的響應代碼是否爲200。還可以配置錯誤信息
在這裏插入圖片描述
Ⅵ.添加察看結果樹
在我們剛剛創建的線程組上右鍵 【添加】–>【監聽器】–>【察看結果樹】。
在這裏插入圖片描述
直接添加,然後點擊運行按鈕就可以看到結果了。
在這裏插入圖片描述
Ⅶ.添加Summary Report
在我們剛剛創建的線程組上右鍵 【添加】–>【監聽器】–>【Summary Report】。
直接添加,然後點擊運行按鈕就可以看到結果了。
在這裏插入圖片描述
Ⅷ.測試計劃創建完成
記得點保存。
Ⅸ.執行測試計劃
前面我們說過,執行測試計劃不能用GUI,需要用命令行來執行。
在這裏插入圖片描述
我這裏執行的命令爲:
jmeter -n -t testplan/order.jmx -l testplan/result/result.txt -e -o testplan/webreport
說明:
testplan/RedisLock.jmx 爲測試計劃文件路徑
testplan/result/result.txt 爲測試結果文件路徑
testplan/webreport 爲web報告保存路徑。
Web報告如下:
在這裏插入圖片描述
Ⅹ.寫在最後
線程數量和循環次數將會影響最終的測試報告,請大家多多測試。
4、腳本參數化
Ⅰ.在測試的過程中要用到參數化,比如說openId、crm_id等,此時需要添加一個csv數據文件設置即:CSV Data Set Config
在這裏插入圖片描述
Ⅱ.配置CSV Data Set Config
在這裏插入圖片描述
①.Filename: 指保存信息的文件目錄,可以相對或者絕對路徑。否則會在jmeter日誌文件(jmeter.log目錄位置)中提示:系統找不到指定文件,運行腳本後,登錄失敗。
②.File encoding: 保持默認。默認爲ANSI
③.Variable Names: 給csv文件中各列起個名字(有多列時,用英文逗號隔開列名)便於後面引用
④.Delimiter:與 .csv文件的分隔符保持一致。如文件中使用的是逗號分隔,則填寫逗號;如使用的是TAB,則填寫\t;
⑤.Allow quoted data? :是否允許引用數據,—這個目前還未弄明白,設置成True或者False都能正常引用數據。
⑥.Recycle on EOF?:到了文件尾是否循環,True—繼續從文件第一行開始讀取,False—不再循環
⑦.Stop thread on EOF? :到了文件尾是否停止線程,True—停止,False—不停止,注:當Recycle on EOF設置爲True時,此項設置無效。
⑧.Sharing mode:共享模式,All threads –所有線程,Current thread group—當前線程組,Current thread—當前線程。
² All threads:計劃中所有線程,假如說有線程1到線程n (n>1),線程1取了一次值後,線程2取值時,取到的是csv文件中的下一行,即與線程1取的不是同一行。
² Current thread group:當前線程組,假設有線程組A、線程組B,A組內有線程A1到線程An,線程組B內有線程B1到線程Bn。取之情況是:線程A1取到了第1行,線程A2取第2行,現在B1取第1行,線程B2取第2行。
² Current thread:當前線程。假設測試計劃內有線程1到線程n (n>1),則線程1取了第1行,線程2也取第1行。
Ⅲ.引用csv文件中的數據
在這裏插入圖片描述
①.找到需要傳遞參數的HTTP請求
②.將具體值改爲變量引用,引用變量:${變量名}
Ⅳ.在察看結果樹中,察看變量引用的具體值
在這裏插入圖片描述

5、json提取器
Ⅰ.在星媽優選的業務當中接口與接口之間存在依賴。所以需要將上一個接口的參數提取出來傳給下一個參數這時用到了json提取器
在這裏插入圖片描述
Ⅱ.jmeter在察看結果樹中點Text下拉框,選擇JSON Path Tester
在這裏插入圖片描述
Ⅲ.比如要提取cart_token,$.cart_token提取cart_token
在這裏插入圖片描述

Ⅳ.提取出來的cart_token作爲下一個接口的入參,${cart_token}
在這裏插入圖片描述

6、正則提取器
Ⅰ.正在表達式提取器介紹
①.Apply to:應用範圍
②.要檢查的響應字段:樣本數據源。
③.引用名稱:其他地方引用時的變量名稱,我這裏寫的phone,可自定義設置,引用方法:KaTeX parse error: Undefined control sequence: \d at position 92: …t"相當於LR右邊界。而括號裏\̲d̲+爲正則表達式,用來匹配所需要…$對應正則表達式提取器類型。-1全部,0 隨機,1第一個2第二個,以此類推,若只有一個正則一般就填寫11
⑥.匹配數字:正則表達式匹配數據的所有結果可以看做一個數組,匹配數字即可看做是數組的第幾個元素。-1表示全部,0隨機,1第一個,2第二個,以此類推。若只要獲取到匹配的第一個值,則填寫1
⑦.缺省值:匹配失敗時的默認值。可以不寫。若需用於後續邏輯判斷,可簡單寫爲 ERROR。
實例:在order接口提取出order_id
在這裏插入圖片描述
作爲pay_payment的入參
在這裏插入圖片描述
附正則表達式說明:
在這裏插入圖片描述在這裏插入圖片描述
通俗點來講正則表達式就是用來匹配字符串的公式。比如正則表達式中\d+ 是來匹配1個或更多連續的數字。更多可自行百度瞭解。

六、聚合報告

Ⅰ.聚合報告中有samples、averages、median、90%line、95%line、99%line、min、max、
error%、throughput、receivered KB/sec、sent KB/sec
在這裏插入圖片描述
1、Label
每個請求的名稱,比如HTTP請求等
2、#Sample
發給服務器的請求數量
3、Average
單個請求的平均響應時間
4、Median
50%請求的響應時間
5、90%Line
90%請求響應時間
6、95%Line
95%請求響應時間
7、99%Line
99%請求的響應時間
8、Min
最小的響應時間
9、Max
最大的響應時間
10、Error%
錯誤率=錯誤的請求的數量/請求的總數
11、Throughput
吞吐量即表示每秒完成的請求數
12、Received KB/sec
每秒從服務器端接收到的數據量
13、Sent KB/sec
每秒從客戶端發送的請求的數量

七、JMeter插件之jp@gc - PerfMon Metrics Collector

1、打開jp@gc - PerfMon Metrics Collector插件,如圖
在這裏插入圖片描述
2、輸入服務器地址,端口爲4444,如遇到端口衝突,可使用vim命令修改端口(端口隨意,只要不衝突就行),如圖
在這裏插入圖片描述
注意:測試服務器性能時,要在服務器上放一個插件ServerAgent-2.2.3(放在服務器的任一位置,啓動監測程序後運行JMeter),Linux系統運行startAgent.sh,,windows系統運行startAgent.bat
在這裏插入圖片描述
3、如果沒有啓動服務器監測ServerAgent會報錯,如圖
在這裏插入圖片描述
4、如果在使用過程中出現了這個錯誤
java.lang.NoSuchMethodError: org.apache.jmeter.samplers.SampleSaveConfiguration.setFormatter(Ljava/text/DateFormat;),此問題是因爲所用JMeter版本過高不支持jp@gc - PerfMon Metrics Collector插件導致,可下載低版本的JMeter,比如JMeter 3.1。
在這裏插入圖片描述
5、指標說明
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章