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

 1、需求

在压测的过程当中,为了可以压测整个链路,一般须要多个接口进行并发, 每一个接口的请求比例不尽相同。java

好比此时此刻,我在写博客,不少人在浏览博客,或者点赞、评论博客等等等,这些行为占比是不一样的。数组

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

实现方法以下:dom

 

2、实现方法

设定一个用做讲解的并发场景:函数

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

 

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

如上场景,咱们能够为查看博客的请求设置循环次数为9。性能

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

 

 

 

在请求的名称后面加上这个参数,就能够看到请请求的顺序:${__counter(true,i)}spa

${__threadNum}:统计线程数线程

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

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

${__threadNum}_${__counter(true,i):统计每一个线程下,每一个用户的迭代次数。

 

 

 

 

 

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

 

 

二、经过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的比例一致。

 

 

三、经过自定义随机变量+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的现象,压测过程当中请求较大,故比例误差是微乎其微的,可忽略。

 

 

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

具体步骤:

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

 

 

 

 为每一个请求添加if控制器的方法同方法三中的步骤同样,连变量名都同样,原样操做便可。

 

 

 

3、各类方法的优缺点

   

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

优势:操做简单易于实现

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

 

二、经过switch controller来实现实现

优势:

能够随机执行

缺点:

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

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

 

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

优势:可拓展性高,能够根据需求用脚本实现,

缺点:

学习成本高,不适宜新手

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

 

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

优势:

易上手,操做简单

性能高,由于用的是JMeter内置随机数,因此比方法3性能更高一些。

缺点:

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

 

因此,

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

 

 

初入职场热爱分享的打工人一枚,请你们多多指教~~

相关文章
相关标签/搜索