jmeter线程组(下篇)

news2024/11/18 1:25:11

 

线程组

 

线程组作为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.coloradmin.cn/o/1687788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一次IDEA升级版本导致Lombok注解失效问题

IDEA升级导致Lombok注解失效问题 环境 我本机项目原来的运行环境和软件版本: IDEA 2021JDK 1.8Maven 3.5.4springboot 2.2.6.RELEASEspring-cloud Hoxton.SR9 为了体验更好我就把IDEA版本从2021.2升级到了2024.1版本,反正现在是有最新版本我就一直在…

SpringBoot2.0.x旧版集成Swagger UI报错Unable to infer base url...解决办法

一、问题描述 1.1项目背景 SpringBoot2.0.9的旧版项目维护开发,集成Swagger-ui2.9.2无法访问的问题。不用想啊,这种老项目是各种过滤器拦截器的配置,访问不到,肯定是它们在作妖。懂得都懂啊,这里交给大家一个排错的办…

企业防泄密软件有哪些,哪个排名最好

机密数据的泄密对于企业而言,已成为最大的信息安全威胁之一。近年来企业面对的最大威胁来自于内部,以利益为出发点的互联网信息犯罪及案件,在世界各地不断传出,因此,信息保护与管控将逐渐成为企业信息安全重点部署项目…

解决arduino安装stm32duino开发板库时下载慢下载不了的问题

解决arduino安装stm32duino开发板库时下载慢下载不了的问题,安装其他开发板也可以使用类似的方法。 在利用arduino进行stm32开发的时候,需要安装对stm32开发板支持的库,但是正常情况下,由于网络问题,安装的时候容易出…

双边滤波去雾算法

目录 1. 简介 2. 步骤 3. 优点 4. 代码 5. 运行结果 1. 简介 本文介绍了双边滤波图像去雾算法,旨在消除雾霾对图像质量的影响,能够保留边缘信息并去除噪声,有效提高图像的清晰度和对比度。双边滤波(Bilateral Filtering&…

【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署

【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署 SaaS 模式的云 HIS 更适用于基层医疗机构,而传统的 HIS 已经在大中型医疗机构大规模应用。过去,国内的大中型医疗机构投入了大量的资金来进行信息化系统建设…

esp32(8266)如何在platformio中上传文件到单片机

本来认为这是基础内容,不用我来介绍,结果,在个人的单片机字库开源项目 GitHub - StarCompute/tftziku: 这是一个通过单片机在各种屏幕上显示中文的解决方案 中有两个人问到了,就特别来说明一下: 在platformio中新建一…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

爱因斯坦CG大揭秘:从“纸片人”到“数字巨星”

AMV BBDO和Smart Energy GB携手&#xff0c;他们不仅是为了推广一个产品&#xff0c;更是为了传达一种理念。他们委托了业界翘楚The Mill&#xff0c;以精湛的技术与创意&#xff0c;打造了一个超越现实的数字形象——爱因斯坦。 这个逼真的CG形象&#xff0c;不仅是对科学巨匠…

python写页面自动截图

from selenium import webdriver def take_screenshot(url, file_path):driver webdriver.Chrome()driver.get(url)driver.save_screenshot(file_path)driver.quit() if __name__ __main__:take_screenshot(http://baidu.com, D:\桌面\wang.png)要安装selenium还要安装google…

Java编程语言,使用自定义二元组对象替代map集合实现Key-Value格式的数据存储

一、背景 url请求地址&#xff0c;后面使用&把多个请求参数拼接起来&#xff0c;例如&#xff1a;?p1v1&p2v2&p3v3 它们的key分别是p1/p2/p3&#xff0c;对应的value分别是v1/v2/v3。 也许很多人都会通过map集合来存储&#xff0c;算比较通用的做法了&#xff1…

「Safari浏览器使用new Date() 显示NAN」

一、问题描述 &#x1f951; &#x1f914;️ 项目中用 new Date&#xff08;&#xff09;展示时间&#xff0c;在谷歌浏览器上显示正常&#xff0c;但是在Sarfari浏览器上显示NAN 1、代码部分 &#x1f353;&#x1f353;&#x1f353;&#x1f353; 2、Chrome浏览器 &#…

Dijkstra算法求最短路径 c++

目录 【问题背景】 【相关知识】 【算法思想】 【算法实现】 【伪代码】 【输入输出】 【代码】 【问题背景】 出门旅游&#xff0c;有些城市之间有公路&#xff0c;有些城市之间则没有&#xff0c;如下图。为了节省经费以及方便计划旅程&#xff0c;希望在出发之前知道…

集合、Collection接口特点和常用方法

1、集合介绍 对于保存多个数据使用的是数组&#xff0c;那么数组有不足的地方。比如&#xff0c; 长度开始时必须指定&#xff0c;而且一旦制定&#xff0c;不能更改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素的示意代码&#xff0c;也就是比较麻烦。 为…

必应bing国内广告开户首充和开户费是多少?

微软必应Bing作为国内领先的搜索引擎之一&#xff0c;其广告平台凭借其精准的投放、高效的数据分析和广泛的用户覆盖&#xff0c;已成为众多企业的首选。 根据最新政策&#xff0c;2024年必应Bing国内广告开户预充值金额设定为1万元人民币起。这一调整旨在确保广告主在账户初始…

奥德彪的幸福VS码农的幸福

奥德彪的幸福 非洲国家布隆迪是一个全球最不发达国家之一&#xff0c;大部分居民以农业为生&#xff0c;其中包括香蕉&#xff0c;人们拿香蕉用来做饭也用来酿酒。 香蕉产地距离布隆迪首都布琼布拉很远&#xff0c;而这个国家又缺乏规模化的物流企业&#xff0c;于是就诞生了…

如何用java做一个模拟登录画面

要求&#xff1a; 实现registerAction方法中的注册逻辑。实现login方法中的登录逻辑&#xff0c;确保只有当用户名和密码都正确时才返回true。实现好友管理功能&#xff0c;包括添加好友、删除好友、查看好友列表。确保所有的文件操作&#xff08;如读取和写入credentials.txt…

Java类

一.什么是类&#xff1f; 在src文件夹下面用一个Text类&#xff0c;这个Text就是这一个类的类名&#xff0c;所以说&#xff0c;一个Java文件里面就存在一个类&#xff0c;&#xff08;在Java中有一个习惯&#xff0c;一个Java文件里面&#xff0c;只写一个类&#xff09;。 &…

SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展

业务层开发 对于业务层的制作有个误区 Service层接口定义与数据层接口定义具有较大差别 不要混用 业务层接口关注的是业务名称 数据层接口关注的是数据层名称 操作是不难 但是有些东西还是要掌握的 业务层接口如果是业务方法 就按照业务名称来代替 如果是数据操作 直接用…

pytorch文本分类(四)模型框架(模型训练与验证)

关卡四 模型训练与验证 本文是在原本闯关训练的基础上总结得来&#xff0c;加入了自己的理解以及疑问解答&#xff08;by GPT4&#xff09; 原任务链接 目录 关卡四 模型训练与验证1. 训练1.1 构建模型结构1.2 模型编译1.3 模型训练1.4模型超参数调试 2. 推理2.1 模型准确性…