Java性能測試從入門到放棄-詳解篇

  • 2019 年 10 月 3 日
  • 筆記

Jmeter組件分類說明

  • Jmeter的組件可以放在任意位置

  • 執行緒池:用於創建執行緒。每個執行緒會"批次順序"執行任務,因此後面的任務可根據前面的任務決定具體的操作。

          1. 普通執行緒組(主執行緒組):用於創建主要的執行緒任務

          2. setUp執行緒組: 在普通執行緒組之前觸發,用於做測試的前置操作,例如創建測試賬戶

          3. tearDown執行緒組: 在普通執行緒組之後觸發,用於做測試的後置操作,例如清理工作。

  • 取樣器:用來模擬http,tcp請求。取樣器父節點需要包含執行緒組,否則不會執行

  • 前置處理器: 用於定義取樣器前置操作,例如定義用戶生成,JDBC操作。

  • 後置處理器:用於解析取樣器結果,父節點需包含取樣器。

  • 斷言:用來判斷取樣器結果,父節點需包含取樣器。

  • 定時器:用於控制並發請求的頻率。當父節點為取樣器,只對父節點生效。當父節點為執行緒組,對整個執行緒組生效。

  • 配置元件:用於配置公共數據,可被同級節點或同級節點的子節點引用

  • 監聽器:用於統計測試結果,形成圖表。常用的有察看結果樹,匯總報告,聚合報告。可通過安裝Plugins Manager來豐富監聽器的類型。

  • 假如想查看每個分類的詳細說明,可以查看:倔強的瀟洒小姐

火焰圖

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請求

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

json斷言

  • 執行緒組右鍵添加->監聽器->察看結果樹->用於查看各個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次