【測試基礎】jmeter工具介紹及使用


一、Jmeter介紹

jmeter是Apache組織基於java開發的一款性能測試軟件。是一款開源、小巧、支持多協議(HTTP/HTTPS、JDBC、JAVA...等等)、眾多插件為一體的強大工具。
它不僅做性能測試,還可以做接口的自動化測試。

優點

1.開源免費
2.體積小
3.有豐富的第三方插件

缺點

1.不支持ip欺騙
2.報表的精度比LR要差

二、Jmeter文件目錄介紹

1.1 bin目錄

存放可執行文件和配置文件

jmeter.bat:windows的啟動文件
jmeter.log:日志文件
jmeter.sh:linux的啟動文件
jmeter-properties:系統配置文件
jmeter-server.bat:windows分布式測試要用到的服務器配置
jmeter-server:linux分布式測試要用到的服務器配置

1.2 docs目錄

docs:是Jmeter的api文檔,可打開api/index.html頁面來查看

1.3 printable_docs目錄

printable_docs的usermanual子目錄下的內容是Jmeter的用戶手冊文檔。
usermanual下component_reference.html是最常用到的核心元件幫助文檔。

提示:printable_docs的demos子目錄下有些常用Jmeter腳本案例,可以參考。

1.4 lib目錄

該目錄用來存放Jmeter依賴的jar包和用戶擴展所依賴的jar包。

三、Jmeter的基礎配置

漢化設置

  • 臨時修改:

    ​ options--->language--->choose language--->Chinese

  • 永久修改:

    1. 打開jmeter.properties

    2. 修改language=zh_CN

    3. 重啟jmeter

主題修改

選項--->主題--->選擇對應的主題,重啟jmeter

四、Jmeter的基本操作

  1. 啟動jmeter
  2. 添加線程組
  3. 添加http請求的取樣器,並配置
  4. 添加查詢結果樹的監聽器
  5. 點擊"啟動"運行jmeter,並查看結果

基本元件

線程組:模擬用戶的。
配置元件:進行測試環境和測試數據初始化--->比如自動化腳本中setup
前置處理器:對要發送請求進行預處理--->比如自動化腳本中參數化
取樣器:往服務器發送請求--->比如自動化腳本中發請求的代碼
后置處理器:對收到服務器的響應進行數據提取--->比如自動化腳本中獲取響應中特定字段語句
斷言:將收到響應結果又預期結果做對比--->比如自動化腳本中斷言
監聽器:查看測試腳本運行后結果和日志--->比如自動化腳本中測試報告
定時器:等待一段時間--->比如自動化腳本中sleep
測試片段:封裝基本功能,不單獨執行,需要通過腳本的調用才能執行--->比如自動化腳本中封裝函數

作用域

核心:根據測試計划中的樹形結構的父子節點來確定的

原則:

  • 取樣器是沒有作用域的。
  • 邏輯控制器:只對其子節點下的所有元件有效。
  • 其他的元件。
    • 如果其父節點是取樣器,則只對父節點取樣器有效。
    • 如果其父節點不是取樣器,對父節點下所有子節點及節點中子節點有效。

元件的執行順序

順序:配置元件--->前置處理器--->定時器--->取樣器--->后置處理器--->斷言--->監聽器

注意:

  • 配置元件、前置處理器、后置處理器都需要依賴取樣器才能運行
  • 在同一個作用域下,相同類型元件執行順序是從上到下來按順序執行

Jemter重要的三個組件

線程組

作用:通過配置線程組中的線程數來模擬用戶。線程數就是用戶數,線程組是用戶組

特點:

  • 模擬多用戶
  • 取樣器和邏輯控制器必須在線程組下使用
  • 一個測試計划下可以添加多個線程組,可以並行或串行執行
    • 並行:默認情況下線程組為並行執行
    • 串行:在測試計划下勾上"獨立運行每個線程組"

線程組的分類:

  • setup線程組:擁有測試前預處理操作,在所有線程組中最先執行
  • 普通線程組:來執行業務測試腳本
  • teardown線程組:用來測試后的后置處理(數據、恢復環境)的操作,在所有的線程組中最后執行

線程組的屬性

線程數:模擬虛擬用戶數

Ramp-up時間:虛擬用戶啟動所需要的時間

循環次數:

  • 配置指定次數:控制腳本運行執行的次數
  • 配置循環永遠
    • 需要調度器配置使用
    • 運行時間:腳本執行的時間
    • 延遲啟動時間:腳本等待特定的時間才能開始運行

http請求

http協議:可以填寫為HTTP或者HTTPS,默認不填寫為HTTP協議

http主機名/ip:如:http://baidu.com 80

端口:可以填寫為任意值。默認不填寫時為80端口

請求發方法:HTTP協議所有支持的所有方法

​ 路徑:目錄+參數

​ 編碼格式:默認IOS國際標准,推薦使用utf-8

查看結果樹

取樣器結果:統計請求相關的信息

請求:HTTP請求的請求頭和請求體的詳情信息

響應:HTTP響應的響應頭和響應體的詳情信息

jmeter響應中出現亂碼時:

  1. 修改jmeter.properties文件中,sampleresult.default.encoding=utf-8
  2. 重啟jmeter

五、Jmeter參數化常用方式

用戶定義的變量

  • 方式1:
添加:線程組--->配置元件--->用戶自定義變量
配置:參數名+參數值
使用:在HTTP請求的取樣器中引用定義變量。$(參數名)
  • 方式2:
配置:在測試計划中去配置用戶定義變量
使用:在HTTP請求的取樣器中引用定義變量。$(參數名)
應用場景:當大量腳本中的參數值需要修改時候,直接修改用戶定義變量中值會更方便

用戶參數

添加:線程組--->前置處理器--->用戶參數
配置:

  • 參數:添加變量
  • 參數值:添加用戶--->針對每個用戶配置不同的參數值

使用:在HTTP請求的取樣器中引用定義的變量。$(參數名)

應用場景:可以針對不同的用戶獲取到不同的參數值

CSV Data Set Config

添加:線程組--->配置元件--->CSV數據文件設置

編寫CSV數據文件(.csv作為后綴):

  • 多個參數寫為多列,其中用逗號分隔
  • 多組參數值,則使用多行來設置

配置:

  • 路徑
  • 文件編碼:UTF-8
  • 變量名稱:從CSV數據文件中讀取的數據需要保存變量名。有多個變量時用逗號分隔
  • 是否忽略首行:是否從CSV文件第一行中開始讀取
  • 分隔符:要求與CSV數據文件中多列的分隔符一致
  • 遇到文件結束符是否再次循環:默認TRUE
  • 遇到文件結束符是否停止線程:當前一個參數為FALSE,該參數有效,一般設置為TRUE

函數

counter:

  • TRUE:每個用戶使用獨立計數器
  • FALSE:所有的用戶使用全局計數器

引用:在取樣器中使用$(__counter(FALSE,))來引用對應值

建議大家使用函數方式

六、Jmeter斷言

作用:讓腳本自動化執行過程中,能夠自動判定執行結果是否符合要求時候,需要添加斷言

響應斷言

添加:線程組--->HTTP請求--->斷言--->響應斷言

配置:

  • 測試字段:需要檢查的字段
  • 模式匹配規則:需要使用什么規則來進行檢查
  • 測試模式:需要校驗的值

Json斷言

適用於返回的HTTP響應為JSON格式

添加:線程組--->HTTP請求--->斷言--->JSON斷言

配置:

  • JSON PATH:$.weatherinfo.city
  • 勾選"Addltonal assert value"
  • 在expected value里填寫期望值

斷言持續時間:

適用於性能測試時,檢查HTTP請求的響應時間是否超過預期值

添加:線程組--->HTTP請求--->斷言--->斷言持續時間

配置:預期時間

七、Jmeter關聯(提取器、數據庫、邏輯控制器等)

當多個請求之間有依賴關系,后一個請求的參數需要使用前一個請求的響應數據時,需要用到關聯。

分類:

  • 正則表達式提取器
  • xpath提取器
  • Json提取器

提取器

正則提取器

添加:線程組--->HTTP請求--->后置處理器--->正則表達式提取器

配置:

  • 要檢查的響應字段:默認主體
  • 引用名稱:匹配后的數據要存儲的變量名
  • 正則表達式:<p>(.*?)</p>,"()"里是要保存的數據
  • 模板:$1$
    • 數據1代表上面正則表達式中第幾個()
  • 匹配數字:0代表隨機值、1代表第一個結果,-1代表所有結果
  • 缺省值:當沒有匹配上時將該值保存到變量里

xpath提取器

添加:線程組--->HTTP請求--->后置處理器--->xpath提取器

配置:

  • 引用名稱:匹配后的數據要存儲的變量名
  • xpath path:xpath匹配規則
  • 匹配數字:0代表隨機值、1代表第一個結果,-1代表所有結果
  • 缺省值:當沒有匹配上時將該值保存到變量里

json提取器

添加:線程組--->HTTP請求--->后置處理器--->json提取器

配置:

  • 引用名稱:匹配后的數據要存儲的變量名
  • json path:json路徑。$.weatherinfo.city

引用:直接引用變量名即可

八、Jmeter數據庫連接與操作

連接准備:

  • 打開數據庫,確定數據庫的表及對應的字段
  • 加載mysql的jdbc驅動
    • 方法一:將jdbc驅動通過測試計划,瀏覽的方式添加
    • 方式二:將jdbc驅動jar包放入到lib\ext目錄下,並重啟jmeter
  • 配置jdbc connection configuration
    • created pool name:給連接池命名,用於后續引用
    • 數據庫URL:jdbc:mysql://127.0.0.1:3306/test
    • 用戶名
    • 密碼

直連數據庫使用:

  • 添加JDBC Request:取樣器下添加
  • 配置:
    • 配置連接池名稱
    • 配置SQL語句
    • 配置保存的變量名
      • 如果SQL語句返回了多個參數,輸入相同個數的變量名來保存
  • HTTP斷言中,就可以引用變量來進行判斷

九、Jmeter的邏輯控制器

控制元件的執行順序

if控制器

添加:線程組--->邏輯控制器--->if控制器

配置:

  • 使用JS預發:"${name}"=="baidu"
  • 使用jmeter函數的方式:${__jexl3("${name}"=="baidu",)}
  • 推薦使用函數的方式

循環控制器

指定HTTP請求執行特定的次數

添加:線程組--->邏輯控制器--->循環控制器

配置:次數

循環控制器中的循環次數配置m與線程組中的循環次數n配置對比:

  • 關系:如果同時配置,循環控制器下HTTP請求實際執行的次數應該是n*m
  • 區別:這兩個循環次數作用域不同

ForEach控制器

與用戶定義的變量或正則表達式提取器配合使用,循環讀取返回的變量值,執行一次或多次。

  1. 與用戶定義的變量配合

    添加:線程組--->邏輯控制器--->ForEach控制器

    配置:

    • 用戶定義的變量

      • 變量名:固定前綴+連續數字
    • ForEach控制器

      • 變量前綴:用戶定義的變量中配置的固定前綴
      • 起始數字:連續數字的最小值-1
      • 結束數字:連續數字的最大值
      • 輸出變量名稱:依次讀取變量值后存儲到參數中,共HTTP請求來引用
    • HTTP請求:

      • 引用輸出的變量名稱
  2. 與正則表達式配合使用

    • 先通過正則表達式提取器,提取出請求中所有滿足條件數據
    • 添加ForEach控制器,並配置提取所有滿足條件的數據,並保存為變量
    • 在其子節點下,添加HTTP請求並引用變量,可循環讀取正則表達式里匹配的所有數據

十、Jmeter定時器

同步定時器

需要進行大量用戶的並發測試時,為了讓用戶能真正同時執行,添加"同步定時器"使其阻塞線程,直到線程達到了預先設置數值,才開始進行取樣器操作。

配置:

  • 並發數:同事達到多少用戶才開始發請求

  • 超時時間:

    • 必須配置:否則當虛擬用戶數無法被並發數整除時,會導致有部分用戶掛起無法執行
    • 配置不能太短:必須比並發數加載時間要長。否則無法達到並發數的要求,數據就會被釋放掉

常數吞吐量定時器

用於性能測試中模擬用戶產生業務壓力,通過給定QPS來對服務器發送固定頻率要求。

添加:線程組--->HTTP取樣器--->常數吞吐量定時器

配置:吞吐量的值QPS*60

十一、Jmeter的分布式

原理:

  • 分布式測試時分為一台控制機和多台代理機
  • 控制機負責發布測試任務給代理機
  • 代理機接收任務並向服務器發送請求,並接收服務器返回的響應,然后將測試結果返回給控制機
  • 由控制機對測試結果數據進行匯總統計

分布式相關注意事項:

  • 所有的測試機防火牆都已經關閉
  • 所有的測試機及服務器在同一個網絡內
  • 所有的測試機的jmeter版本和JDK版本完全相同
  • 關閉jmeter里的RMI SSL開關

分布式配置

配置

  • 代理機
    • server_port:不重復。如果使用多個機器做代理機,可不用配置
    • 關閉RMI SSL
  • 控制機
    • remote_server:所有代理機的IP+port,有多個代理機時要使用逗號分隔
    • 關閉RMI SSL

運行

  • 代理機
    • jmeter-server.bat運行
  • 控制機:
    • jmeter.bat運行
    • 控制代理機執行腳本,運行--->遠程啟動所有

十二、報告結果分析

聚合報告


具體參數說明如下:

Label:就是請求名稱
#樣本:總線程數,值 = 線程數 * 循環次數=20*10=200
平均值:單個請求的平均響應時間,值 = 總運行時間 / 發送到服務器的總請求數
中位數、90%百分位、95%百分位、99%百分位分別代表50%的用戶響應時間、90%的用戶響應時間、95%的用戶響應時間、99%的用戶響應時間,也就是有百分之多少的請求小於這個值。其中,90%百分位是性能測試中比較重要的一個衡量指標。
最小值:最小響應時間
最大值:最大響應時間

異常%:錯誤率,發生錯誤的請求 / 總請求數,上面示例中錯誤率為0

吞吐量:表示每秒完成的請求數。

接收KB/sec或發送KB/sec:以每秒接收或發送的千字節為單位測量的吞吐量

圖形報告

具體參數說明如下:

樣本數目:總的請求數

最新樣本:最后一次請求的響應時間

平均:所有請求的平均響應時間

偏離:響應時間變化、離散程度測量值的大小,也就是數據的分布偏差,值越小越好

吞吐量:服務器每分鍾處理的請求數,相當於TPS,注意單位是分鍾

中值:響應時間的50%百分位的值,也就是有50%的請求響應時間小於該值

表格報告

具體參數說明如下:

Sample#:每個請求的序號。

Start Time:每個請求開始時間。(時:分:秒.毫秒)

Thread Name:每個線程的名稱(線程序號-第N次循環次數)。

Label:每個請求的自定義名稱(無修改時默認顯示請求類型,如Http,FTP等請求)。

Sample Time(ms):每個請求的響應時間。(單位:毫秒)

Status:請求狀態,如果為勾則表示成功,如果為叉表示失敗。

Bytes:響應的字節數,請求的字節數。

Sent Bytes:發送的字節數。

Latency:延遲的時間,等待時長。(單位:毫秒)

Connect Time(ms):連接服務器的時間。(單位:毫秒)

樣本數目:所有請求個數,樣本數目 = 線程數(請求用戶數)* 請求次數 。(單位:個)

平均:所有請求的平均響應時間。(單位:毫秒)

最新樣本:最新樣本響應時間,表示服務器響應最后一個請求的時間。(單位:毫秒)

偏離:服務器響應時間變化、離散程度測量值的大小,或者,換句話說,就是數據的分布。

一般而言,性能測試中我們需要重點關注的數據有: #Samples 請求數,Average 平均響應時間,Min 最小響應時間,Max 最大響應時間,Error% 錯誤率及Throughput 吞吐量。


Jmeter自動化實戰

接口自動化測試框架: jmeter + ant + jenkins:
待更新

Jmeter性能測試實戰

【性能測試實戰】jmeter+k8s+微服務+skywalking+efk:
待更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM