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}
-
在测试计划中,添加查看结果树
运行结果
连续运行了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}
-
在测试计划中,添加查看结果树
运行结果
连续运行了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}
-
在测试计划中,添加查看结果树
运行结果
连续运行了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
-
在测试计划中,添加查看结果树
运行结果
连续运行了3次,结果是一致的。3
个用户执行线程组
,各个用户的请求时间分别为2024-04-15 16:12:37 CST
、2024-04-15 16:12:40 CST
、2024-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
-
在测试计划中,添加查看结果树
运行结果
注意看图中右上角-黄色三角形左边的计时器
,值固定在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
-
在测试计划中,添加查看结果树
运行结果
图中结果树中什么都没有,这是因为线程组的持续时间
只有2
秒,但固定定时器
的延迟有3
秒,导致还未执行取样器
,持续时间已经结束。
此时删掉固定定时器,运行结果
此时有人会有疑问。接口中设置的休眠时间
就已经是3
秒了,脚本中的持续时间
还只是2
秒,为什么这次成功执行了呢?
持续时间
的设置,只作用于还未执行的取样器。已经执行的取样器,无论等待多长时间,都会执行完成。
相关文章:

jmeter线程组(下篇)
线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户&#x…...

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL
今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影,顾名思义,该大模型主要是面向写实摄影,一方面生成的图片人物皮肤纹理细节超级逼真,另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…...

Android 13 配置默认DN
需求: 如果存在用户配置的DNS服务器,则切面拦截运行商下发的DNS,替换为用户自己配置的DNS. 实现: 直接上代码: 1:TelephonyProperties 内新增属性保存用户设置的dns //QSSI.13/frameworks/base/telephony/java/com/android/in…...

系统开发与运行知识
系统开发与运行知识 导航 文章目录 系统开发与运行知识导航一、软件工程二、软件生命周期三、开发模型四、开发方法五、需求分析结构化分析 六、数据流图分层数据流图的画法设计注意事项 七、数据字典数据字典的内容 八、系统设计九、结构化设计常用工具十、面向对象十一、UML…...

算法训练 | 二叉树Part1 | 递归遍历、迭代遍历、统一迭代
目录 递归遍历 前序遍历 迭代遍历 前序遍历(迭代法) 中序遍历(迭代法) 后序遍历(迭代法) 统一迭代法 统一迭代 嵌入式学习分享个人主页:Orion嵌入式随想录 - 小红书 (xiaohongshu.com) …...
AcWing 2568:树链剖分 ← 线段树+DFS
【题目来源】https://www.acwing.com/problem/content/2570/【题目描述】 给定一棵树,树中包含 n 个节点(编号 1∼n),其中第 i 个节点的权值为 ai。 初始时,1 号节点为树的根节点。 现在要对该树进行 m 次操作…...

PCIe协议之-DLLP详解
✨前言: 🌟数据链路层的功能 数据链路层将从物理层中获得报文, 并将其传递给事务层; 同时接收事务层的报文, 并将其转发到物理层; 核心的功能有以下三点 1.保证TLP在 PCIe 链路中的正确传递; 2.数据链路层使用了容错…...

Jmeter+prometheus+grafana性能测试
文章目录 Jmeterprometheusgrafana性能测试背景目标设计思路原理案例启发 Jmeterprometheusgrafana性能测试 背景 在现代社会中,人们对于应用程序的响应速度和性能体验提出了越来越高的要求。无论是电子商务网站、社交媒体平台还是企业级软件系统,都…...

Hololens 2 新建自定义按钮
官方链接地址 1、创建Cube 2、添加PressableButton脚本,并点击AddNearin… 3、把Cube拖入到MovingButtonVisuals变量中 4、点击NearInteractionTouchable组件(这个组件是添加和上一个脚本绑定的,自动添加上来的)上的Fix… 5、…...

景源畅信:抖音小店新手小白如何做好运营?
在数字时代的浪潮中,抖音小店成为了众多创业者和商家的新宠。但面对激烈的市场竞争和不断变化的平台规则,新手小白如何才能在抖音小店的海洋里稳健航行,捕捉到属于自己的商机呢?接下来的内容将为你揭晓答案。 一、精准定位,明确目…...

力扣 42. 接雨水 python AC
双指针 class Solution:def trap(self, heights):l, r 0, len(heights) - 1maxl, maxr 0, 0ans 0while l < r:maxl, maxr max(maxl, heights[l]), max(maxr, heights[r])if maxl < maxr:ans maxl - heights[l]l 1else:ans maxr - heights[r]r - 1return ans单调栈…...

The 2022 ICPC Asia Nanjing Regional Contest - External D
G题 赛题补充 D题的题目来源 https://codeforces.com/gym/104128/problem/D 文章目录 题意思路代码 题意 给一个长度为n的数组,问对一段区间添加等差数列后的最大的第 k 大是多少 思路 通过观察题目可以发现答案的范围符合单调性,因此我们可以考虑二分…...

2024年蓝桥杯B组C++——复盘
1、握手问题 知识点:模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手,仅需要两两握手,也就是从42个握手开始,而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结:…...

微调Llama3实现在线搜索引擎和RAG检索增强生成功能
视频中所出现的代码 Tavily SearchRAG 微调Llama3实现在线搜索引擎和RAG检索增强生成功能!打造自己的perplexity和GPTs!用PDF实现本地知识库_哔哩哔哩_bilibili 一.准备工作 1.安装环境 conda create --name unsloth_env python3.10 conda activate …...

【软件工程】【23.04】p1
关键字: 软件模型、提炼、加工表达工具、通信内聚、访问依赖、边界类交互分析、RUP核心工作流、首先测试数据流、软件验证过程、CMMI过程域分类工程类; 软件工程目的、功能需求是需求的主体、结构化方法、耦合、详细设计工具、类、类图、RUP采用用例技…...

Flutter 中的 ColoredBox 小部件:全面指南
Flutter 中的 ColoredBox 小部件:全面指南 在 Flutter 的世界中,ColoredBox 是一个用于填充颜色的简单而强大的小部件。它是一个不透明的矩形,可以用来创建颜色块,作为布局的占位符,或者简单地改变某个区域的背景色。…...

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。
文章目录 12.【中等】整数转罗马数字151.【中等】反转字符串中的单词6.【中等】Z 字形变换68.【困难】文本左右对齐167.【中等】两数之和 II - 输入有序数组 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博客,很高兴能够在这里和您…...

SwiftUI中AppStorage的介绍使用
在Swift中,AppStorage是SwiftUI中引入的一个属性包装器,在这之前我们要存储一些轻量级的数据采用UserDefaults进行存取。而AppStorage用于从UserDefaults中读取值,当值改变时,它会自动重新调用视图的body属性。也就是说࿰…...

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机
概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具,但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此,…...

知识点总结
1、Uboot的流程调用: 1.1、cmd_process函数是怎么被调用到的: cmd_process在common/command.c 1.2、uboot阶段断电,后续起不来,可能要换线去使用,也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…...

Python并发与异步编程
Python的并发与异步编程是两个不同的概念,但它们经常一起使用,以提高程序的性能和响应能力。以下是对这两个概念的详细讲解: 并发编程 (Concurrency) 并发编程是指在程序中同时执行多个任务的能力。Python提供了几种实现并发的机制ÿ…...

动态内存管理—C语言通讯录
目录 一,动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二,通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一,动态内存函数的介绍 1.1 malloc和free void* malloc (…...

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997
问题说明 最近在使用美光EMMC的时候,发现通过芯片丝印查询不到 芯片的规格说明书; 经过查阅资料,发现美光的EMMC芯片 “由于空间限制,FBGA 封装组件具有与部件号不同的缩写部件标记”,需要通过官网查询丝印的FBGA cod…...

win32-鼠标消息、键盘消息、计时器消息、菜单资源
承接前文: win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列 本文目录 键盘消息键盘消息的分类WM_CHAR 字符消息 鼠标消息鼠标消息附带信息 定时器消息 WM_TIMER创建销毁定时器 菜单资源资源相关菜单资源使用命令消息的…...

springboot项目部署到linux服务器
springboot后端 修改前 修改后 vue前端 修改前 将地址中的 localhost改为 ip 重新生成war包 war上传到linux的tomcat的webapps下 其他环境配置和macOS大差不差 Tomcat安装使用与部署Web项目的三种方法_tomcat部署web项目-CSDN博客...

MagicLens:新一代图像搜索技术和产品形态
MagicLens:Self-Supervised Image Retrieval with Open-Ended Instructions MagicLens: 自监督图像检索与开放式指令 作者:Kai Zhang, Yi Luan, Hexiang Hu, Kenton Lee, Siyuan Qiao, Wenhu …...

[9] CUDA性能测量与错误处理
CUDA性能测量与错误处理 讨论如何通过CUDA事件来测量它的性能如何通过CUDA代码进行调试 1.测量CUDA程序的性能 1.1 CUDA事件 CPU端的计时器可能无法给出正确的内核执行时间CUDA事件等于是在你的CUDA应用运行的特定时刻被记录的时间戳,通过使用CUDA事件API&#…...

Java学习四
Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…...

Vue 父组件使用refs来直接访问和修改子组件的属性或调用子组件的方法
步骤 1: 在子组件中定义要被修改的属性或方法 首先,在子组件中定义你想要父组件能够修改或调用的属性或方法。例如,我们有一个名为MyChildComponent的子组件,它有一个名为childData的数据属性和一个名为updateData的方法。 // 子组件 MyChi…...

范罗士、希喂、安德迈爆款宠物空气净化器哪款好?深度对比测评
作为一名深受养猫过敏困扰的铲屎官,我经常提醒新手铲屎官重视家里的空气环境。宠物的浮毛和皮屑不仅会引发过敏,还可能传播细菌和病毒。很多人以为普通空气净化器能解决问题,但这些产品并未针对宠物家庭的特殊需求。经过多次研究和测试&#…...