性能測試之Jmeter元件

一只沒有胡須的小猫咪 2022-01-07 23:00:44 阅读数:98

性能 jmeter 元件

性能測試之Jmeter元件

1.性能測試的本質

性能測試的定義

  • 基於協議模擬用戶發請求,對服務器形成一定的負載,來測試服務器的性能指標是否滿足用戶(產品&公司)的需求。

關注點

  • 時間性能
  • 空間性能

與界面無關

2.性能測試分類

負載測試

  • 在需要測試的系統上面,不斷施加壓力,一直到性能指標達到極限。如:響應時間超過預定指標。如:CPU超過預定的指標。如:內存超過預定指標。

性能測試

  • 特定的狀態下,測試系統的狀態。如:特定的時間中午12左右。晚上10點左右。

壓力測試

  • 被測試的系統在一定的飽和狀態下。如:CPU,內存和使用情况下。系統能够處理的能力,以及系統是否會出現BUG或者缺陷。

並發測試

  • 模擬用戶訪問,多用戶並發訪問(或同一時間段)同一個系統(同一模塊)是否出現性能問題。

可靠性測試

  • 系統加載到一定的壓力下,持續運行一段時間,以此測試系統的穩定性。

3.性能測試指標

  • 響應時間
  • 並發(並發數,並發用戶數)
  • TPS(每秒處理通過的事物數)
  • 吞吐量/吞吐率(事務/s, Kb/s)
  • 資源利用率: cpu利用率(不允許超過80%;隊列長度),內存利用率(80%;頁交換頻率),帶寬利用率

PS:具體的還是按照公司的性能測試指標去做的,因為每家公司的指標都不一樣,SO這裏我就不多做解釋了!!!

4.性能測試工具

  • loadrunner
    • 特點
      1.工業化的性能測試工具,能支持大量用戶,提供詳細的報錶來提供測試分析的數據
      2.支持的協議多
      3.使用c語言來編寫的

    • 優點
      1.支持用戶量大(以萬為單比特)
      2.提供精確的報錶
      3.支持IP欺騙

    • 缺點
      1.收費
      2.體積大
      3.無法控制

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

    • 缺點
      1.不支持IP欺騙
      2.報錶的精度比loadrunner差

jmeter元件及基本作用域

  • 基本元件

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

    • 核心: 根據測試計劃中的樹形結果的福子節點來確定的
    • 原則
    • 取樣器是沒有作用域的
    • 邏輯控制器: 只針對其子節點下的所有元件有效
  • 其他元件

    • 如果其父節點是取樣器,只針對父節點(取樣器)有效

    • 如果其父節點是非取樣器,針對父節點下的所有子節點及節點的子節點有效

      3.元件執行順序
      1.順序: 配置元件,前置處理器,定時器,取樣器,後置處理器,斷言,監聽器
      2.注意:
      1.配置元件,前置處理器,後置處理器都需要依賴取樣器才能執行
      2.在同一個作用域下,相同類型元件的執行順序是從上到下順序執行

jmeter線程組的特點

  • 介紹: 通過配置線程組中的線程數來模擬用戶. 線程數是用戶數,線程組就是用戶組

  • 特點:

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

    • 線程組: 用於執行業務測試的脚本
    • SetUp線程組: 測試前的預處理操作,在所有的線程組中最先執行
    • TearDown線程組: 測試後的後置處理(恢複環境,數據)的操作,在所有的線程組中最後執行
  • 線程組參數詳解

    • 線程數: 模擬虛擬用戶數
    • Ramp-up時間: 虛擬用戶啟動所需要的時間(性能測試)
    • 循環次數:
      • 配置指定次數: 控制脚本循環執行次數
      • 配置循環永久
        1.需要調度器配合使用
        2.運行時間: 脚本執行時間
        3.延遲啟動時間: 脚本等待特定的時間才能開始運行
  • 線程數m和循環次數n的關系

    • 如果同時配置,實際發送的HTTP請求數應該為m * n
    • 雖然發送請求次數相同,但不能相互替換
      1.線程數: 代錶並發用戶數,提現服務器的負載量
      2.循環次數: 代錶執行時間

jmeter取樣器

  • HTTP請求(取樣器):

    • http協議: 可以填寫為HTTP或者HTTPS,莫特熱鬧不填寫時為HTTP協議
    • http主機名/IP
    • 端口(http用80,https用443): 可以填任意值,默認不填寫時為80端口
    • 請求方法: HTTP協議支持的所有方法
    • 路徑: 目錄+參數
    • 編碼格式: 默認IOS國際標准,推薦使用utf-8
  • 察看結果樹(監聽器)

    • 取樣器結果: 統計請求相關信息
    • 請求: HTTP請求的請求頭和請求體的詳細信息
    • 響應: HTTP響應的響應頭和響應體的詳細信息
  • http請求默認值(配置元件)

    • 測試類似API或網址時可以設置公用的參數
  • http信息頭管理器(配置元件)

    • 用於新增數據,往數據庫添加新的數據
    • 點擊’添加’: 名稱 Content-Type; 值 application/json:charset=utf-8

jmeter響應中文亂碼的處理

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

Jmeter參數化

  • JMeter參數化常用方式
    • 用戶定義的變量
    • 用戶參數
    • CSV Data Set Config
    • 函數
  • 用戶定義的變量(作用域不同)
    • 方式1:
      • 添加: 線程組 -> 配置元件 -> 用戶定義的變量
      • 配置: 參數名 + 參數值
      • 使用: 在HTTP請求的取樣器中引用定義的變量. ${參數名}
    • 方式2:
      • 配置: 在測試計劃中配置用戶定義的變量
      • 使用: 在HTTP請求的取樣器中引用定義的變量. ${參數名}
    • 用戶參數
      • 添加: 線程組 -> 前置處理器 -> 用戶參數
      • 配置:
        • 參數: 添加變量
        • 參數值: 添加用戶 – 針對每個用戶配置不同的參數值
        • 使用: 在HTTP請求的取樣器中引用定義的變量. ${參數名}
      • CSV數據文件配置
        • 添加: 線程組 -> 配置文件 -> CSV數據文件設置
        • 編寫CSV數據文件(.csv作為後綴)
          • 多個參數寫為多列,其中用逗號分割
          • 多組參數值,則使用多行來設置
        • 配置:
          • 文件名: 填寫CSV文件的路徑,建議使用相對路徑
          • 文件編碼: UTF-8
          • 變量名稱: 從CSV數據文件中讀取的數據需要保存的變量名,有多個變量時用逗號分隔
          • 是否忽略首行: 是否從CSV數據文件第一行開始讀取
          • 分隔符: 要求與CSV數據文件中多列的分隔符一致
          • 遇到文件結束符是否再次循環: 默認TRUE
          • 遇到文件結束符是否停止線程: 當前一個參數為FALSE,該參數有效,一般設置為TRUE
        • 函數
          • counter:
            • TRUE: 每個用戶使用獨立的計數器
            • FALSE: 所有用戶使用全局的計數器
            • 引用: 在取樣器中使用${__counter(FALSE,)}來引用對應的值
            • 應用場景: 當需要參數化的數據只有唯一性要求,但是對具體的參數值無明確要求時,建議使用函數方式
          • random:
            • 隨機數函數: 生成用戶名稱
          • time
            • 生成一組數字: 時間戳–19700000到現在的時間換算成毫秒
            • 在函數助手可設置固定的時間戳: Format string for SimpleDateFormat (optional):yyyy-MM-dd hh:mm:ss

JMeter斷言

  • 作用: 讓脚本自動化執行的過程中,能够自動的判定執行結果是否正確,需要添加斷言
  • 常用斷言類型
    • 響應斷言
    • JSON斷言
    • 持續時間斷言
    • 大小斷言
  • 響應斷言
    • 添加: 線程組 -> HTTP請求 -> 斷言 -> 響應斷言
    • 配置:
      • 測試字段: 需要檢查的字段
      • 模式匹配規則: 需要使用什麼規則來進行檢查且, 或者, 非
      • 測試模式: 需要校驗的值
      • 填寫多個值
  • JSON斷言
    • 添加: 線程組 -> HTTP請求 -> 斷言 -> JSON
    • 適用於返回的HTTP響應為JSON格式
    • 配置
      • JSON PATH: $.weather.city
      • 勾選"Additional assert value"
      • 在expected value裏填寫期望值
    • 斷言持續
      • 適用於性能測試時候,檢查HTTP請求響應時間是否超過預期
      • 添加: 線程組 -> HTTP請求 -> 斷言 -> 斷言持續時間
      • 配置: 預期時間
    • 大小斷言
      • 響應代碼: 比如200 代錶2,0,0三個字符,需要寫3,不能寫200

關聯和提取器

  • 當多個請求之間有依賴關系,後一個請求的參數需要使用前一個請求的相應數據時,需要用到關聯
  • 分類: 正則錶達式提取器;xpath提取器;JSON提取器
  • 正則錶達式:
    • 添加: 線程組 - HTTP請求 - 後置處理器 -正則錶達式
    • 配置:
      • 要檢查的響應字段: 默認主體
      • 引用名稱: 匹配後的數據要存儲的變量名
      • 正則錶達式: (.*?) ()裏是要保存的數據
      • 模板: 1 1 1
        • 數字1代錶上面正則錶達式中第幾個()
      • 匹配數據: 0代錶隨機值, 1代錶第一個結果, -1代錶所有結果
      • 缺省值: 當沒有匹配上時將該值保存到變量裏
    • 引用:
      • 如果匹配數字為1,則直接使用變量名來使用: $(變量名)
      • 如果匹配數字為-1,則使用變量名+後置的方式來引用: $(變量名_s)
    • Xpath提取器
    • 添加: 線程組 – HTTP請求 – 後置處理器 – xpath提取器
    • 配置
      • 引用名稱: 匹配後的數據要存儲的變量名
      • xpath_xpath: xpath匹配規則
      • 匹配數字: 1代錶第一個結果, -1代錶所有結果, 0錶示隨機
      • 缺省值: 當沒有匹配上時將改制保存到變量裏
    • JSON提取器
      • 添加: 線程組 – HTTP請求 – 後置處理器 – JSON提取器
      • 配置
        • 引用名稱: 匹配後的數據要存儲的變量名
        • JSON path: json路徑. $.weatherinfo.city
      • 引用: 直接引用變量名即可
    • 跨越線程組傳值(線程組1,線程組2)
      • 在線程組1裏: 點擊函數助手–選取函數setProperty – 設置參數(屬性名稱(該函數名稱),Value of property(${其他提供的屬性名稱})) – 生成,複制
      • 在線程組1裏: 取樣器 – BeanShell取樣器 – 粘貼
      • 在線程組2裏: 函數助手 – property --屬性名稱(該函數名稱) – 生成,複制
      • 在線程組2裏: 放到用到的地方

JMeter直連數據庫

  • 連接准備
    • 打開數據庫,確定數據庫的錶及對應的字段
    • 加載mysql的jdbc驅動
      • 將jdbc驅動通過測試計劃,瀏覽的方式添加
      • 將jdbc驅動jar包放入到lib\ext目錄下,並重啟jmeter
    • 配置jdbc connection configuration
      • created pool name: 給連接池命名,用於後續引用
      • 數據庫url: jdbc:mysql://127.0.0.1:3306/tpshop2.0
      • 用戶名
      • 密碼
    • 直連數據庫使用:
      • 添加JDBC Request: 在取樣器下添加
      • 配置
        • 配置連接池的名稱
        • 配置SQL語句
        • 配置保存的變量名
        • 如果SQL語句返回了多個參數,輸入相同個數的變量名來保存
      • HTTP斷言中,就可以引用變量來進行判斷

JMeter邏輯控制器

  • 控制元件的執行順序
    • IF控制器
    • 添加: 線程組 – 邏輯控制器 – if控制器
      • 配置:
        • 使用JS語法: “${name}” == “百度”
        • 使用JMeter函數的方式: KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{name}" == ‘baidu’,)}
        • 推薦使用函數方式
      • 循環控制器
        • 指定HTTP請求執行特定的次數
        • 添加: 線程組 – 邏輯控制器 – 循環控制器
        • 配置: 指定次數
        • 循環控制器中的循環次數配置m與線程組中的循環次數配置n對比:
          • 關系: 如果同時配置,循環控制器下HTTP請求實際的執行次數應該是m*n
          • 區別: 這兩個循環次數作用域不同
            • 線程組的循環次數針對整個測試計劃
            • 循環控制器的循環系數只做用於循環控制器下的請求
      • ForEach控制器
        • 與用戶定義的變量或者與正則錶達式提取器配合使用,循環讀取返回的變量中的值,執行一次或者多次
        • 與用戶定義的變量配合使用
        • 添加: 線程組 – 邏輯控制器 – ForEach控制器
        • 配置:
        • 用戶定義的變量
          • 變量名: 固定前綴+連續數字
        • ForEach控制器
          • 變量的前綴: 用戶定義的變量中配置的固定前綴
          • 起始數字: 連續數字的最小值-1
          • 結束數字: 連續數字的最大值
          • 輸出的變量名稱: 依次讀取變量值後存儲到參數中,供HTTP請求來引用
        • HTTP請求
          • 引用輸出的變量名稱
          • 與正則錶達式配合使用
          • 先通過正則錶達式提取器,提取出請求中所有滿足條件的數據
          • 添加ForEach控制器,並配置提取所有滿足條件的數據,並保存為變量
          • 在其子節點下,添加HTTP請求並引用變量,即可循環讀取正則錶達式中匹配的所有數據

JMeter定時器

  • 同步定時器[集合點(loadrunner)]高並發
    • 當需要進行大量用戶的並發測試時,為了讓用戶能真正的同時執行,添加同步定時器,用戶阻塞線程,直到線程數達到預先配置的數值,才開始執行取樣器的操作
    • 配置:
      • 模擬用戶組的數量(並發數): 同時達到多少用戶才開始發送請求
      • 超時時間:
        • 必須配置: 否則當虛擬用戶數無法被並發數整除時,就會有部分的用戶掛起無法執行
        • 配置不能太短: 必須比並發數加載的時間要長.否則無法達到並發數的要求,數據就會被釋放掉
      • 常數吞吐定時器(高頻率)
        • 用於性能測試時模擬用戶產生的業務壓力,通過指定QPS來對服務器發送固定頻率的請求
        • 添加: 線程組 – HTTP取樣器 – 常數吞吐量定時器
        • 配置: 吞吐量的值: QPS * 60

JMeter分布式

  • 應用場景: 當測試機無法模擬用戶需要的業務負載時,需要使用多臺測試機配合使用
  • 原理:
    • 分布式測試時分為一臺控制機和多臺代理機
    • 控制機負責發布測試任務給代理機
    • 代理機接受任務並向服務器發送請求,並接受服務器返回的響應,然後將測試結果返回給控制機
    • 由控制機對測試結果數據進行匯總統計
  • 注意事項:
    • 所有的測試機防火牆都已經關閉
    • 所有的測試機及服務器在同一個網絡內
    • 所有的測試機的JMeter版本和JDK版本完全相同
    • 關閉JMeter裏的RMI.SSL開關
  • 分布式配置:
    • 配置:
      • 代理機:
      • server_port: 不重複.如果使用多臺機器做代理機,可不用配置
      • 關閉RMI.SSL
    • 控制機
      • emote_server: 所有代理機的IP+port,有多臺代理機時用逗號分隔
      • 關閉RMI.SSL
    • 運行
      • 代理機: jmeter-server.bat運行
      • 控制機:
      • jmeter.bat運行
      • 控制代理機執行脚本: 運行 - 遠程啟動所有

Jmeter報告

  • 生成HTML報告

    • 在cmd中輸入

      • jmeter -n -t 脚本文件 -l 日志文件 -e -o 目錄
      • -n: 無圖形化運行
      • -t: 被運行的脚本
      • -l: 將運行信息寫入日志文件(日志文件必須為空或者不存在)
      • -e: 生成測試報告
      • -o: 指定報告輸出目錄(目錄不存在或者為空)
    • jmeter -n -t xxx.jmx -l xxx.jtl

    • jmeter -g xxx.jtl -o [空文件夾]

    • 參數解析

      • -n:非GUI模式執行JMeter
      • -t: 執行測試文件所在的比特置
      • -l: 指定生產測試結果的保存文件, jtl文件格式
      • -e: 測試結束後,生成測試報告
      • -o: 指定測試報告的存放比特置
      • -g: 指定已存在的測試結果文件
  • 聚合報告

    • Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這裏顯示的就是 Name 屬性的值
    • Samples:錶示你這次測試中一共發出了多少個請求,如果模擬10個用戶,每個用戶迭代10次,那麼這裏顯示100
    • Average:平均響應時間——默認情况下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單比特顯示平均響應時間
    • Median:中比特數,也就是 50% 用戶的響應時間
    • 90% Line:90% 用戶的響應時間
    • Min:最小響應時間
    • Max:最大響應時間
    • Error%:本次測試中出現錯誤的請求的數量/請求的總數
    • Throughput:吞吐量——默認情况下錶示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以錶示類似 LoadRunner 的 Transaction per Second 數
    • KB/Sec:每秒從服務器端接收到的數據量,相當於LoadRunner中的Throughput/Sec
    • Label: 請求的名稱,就是我們在進行測試的httprequest sampler的名稱
    • Samples:總共發給服務器的請求數量,如果模擬10個用戶,每個用戶迭代10次,那麼總的請求數為:10*10 =100次;
    • Average:默認情况下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,以Transaction 為單比特顯示平均響應時間 ,單比特是毫秒
    • Median: 50%用戶的請求的響應時間,中比特數
      在這裏插入圖片描述
      PS:下篇文章再講 loadrunner 吧。今天眼睛有點疼了
版权声明:本文为[一只沒有胡須的小猫咪]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072300442325.html