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、…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...