JMeter多个请求按照比例并发的几种方式
一、需求
在压测的过程中,为了能够压测整个链路,通常需要多个接口进行并发, 每个接口的请求比例不尽相同。
比如此时此刻,我在写博客,很多人在浏览博客,或者点赞、评论博客等等等,这些行为占比是不同的。
那么,我们怎么才能尽可能的模拟线上真实场景,对每个接口按照比例并发呢?
实现方法如下:
二、实现方法
设定一个用作讲解的并发场景:
比如,同一时刻,点赞博客的请求占比10%,查看博客的请求占比90%,比例是1:9。
1、对每个请求设置循环次数。
如上场景,我们可以为查看博客的请求设置循环次数为9。
右击【查看】请求→【插入上级】→【逻辑控制器】→【循环控制器】→【循环次数】设置为9→【运行】→【查看结果树】


在请求的名称后面加上这个参数,就可以看到请请求的顺序:${__counter(true,i)}
${__threadNum}:统计线程数
${__counter(true,i)}:只统计该用户的迭代次数,
${__counter(false,i)}:统计所有用户的迭代次数,
${__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是最适用大众的按比例压测的方法。
初入职场热爱分享的打工人一枚,请大家多多指教~~

JMeter多个请求按照比例并发的几种方式的更多相关文章
- 获取【请求体】数据的3种方式(精)(文末代码) request.getInputStream() request.getInputStream() request.getReader()
application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型.Servlet API规范中对该类型的请求内容提供了request. ...
- Ajax请求 一般处理程序参数传递的几种方式
//第一种Ajax请求 $.ajax({ type:"GET", //请求类型,有get,post等类型,和表单提交是一样的 url:"Result.aspx" ...
- 解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
众所周知前端向后台发送 post 请求时,必须验证 csrf,否则会报错 403 Forbidden.使用 Django Form 表单可以直接在表单里面添加 {% csrf_token %} 即可, ...
- SpringMVC处理请求释放静态资源的三种方式
方式一 在SpringMVC的配置文件中添加如下语句 <mvc:default-servlet-handler/> 说明:当SpringMVC前端控制器对静态资源进行拦截后,在通过处理器映 ...
- 如何使用jmeter来实现更大批量的并发的解决方案
近期在用JMeter进行负载测试的 时候,发现使用单台机器模拟测试超过比如500个进程的并发就有些力不从心或者说不能如实的反应实际情况,在执行的过程中,JMeter自身会自动关闭, 要解决这个问题,则 ...
- JMeter tomcat测试请求
JMeter tomcat测试请求 Apache Jmeter是开源的压力测试工具,可以测试tomcat 的吞吐量等信息 下载地址: http://jmeter.apache.org/download ...
- JMeter处理jdbc请求后的响应结果
JMeter如果进行JDBC请求,请求后的响应结果如何给下一个请求用(也就是传说中的关联),于是研究了一下,下面将学习的成果做个记录: 1.添加 "JDBC Connection Confi ...
- 转:应用JMeter测试solr请求
使用JMeter测试solr请求 一.安装JMeter 在官网http://jmeter.apache.org/download_jmeter.cgi下载JMeter 直接解压JMeter安装包 Li ...
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...
随机推荐
- 【机制】JavaScript的原型、原型链、继承
1.原型和原型链的概念 js在创建一个对象时,比如叫 obj,都会给他偷偷的加上一个引用,这个引用指向的是一个对象,比如叫 yuanxing, 这个对象可以给引用它的对象提供属性共享,比如:yuanx ...
- istio kiali 亲和性调度
一.节点调度 在开始 kiali 亲和性调度之前,先演示一个简单的例子介绍 pod 选择调度到指定 node: 节点打标 使用命令查看当前所有 k8s 节点: [root@k8s-master ~]# ...
- linux seccomp使用和原理
linux seccomp使用和原理 概要 linux的沙箱机制,可以限制进程对系统调用的访问,从系统调用号,到系统调用的参数,都可以检查和限制 有两种模式 SECCOMP_MODE_STRICT, ...
- Azure Databricks 第二篇:pyspark.sql 简介
pyspark中的DataFrame等价于Spark SQL中的一个关系表.在pyspark中,DataFrame由Column和Row构成. pyspark.sql.SparkSession:是Da ...
- (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇
本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...
- DTCC 2020 | 阿里云李飞飞:云原生分布式数据库与数据仓库系统点亮数据上云之路
简介: 数据库将面临怎样的变革?云原生数据库与数据仓库有哪些独特优势?在日前的 DTCC 2020大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部总裁.ACM杰出科学家李飞飞就<云原生分布式数 ...
- Java虚拟机常用的性能监控工具
基础故障处理工具 jps: 虚拟机进程状况工具 功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID. 它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到 ...
- session、cookie、token的区别
从安全性优先级来说: 1.优先级 Cookie<session<token 2. 安全性 Cookie: ①cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺 ...
- 从一次生产消费者的bug看看线程池如何增加线程
0 背景 某个闲来无事的下午,看到旧有的项目中,有个任务调度的地方都是同步的操作,就是流程A的完成依赖流程B,流程B的完成依赖流程C,按此类推. 作为一名垃圾代码生产者,QA的噩梦.故障报告枪手的我来 ...
- ctfhub技能树—sql注入—UA注入
手注 打开靶机 查看页面信息 抓取数据包 根据提示注入点在User-Agent文件头中 开始尝试注入 成功查到数据库名 查询数据表名 查询字段名 查询字段信息 成功拿到flag 盲注 测试是否存在时间 ...