jmeter線程組(下篇)

?

線程組

?

線程組作為JMeter測試計劃的核心組件之一,對于模擬并發用戶的行為至關重要。線程組元件是整個測試計劃的入口,所有的取樣器和控制器必須放置在線程組下。

可以將線程組視為一個虛擬用戶池,其中每個線程可被理解為一個虛擬用戶,多個虛擬用戶同時執行相同的一批任務。

在這個虛擬用戶池中,每個線程之間是相互隔離且互不影響的。每個線程的執行過程中,操作的變量不會對其他線程的變量值產生影響。

線程組的關鍵任務之一是定義并發用戶的行為,包括設置線程數、循環次數、啟動延遲等關鍵參數。通過適當配置線程組,測試人員可以模擬多用戶在系統中同時執行任務的場景,從而評估系統的性能和穩定性。

通過靈活使用setup線程組、線程組、tearDown線程組、開放模型線程組,配置前置操作、主要操作、后置操作,更能真實、詳細的評估系統。

線程組分為四類:

  • 線程組
  • setUp線程組
  • tearDown線程組
  • 開放模型線程組

線程組、setUp線程組、tearDown線程組控制面板中的元素基本一致:

  • 名稱、注釋
  • 在取樣器錯誤后執行的動作
  • 線程數
  • Ramp-Up時間
  • Same user on each iteration
  • 延遲創建線程直到需要(只有線程組有)
  • 調度器

開放模型線程組控制面板中的元素:

  • 名稱、注釋
  • 在取樣器錯誤后執行的動作
  • 調度計劃
  • 隨機種子

取樣器錯誤后執行的動作


在JMeter中,取樣器(Sampler)是用于模擬用戶請求發送到目標服務器的組件,例如HTTP請求、FTP請求等。當取樣器執行過程中出現錯誤時,可以通過配置相應的動作來處理這些錯誤。以下是一些處理取樣器錯誤時,線程組中常見方式:

  • 停止線程

    任何一個線程(用戶)在執行過程中遇到錯誤時,該線程被停止,不影響其他線程(用戶)。

  • 啟動下一進程循環
    任何一個線程(用戶)在執行過程中遇到錯誤時,Jmeter會立即停止當前線程的本次執行,并進行當前線程(用戶)的下次執行,主要應用于線程多次循環時。

  • 繼續(無需演示)

    JMeter將在取樣器執行錯誤時,忽略錯誤繼續執行本線程的后續操作及執行其他線程。

停止線程-多線程


示例接口代碼

@ThreadGroup.route('/api/ThreadGroup5/', methods=['GET', 'POST'])  
def threadgroup5():  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    取樣器錯誤后執行的動作中勾選停止線程

    線程數3

  • 線程組下依次添加2個HTTP 請求取樣器

    名稱:錯誤請求-${yonghu}(在前)、正確請求-${yonghu}

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup5/

    請求方式:GET

  • 線程組下添加CSV 數據文件設置(右鍵-添加-配置元件)

    文件名ceshi.txt的路徑

    ?ceshi.txt文件內容:(復制后,手動刪除前面的空格)
    ??200,用戶1
    ??1111,用戶2
    ??200,用戶3

    文件編碼UTF-8

    變量名稱ceshi,yonghu

  • 錯誤請求取樣器下添加響應斷言

    值:${ceshi}

  • 測試計劃中,添加查看結果樹

image

運行結果

image

連續運行了3次,結果是一致的。總共有三個用戶執行線程組,其中用戶1用戶3完全執行成功;用戶2只執行了錯誤請求

因為設置取樣器錯誤后執行的動作停止線程用戶2執行錯誤請求時發生錯誤,Jmeter只會停止用戶2的后續執行,不會影響其他線程。

多線程組也是多線程,讀者在實際的腳本編寫中,要注意每個線程的情況去使用停止線程

停止線程-多循環


示例接口代碼

@ThreadGroup.route('/api/ThreadGroup5/', methods=['GET', 'POST'])  
def threadgroup5():  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    取樣器錯誤后執行的動作中勾選停止線程

    循環次數3

  • 線程組下依次添加2個HTTP 請求取樣器

    名稱:錯誤請求-${xunhuan}(在前)、正確請求-${xunhuan}

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup5/

    請求方式:GET

  • 線程組下添加CSV 數據文件設置(右鍵-添加-配置元件)

    文件名ceshi.txt的路徑

    ?ceshi.txt文件內容:(復制后,手動刪除前面的空格)
    ??200,第1次循環
    ??1111,第2次循環
    ??200,第3次循環

    文件編碼UTF-8

    變量名稱ceshi,xunhuan

  • 錯誤請求取樣器下添加響應斷言

    值:${ceshi}

  • 測試計劃中,添加查看結果樹

image

運行結果

image

連續運行了3次,結果是一致的。用戶在第2次循環執行到錯誤請求時,Jmeter停止測試。

因為設置取樣器錯誤后執行的動作停止線程,用戶的第2次循環,執行錯誤請求時發生錯誤,Jmeter停止用戶的后續執行(就它一個線程)。

啟動下一進程循環


示例接口代碼

@ThreadGroup.route('/api/ThreadGroup5/', methods=['GET', 'POST'])  
def threadgroup5():  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    取樣器錯誤后執行的動作中勾選啟動下一線程循環

    循環次數3

  • 線程組下依次添加2個HTTP 請求取樣器

    名稱:錯誤請求-${xunhuan}(在前)、正確請求-${xunhuan}

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup5/

    請求方式:GET

  • 線程組下添加CSV 數據文件設置(右鍵-添加-配置元件)

    文件名ceshi.txt的路徑

    ?ceshi.txt文件內容:(復制后,手動刪除前面的空格)
    ??200,第1次循環
    ??1111,第2次循環
    ??200,第3次循環

    文件編碼UTF-8

    變量名稱ceshi,xunhuan

  • 錯誤請求取樣器下添加響應斷言

    值:${ceshi}

  • 測試計劃中,添加查看結果樹

image

運行結果

image

連續運行了3次,結果是一致的。用戶執行了3次循環,其中第2次循環中,錯誤請求出現錯誤,跳過正確請求

因為設置取樣器錯誤后執行的動作啟動下一線程循環,用戶的第2次循環,執行錯誤請求時發生錯誤,Jmeter會跳過用戶的本次執行,進行用戶的后續執行。

ramp-up時間


ramp-up時間用于設置啟動所有線程所需要的時間。例如:線程數設置為10,ramp-up時間設置為100秒,那么JMeter將使用100秒使10個用戶啟動并運行,即每個用戶將在前一個用戶啟動后的10秒啟動。

如果ramp-up值設置得很小、線程數又設置得很大,剛開始執行測試時會對服務器產生很大的壓力。

示例接口代碼

@ThreadGroup.route('/api/ThreadGroup5/', methods=['GET', 'POST'])  
def threadgroup5():  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    Ramp-Up時間:9

    線程數3

  • 線程組下添加1個HTTP 請求取樣器

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup5/

    請求方式:GET

  • 測試計劃中,添加查看結果樹

image

運行結果

image

連續運行了3次,結果是一致的。3個用戶執行線程組,各個用戶的請求時間分別為2024-04-15 16:12:37 CST2024-04-15 16:12:40 CST2024-04-15 16:12:43 CST

3個用戶執行請求的間隔時間正好是3秒,即ramp-up時間/線程數

same user on each iteration(在每次迭代中使用相同的用戶)


沒有研究出來它有什么用。經過我的測試,same user on each iteration(在每次迭代中使用相同的用戶)啟用與否,作用是一樣的。

如讀者對此有不同見解,歡迎與我聯系,共同探討。目前,我十分費解。

延遲創建線程直到需要


當在JMeter中啟用延遲創建線程直到需要時,JMeter會根據預設的Ramp-up時間動態地分配線程。假設Ramp-up時間設置為20秒,線程數為10,那么JMeter會在測試啟動后立即創建第一個線程并開始請求處理。隨后,每隔2秒,JMeter將創建下一個線程,直到所有線程都被啟動。

如果關閉“延遲創建線程直到需要”選項,JMeter會在測試開始時一次性創建所有線程。使用同樣的參數,即在測試一開始,JMeter會立即創建全部的10個線程。這些線程會按照設定的“Ramp-up時間”進行執行,每個線程將間隔2秒啟動。

延遲創建線程直到需要這一配置的目的是為了應對測試機性能有限的情況。通過這種方式,可以避免在測試初期就創建所有線程,導致資源過度占用和可能的性能問題。這種方法有助于平滑地增加系統負載,同時防止資源瞬間緊張導致測試無法正常進行。

調度器-啟動延遲


調度器主要控制線程操作時間。啟用調度器后,可以輸入持續時間(值不能為空),啟動延遲來控制線程組的操作時間及線程組操作前的延遲時間。

同時輸入持續時間啟動延遲時,先計算啟動延遲,再計算持續時間

示例接口代碼

@ThreadGroup.route('/api/ThreadGroup5/', methods=['GET', 'POST'])  
def threadgroup5():  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    啟用調度器

    持續時間:10

    啟動延遲3

  • 線程組下添加1個HTTP 請求取樣器

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup5/

    請求方式:GET

  • 測試計劃中,添加查看結果樹

image

運行結果

image

注意看圖中右上角-黃色三角形左邊的計時器,值固定在2秒。這個計時器計算整個測試計劃的持續時間。由于示例請求的接口響應較快,可以理解為計時器的時間就是HTTP請求時的時間。

因為啟動延遲設置為3秒,所以HTTP請求會在延遲3秒執行。不過計時器的時間是2秒,誤差1秒。我多次試過把持續時間啟動延遲的時間拉長,誤差還是1秒。

調度器-持續時間


調度器主要控制線程操作時間。啟用調度器后,可以輸入持續時間(值不能為空),啟動延遲來控制線程組的操作時間及線程組操作前的延遲時間。

同時輸入持續時間啟動延遲時,先計算啟動延遲,再計算持續時間

示例接口代碼

@ThreadGroup.route('/api/ThreadGroup6/', methods=['GET', 'POST'])  
def threadgroup6():  sleep(3)  return '200'

示例Jmeter腳本

  • 測試計劃下添加線程組

    啟用調度器

    持續時間:2

  • 線程組下添加1個HTTP 請求取樣器

    請求地址:HTTP://127.0.0.1:5000/api/ThreadGroup6/

    請求方式:GET

  • HTTP 請求下添加1個固定定時器

    值:3000

  • 測試計劃中,添加查看結果樹

image

運行結果

image

圖中結果樹中什么都沒有,這是因為線程組的持續時間只有2秒,但固定定時器的延遲有3秒,導致還未執行取樣器,持續時間已經結束。

此時刪掉固定定時器,運行結果

image

此時有人會有疑問。接口中設置的休眠時間就已經是3秒了,腳本中的持續時間還只是2秒,為什么這次成功執行了呢?

持續時間的設置,只作用于還未執行的取樣器。已經執行的取樣器,無論等待多長時間,都會執行完成。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15214.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(Java面試題分享)萬里長征-03-搜狐

萬里長征-03-搜狐 ? 以下內容基于GPT-4o模型 問題 1.LeetCode103 二叉樹的鋸齒形層序遍歷 103. 二叉樹的鋸齒形層序遍歷 - 力扣(LeetCode) 2.LeetCode5 最長回文子串 5. 最長回文子串 - 力扣(LeetCode) 3.Kafka為何那么快 …

java如何創建Class對象?

請思考一個問題:如果你想在java程序運行時獲得某個類的信息,你會怎么辦? 首先要獲得該類的Class對象,然后才可以通過Class類中的方法來獲得與該Class對象相對應的類的信息。 有3種方法來獲得類的Class對象: 1.用Cla…

【數據結構與算法 | 基礎篇】[棧專題]力扣20,150

1. 力扣20 : 有效的符號 (1). 題 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個…

初學者都能掌握的操作符(中)

(1)位操作符(& | ^) &:(按二進制位“與”) 也就是兩個數的每一位二進制數按照 “與” 的算法,如下: int a 3 ,b 5 ; c a & b; 我們首先寫出a和b的二進…

退格(刪除)鍵

題目描述 用 來表示退格鍵,遇到 來表示退格鍵,遇到 來表示退格鍵,遇到就刪除上一位字符(如果有) 在鍵盤上從左到右一次輸入一串字符串,請輸出最終字符的個數。注:退格鍵不會出現在最終的剩余字…

5.23.12 計算機視覺的 Inception 架構

1. 介紹 分類性能的提升往往會轉化為各種應用領域中顯著的質量提升,深度卷積架構的架構改進可用于提高大多數其他計算機視覺任務的性能,這些任務越來越依賴于高質量的學習視覺特征。在 AlexNet 功能無法與手工設計、制作的解決方案競爭的情況下&#xf…

如何評價劉強東說“業績不好的人不是我兄弟”

在近日的一次京東管理層會議上,創始人劉強東以不容置疑的口吻表明了對公司文化的堅定態度:“凡是長期業績不好,從來不拼搏的人,不是我的兄弟。”這句話不僅是對那些工作表現不佳的員工的直接警告,也透露出京東在追求業…

three.js能實現啥效果?看過來,這里都是它的菜(08)

在Three.js中實現旋轉動畫的原理是通過修改對象的旋轉屬性來實現的,通常使用渲染循環(render loop)來更新對象的旋轉狀態,從而實現動畫效果。 具體的原理包括以下幾個步驟: 創建對象:首先創建一個需要旋轉…

AIGC-風格遷移-style Injection in Diffusion-CVPR2024HighLight-論文精度

Style Injection in Diffusion: A Training-free Approach for Adapting Large-scale Diffusion Models for Style Transfer-CVPR2024HighLight 代碼:https://github.com/jiwoogit/StyleID 論文:https://jiwoogit.github.io/StyleID_site/ 為了解決風格遷…

python3.12虛擬環境下ModuleNotFoundError: No module named ‘distutils‘的解決辦法

python3.12下面venv虛擬環境,安裝pwntools,運行Ropgadget提示:ModuleNotFoundError: No module named distutils’的解決辦法 (py3xt) :~/py3/bin$ ROPgadget Traceback (most recent call last):File "/home/a24/py3xt/bin/ROPgadget…

你真的會使用Vue3的onMounted鉤子函數嗎?Vue3中onMounted的用法詳解

目錄 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2與Vue3的onMounted對比 1.3、vue3中onMounted的用法 1.3.1、基礎用法 1.3.2、順序執行異步操作 1.3.3、并行執行多個異步操作 1.3.4、執行一次…

Rust腐蝕怎么用服務器一鍵開服聯機教程

1、進入控制面板 首次登陸需要點擊下方重置密碼,如何再點擊登錄面板,點擊后會跳轉到登錄頁面,輸入用戶名和密碼登錄即可 2、設置游戲端口 由于腐蝕的設置需要三個端口,它們用于游戲端口(必須為首選端口)&a…

jenkins 部署golang 應用到k8s與測試環境

1.宿主機安裝jenkins 不要用docker 為什么:docker jenkins你只有jenkins, 你想做golang編譯的情況,它的鏡像里面缺少go環境。 而宿主機安裝的情況,jenkins是可以通過環境變量修改來訪問宿主機里面安裝的內容。 2.插件 // docke…

FFMPEG 解碼過程初步學習

1. 視頻文件解碼過程 解碼過程 步驟如下: 視頻文件(封裝格式,MP4/FLV/AVI 等)獲取視頻格式信息等解復用為Stream 流, 準備解碼用的Codec將Stream 流 使用解碼器解為Raw 格式針 1.1 音視頻格式填充: int…

找不到msvcr110.dll無法繼續執行代碼的原因分析及解決方法

在計算機使用過程中,我們經常會遇到一些錯誤提示,其中之一就是找不到msvcr110.dll文件。這個錯誤通常發生在運行某些程序或游戲時,系統無法找到所需的動態鏈接庫文件。為了解決這個問題,下面我將介紹5種常見的解決方法。 一&#…

Vue3實現上傳照片以及回顯

Vue3實現上傳照片以及回顯 一、安裝Element Plus二、案例1、基本示例 三、進階案例1、代碼2、代碼解釋1、上傳接口展示2、查詢接口展示組件屬性 3、效果展示 一、安裝Element Plus 使用 Element Plus 組件庫來實現上傳照片和回顯同樣很簡單,你可以按照以下步驟進行…

用棧實現隊列(C語言)

目錄 題目題目分析 代碼棧的實現結構體。棧的初始化棧的銷毀 入棧刪除查找頂部數據判空 答案結構體初始化插入數據刪除數據獲取隊列開頭元素判空銷毀棧 題目 題目分析 鏈接: 題目 請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(push、po…

數據庫查詢中——having與where的用法

數據庫查詢中——having與where的用法 HAVING 子句在 SQL 中主要用于與 GROUP BY 子句一起使用,以過濾聚合函數的結果。當你使用 GROUP BY 對數據進行分組,并希望基于這些分組后的數據進一步過濾時,你會使用 HAVING 子句。 HAVING 子句通常與…

pyside6下沒有designer.exe、pyside6-uic.exe等

使用conda安裝的pyside6(conda install pyside6),發現pyside6目錄下沒有designer.exe、pyside6-uic.exe等;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安裝…

企業內網自建yum源 倉庫 | rsync同步方案

文章目錄 1.背景概述2.獲取軟件文件2.1 準備同步腳本如下 2.2 準備例外文件清單2.3 統計源端大小2.3 運行腳本開始同步文件 3. 創建網頁服務3.1 安裝nginx并啟用3.2 修改ngnix配置文件 4 創建repo索引和客戶文件4.1 創建repo索引4.2 創建客戶端文件4.3 客戶端下載repo文件 1.背…