Jmeter多个请求按照比例并发压测的几种方式

🍅 视频学习:文末有免费的配套视频可观看

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快

一、需求

在压测的过程中,为了能够压测整个链路,通常需要多个接口进行并发, 每个接口的请求比例不尽相同。

比如此时此刻,我在写博客,很多人在浏览博客,或者点赞、评论博客等等等,这些行为占比是不同的。

那么,我们怎么才能尽可能的模拟线上真实场景,对每个接口按照比例并发呢?

实现方法如下:

二、实现方法

设定一个用作讲解的并发场景:

比如,同一时刻,点赞博客的请求占比10%,查看博客的请求占比90%,比例是1:9。

1、对每个请求设置循环次数。

如上场景,我们可以为查看博客的请求设置循环次数为9。

右击【查看】请求→【插入上级】→【逻辑控制器】→【循环控制器】→【循环次数】设置为9→【运行】→【查看结果树】

在这里插入图片描述
在这里插入图片描述
在请求的名称后面加上这个参数,就可以看到请请求的顺序:${__counter(true,i)}

${__threadNum}:统计线程数

${__counter(true,i)}:只统计该用户的迭代次数,

${__counter(false,i)}:统计所有用户的迭代次数,

KaTeX parse error: Expected group after '_' at position 2: {_̲_threadNum}_{__counter(true,i):统计每个线程下,每个用户的迭代次数。

在这里插入图片描述
在这里插入图片描述

可以看出,【点赞】请求执行了1次,【查看】请求执行了9次

2、通过switch controller来实现实现

switch controller类似于程序中的switch函数,该Controller根据给定的值n(可以使用参数)选择执行其下的第n个子节点。

Jmeter取样器按顺序编号,第一个取样器(请求)编号为0,第二个为1,以此类推。

如果指定的编号超出了下面的节点数或者不指定,则运行第0个取样器。

如上例,我们给定的值n应该是{0,1,1,1,1,1,1,1,1,1};

0代表执行第一个取样器,也就是其下的第一个子节点——【点赞】请求; 1代表执行第二个取样器,也就是其下的第一个子节点——【查看】请求。

为了更符合线上实际场景,我们用一个random随机数来控制请求的执行顺序,而不是像方法1那样顺序执行。

操作步骤如下:

①添加BeanShell 取样器及脚本

右击【线程组】→【添加】→【取样器】→【BeanShell 取样器】→添加如下脚本

在这里插入图片描述
在这里插入图片描述

import java.util.Random;
//设置比例为1:9
int[] values = {0,1,1,1,1,1,1,1,1,1};
//利用random随机函数来按照比例随机执行http请求
int size = values.length;
Random rd = new Random();
int n = rd.nextInt(size-1);
System.out.println("value:"+values[n]);
//新建参数"SWITCH_VALUE",并将通过随机函数得到的取样器赋值给参数
vars.put("SWITCH_VALUE",String.valueOf(values[n]));

②添加Switch控制器

右击【线程组】→【添加】→【逻辑控制器】→【switch 控制器】→设置控制变量,即上一步脚本里设置的参数“SWITCH_VALUE”→运行线程组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出,我们共10条请求,【点赞】1条,【查看】9条。与我们最初设置的1:9的比例一致。

3、通过自定义随机变量+if控制器来实现

如上场景,我们可以通过Java脚本自定义一个min-max的随机数,然后用if控制器来控制发送哪个请求。

如上场景,点赞与查看是1:9,我们可以定义一个生成1-10的随机数,用if控制器来控制,if 随机数=1,则执行【点赞】请求,if随机数>1,则执行【查看】请求。

具体步骤如下:

①自定义随机变量

选择线程组→【添加】→【取样器】→【Java请求】 (因为要写Java脚本,所以需要先添加Java请求,在Java请求下添加取样器)

在这里插入图片描述
选择【Java请求】→【添加】→【前置处理器】→【BeanShell PreProcessor】→添加 设置自定义变量的脚本,生成随机数【randNo】

在这里插入图片描述
在这里插入图片描述

//.......自定义随机数的方法一........import java.util.Random;
class JmeterUtil{public static int getRandNo(int min,int max){Random random = new Random();int randNo = random.nextInt(max)%(max-min+1) + min;return randNo;}
}
int r = JmeterUtil.getRandNo(1,10);
vars.put("randNo",r.toString());//.......自定义随机数的方法二........
vars.put("randNo","${_Random(1,10)}"); 

②为每个请求添加if控制器,来控制比例

右击【点赞】/【查看】请求→【插入上级】→【逻辑控制器】→【如果(If)控制器】→添加随机数【randNo】的判断

在这里插入图片描述
在这里插入图片描述

在这里要注意,这里只能填一个变量来作为判断条件,而不能直接填【${randNo}=1】,这样if控制器是无法解析的,所以,我们要内置jexl3函数来实现表达式的计算。

步骤如下:

点击【工具】→选择【函数助手对话框】→选择【jexl3】函数→将表达式填入函数参数的【值】那一列→点击【生成】→点击生成的函数即可复制→将复制的函数表达式粘贴在if的判断条件框里

在这里插入图片描述
这里是点赞的if控制器,点赞的比例是1,所以我们的判断条件为randNo==1。

在这里插入图片描述
在这里插入图片描述
【查看】请求的if控制器设置同上,只是判断表达式由【&{randNo}==1】改为【&{randNo}>1】

运行结果如下:

在这里插入图片描述

可以看出,比例基本一致,【点赞】请求有2个,【查看】请求有8个,随机数不是10个数一定是1-10都会出现,所以会出现这种2:8的现象,压测过程中请求较大,故比例偏差是微乎其微的,可忽略。

4、使用JMeter内置随机数+if控制语句来实现

具体步骤:

①右击线程组→【添加】→【配置元件】→【Random Variable】→设置变量名称、随机范围

在这里插入图片描述
在这里插入图片描述
为每个请求添加if控制器的方法同方法三中的步骤一样,连变量名都一样,原样操作即可。

在这里插入图片描述

三、各种方法的优缺点

1、对每个请求设置循环次数。

优点: 操作简单易于实现

缺点: 只能顺序执行,无法随机执行

2、通过switch controller来实现实现

优点:

可以随机执行

缺点:

如果接口较多,比例偏差较大,设置起来比较费劲,例如2:10:88,数组里是2个0,10个1,88个2。

因为每次都要读一遍BeanShell 取样器,严重影响性能,使结果偏离现实。

3、通过自定义随机变量+if控制器来实现

优点:

可拓展性高,可以根据需求用脚本实现,

缺点:

学习成本高,不适宜新手

性能低,没执行一次,都要先执行下这个Java脚本

4、使用JMeter内置随机数+if控制语句来实现

优点:

易上手,操作简单

性能高,因为用的是JMeter内置随机数,所以比方法3性能更高一些。

缺点:

可拓展性差,不能根据特殊需求控制随机变量的随机性,只能设置一个随机区间。

所以,根据经验,方法4是最适用大众的按比例压测的方法。

同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看。

【2024最新版】Python自动化测试15天从入门到精通,10个项目实战,允许白嫖。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28205.shtml

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

相关文章

Markdown如何分页操作

Markdown导出分页操作 在平时的文档导出过程中Markdown过程中会出现因为不能分页导致的排版问题。 排版问题在将Markdown文档导出为PDF或其他格式时尤为明显。当文档内容超过一页时,无法自动调整页面布局,导致内容不连续,甚至导致图片或表格…

【每日刷题】Day66

【每日刷题】Day66 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 小乐乐改数字_牛客题霸_牛客网 (nowcoder.com) 2. 牛牛的递增之旅_牛客题霸_牛客网 (nowcoder.com)…

预编译、函数变量提升

函数声明会覆盖变量的声明,也就是会提升到最前面。 形参传进来相当于变量声明,所以当有函数声明时,会被覆盖。

计算机组成原理之定点加法与减法运算

文章目录 补码的加减法算法的流程与逻辑实现溢出判断溢出原因单符号位判断双符号位(变形补码) 基本的加法/减法器舍入方法习题 补码的加减法 数用补码表示,符号位参与运算 考虑几个问题? 1.实际操作能否只取决于操作码&#xff1f…

python-求分数序列和

[题目描述]: 输入: 输入一行一个正整数n(n≤30)。输出: 输出一行一个浮点数,表示分数序列前n 项的和,精确到小数点后4位。样例输入1 2 样例输出1 3.5000 来源/分类(难度系数:一星)…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读: 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议(SpatialDI 2024)于 2024 年 4 月 25 日- 27 日在南京圆满召开,主题为“ AGI 时代下的空间数据智能”,旨在深入推动空间数据智能研究的理论进步与应…

模型实战(23)之 yolov10 使用总结及训练自己的数据集

yolov10 使用总结及训练自己的数据集 0. yolov10 原理分析 此处参考:https://blog.csdn.net/CVHub/article/details/139204248论文:https://arxiv.org/pdf/2405.14458源码:https://github.com/THU-MIG/yolov10 论文原理分析: 创新: 双标签分配策略 众所周知,标签分配策略…

【嵌入式DIY实例】-Nokia 5110显示DS3231 RTC数据

Nokia 5110显示DS3231 RTC数据 文章目录 Nokia 5110显示DS3231 RTC数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印在诺基亚 5110 …

STM32学习 BKP

BKP就是备份寄存器的意思,听名字就知道它的作用就是用来备份数据的。下面是手册当中的描述。备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域 里,当VDD电源被切断,他们仍然由VBAT维持供电。当…

【JavaEE精炼宝库】多线程(6)线程池

目录 一、线程池的概念及优势 1.1 线程池的概念: 1.2 线程池的优势: 二、工厂模式 三、标准库中的线程池 3.1 标准库线程池参数解释: 3.1.1 corePoolSize | maximumPoolSize: 3.1.2 keepAliveTime | unit: 3.1…

记一次全设备通杀未授权RCE的挖掘经历

想来上一次挖洞还在一年前的大一下,然后就一直在忙活写论文,感觉挺枯燥的(可能是自己不太适合弄学术吧QAQ),所以年初1~2月的时候,有空的时候就又会挖一挖国内外各大知名厂商的设备,拿了几份思科…

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…

SpringBootWeb 篇-入门了解 Spring Cache 、Spring Task 与 WebSocket 框架

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Spring Cache 概述 1.1 Spring Cache 具体使用 1.1.1 引入依赖 1.1.2 Spring Cache 相关注解的介绍 2.0 Spring Task 概述 2.1 cron 表达式 2.2 Spring Task 使用…

基于微信公众号开发h5的前端流程

1.首先公众号进行配置,必须要https域名 还有个txt文件,有弹框提示需要下载放在服务器上 前端处理code的代码封装 // 微信公众号授权 export function wxAuthorize(calback) {// 非静默授权,第一次有弹框 这里的回调页面就是放在服务器上微信…

MFC工控项目实例之五CFile类读写系统参数

承接专栏《MFC工控项目实例之四在调试目录下创建指定文件夹》 实时保存输入的iPlotX坐标轴最小值、最大值到CFG.PAR文件,打开界面从CFG.PAR文件中实时读取保存的最小值、最大值在编辑框中显示。 1、SEAL_PRESSURE.h中添加代码 class CSEAL_PRESSUREApp : public CW…

我主编的电子技术实验手册(07)——串联电路

本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…

大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程

最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程 测试环境:apachePHP7.3MySQL5.7 源码免费下载地址抄笔记 (chaobiji.cn)

C++前期概念(重)

目录 命名空间 命名空间定义 1. 正常的命名空间定义 2. 命名空间可以嵌套 3.头文件中的合并 命名空间使用 命名空间的使用有三种方式: 1:加命名空间名称及作用域限定符(::) 2:用using将命名空间中某个成员引入 3:使用using namespa…

代码随想录算法训练营第六十二天 | 739.每日温度、496.下一个更大元素 I、503.下一个更大元素II

739.每日温度 文字讲解:代码随想录 视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili 解题思路 思路一:暴力双循环 O(n^2) 思路二:单…

ICML24麻省理工提出使用更少的条件独立性测试来发现因果关系新方法

【摘要】众多科学领域的核心问题围绕着理解因果关系这一基本问题。然而,大多数基于约束的因果发现算法,包括广受欢迎的PC算法,通常会进行指数级数量的条件独立性(CI)测试,在各种应用中造成局限。为解决这一问题,我们的工作重点是表征在减少CI测试数量的情况下,可以了解潜在因果…