当前位置: 首页 > news >正文

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秒,为什么这次成功执行了呢?

持续时间的设置,只作用于还未执行的取样器。已经执行的取样器,无论等待多长时间,都会执行完成。

 

相关文章:

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 次操作&#xf…...

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的数组&#xff0c;问对一段区间添加等差数列后的最大的第 k 大是多少 思路 通过观察题目可以发现答案的范围符合单调性&#xff0c;因此我们可以考虑二分…...

2024年蓝桥杯B组C++——复盘

1、握手问题 知识点&#xff1a;模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手&#xff0c;仅需要两两握手&#xff0c;也就是从42个握手开始&#xff0c;而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…...

微调Llama3实现在线搜索引擎和RAG检索增强生成功能

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

【软件工程】【23.04】p1

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

Flutter 中的 ColoredBox 小部件:全面指南

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

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 12.【中等】整数转罗马数字151.【中等】反转字符串中的单词6.【中等】Z 字形变换68.【困难】文本左右对齐167.【中等】两数之和 II - 输入有序数组 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您…...

SwiftUI中AppStorage的介绍使用

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

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…...

知识点总结

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

Python并发与异步编程

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

动态内存管理—C语言通讯录

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

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

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

win32-鼠标消息、键盘消息、计时器消息、菜单资源

承接前文&#xff1a; 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&#xff1a;Self-Supervised Image Retrieval with Open-Ended Instructions MagicLens: 自监督图像检索与开放式指令 作者&#xff1a;Kai Zhang&#xff0c; Yi Luan&#xff0c; Hexiang Hu&#xff0c; Kenton Lee&#xff0c; Siyuan Qiao&#xff0c; Wenhu …...

[9] CUDA性能测量与错误处理

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

Java学习四

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

Vue 父组件使用refs来直接访问和修改子组件的属性或调用子组件的方法

步骤 1: 在子组件中定义要被修改的属性或方法 首先&#xff0c;在子组件中定义你想要父组件能够修改或调用的属性或方法。例如&#xff0c;我们有一个名为MyChildComponent的子组件&#xff0c;它有一个名为childData的数据属性和一个名为updateData的方法。 // 子组件 MyChi…...

范罗士、希喂、安德迈爆款宠物空气净化器哪款好?深度对比测评

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