Java性能測試從入門到放棄-詳解篇
- 2019 年 10 月 3 日
- 筆記
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次