Jmeter組件分類說明
-
Jmeter的組件可以放在任意位置
-
線程池:用於創建線程。每個線程會"批次順序"執行任務,因此后面的任務可根據前面的任務決定具體的操作。
1. 普通線程組(主線程組):用於創建主要的線程任務
2. setUp線程組: 在普通線程組之前觸發,用於做測試的前置操作,例如創建測試賬戶
3. tearDown線程組: 在普通線程組之后觸發,用於做測試的后置操作,例如清理工作。
-
取樣器:用來模擬http,tcp請求。取樣器父節點需要包含線程組,否則不會執行
-
前置處理器: 用於定義取樣器前置操作,例如定義用戶生成,JDBC操作。
-
后置處理器:用於解析取樣器結果,父節點需包含取樣器。
-
斷言:用來判斷取樣器結果,父節點需包含取樣器。
-
定時器:用於控制並發請求的頻率。當父節點為取樣器,只對父節點生效。當父節點為線程組,對整個線程組生效。
-
配置元件:用於配置公共數據,可被同級節點或同級節點的子節點引用
-
監聽器:用於統計測試結果,形成圖表。常用的有察看結果樹,匯總報告,聚合報告。可通過安裝Plugins Manager來豐富監聽器的類型。
-
假如想查看每個分類的詳細說明,可以查看:倔強的瀟灑小姐
火焰圖
-
火焰圖不建議直接在google搜索,雖然可以得到很多結果,但是年份都在2017以前。但是不知為何都不能使用。Intellj Idea在2018.3之后推出了火焰圖,但是最終我也沒法解決這個問題。所以建議在github搜索flame graph
-
假如你是Linux用戶,使用https://github.com/brendangregg/FlameGraph
-
假如你是Mac用戶,使用https://github.com/kjeremi/java-flame-graph-osx
Java+Jmeter+火焰圖+Macos 舉栗

操作流程
- 啟動Java后台項目, 9999端口,api為http://localhost:9999/v1/searchsrv/all/activities?value=1。請使用控制台啟動。例如
# 記住包名
java -jar mockserver.jar
# api 返回值結構為
#{
# "error": null,
# "result": {},
# "success": true
#}
#在macos上,啟動火焰圖,並追蹤到mockserver
#需要下載上面那個火焰圖工具
./createFlameGraph.sh mockserver
- 啟動Jmeter,添加線程組


-
線程組右鍵->配置原件->http請求默認值,協議http,服務名稱localhost,端口號9999
-
線程組右鍵->配置原件->用戶自定義的變量

- 線程組右鍵->取樣器->http請求。
- 協議,服務器名稱,端口號都置空,會自動獲取http請求默認值
- 參數取了用戶自定義的變量

- http請求右鍵添加->斷言->json斷言->用於判斷api返回是否正確。不添加默認只有http code 200認為是正確的

-
線程組右鍵添加->監聽器->察看結果樹->用於查看各個api的詳細執行結果.也可以添加在http取樣器下面,單獨監聽。
-
線程組右鍵添加->監聽器->匯總報告->用於查看各個api匯總的結果,也可添加在http取樣器下面,單獨監聽。
Jmeter查看查看結果
- 通過察看結果樹查看請求是否成功,自定義變量是否生效,JSON斷言是否生效

- 通過匯總報告查看請求匯總情況

火焰圖查看調用堆棧
- Jmeter接口循環多跑幾次
- 停止Java項目
- 在火焰圖工具目錄下找到最新的svg文件,使用瀏覽器打開

更豐富多彩的圖形展示
jmeter雖然在可視化界面運行時能有很多圖形界面,但是開啟了會影響性能。所以建議使用命令行跑,然后生成一個html的頁面
下面提供一個腳本,每次運行會根據時間生成一個目錄,並將可視化界面生成到目錄下。使用的時候需要修改resultPath(結果路徑),sciptFile(腳本路徑)
- 可視化 CLI 模式
#設置結果集記錄
time_now=`date "+%Y-%m-%d_%H_%M_%S"`
resultPath=/Users/hehe/performanceTest/localRun/result/${time_now}
logPath=${resultPath}/log
samplePath=${resultPath}/sample
reportPath=${resultPath}/report
mkdir ${resultPath}
mkdir ${logPath}
mkdir ${samplePath}
mkdir ${reportPath}
#設置腳本路徑
scriptFile=/Users/hehe/performanceTest/localRun/script.jmx
#設置jmeter路徑
jmeterPath=/Users/klook/SoftwareInit/apache-jmeter-5.1.1/bin/jmeter
sh ${jmeterPath} -n -t ${scriptFile} -l ${samplePath}/result.jtl -j ${logPath}/result.log -e -o ${reportPath}
- 參數說明
-n: 指定 Jmeter 使用 CLI 模式運行
-t: 指定編寫完成的測試計划腳本( jmx 文件)
-l: 指定記錄樣本結果的 JTL 文件的名稱
-j: 指定 Jmeter 運行日志輸出文件
-r: 在指定的服務器(JMeter property "remote_hosts")上運行測試計划
-R: 在指定的多個遠程服務器上運行測試計划
-g: 僅生成報告儀表盤
-e: 測試完成后生成報告儀表板
-o: 指定測試報告輸出的位置,文件夾不得存在或為空
-H: 指定代理服務器主機名或IP地址
-P: 指定代理服務器端口
易踩坑
因為同一個線程組的任務是順序執行的,所以同一個線程組中,頻率最低的任務是所有任務的瓶頸。例如A->B,A每分鍾60次,B每分鍾120次,實際B為每分鍾60次