meter多业务混合场景如何设置各业务所占并发比例
在进行多业务混合场景测试中,需要分配每个场景占比。
具体有两种方式:
1.多线程组方式;
2.逻辑控制器控制;
第一种:
jmeter一个测试计划可以添加多个线程组,我们把不同的业务放在不同的线程组中,通过控制线程数来控制业务占比。比如实际业务中需要线程组A、线程组B和线程组C的比例为:3:2:1,那么我们可以设置线程组A的线程数为90,线程组B的线程数为60,线程组C的线程数为30,这样就可以粗略的达到要求的比例。但是如果三个事务的响应时间不一样,最终完成的业务数也会有所差异。假设当前线程数的响应时间是完全一致的,才会有3:2:1的业务占比,当然这个是理想状态。
例如测试需求如下:对业务A、业务B、业务C、业务D、业务E,5个业务按并发比例要求进行100个用户并发的压力测试;
JMeter是可以实现上述需求的,测试方案如下:
1.创建一个测试计划;
2.在该计划下添加5个线程组,分别是对业务A、业务B、业务C、业务D、业务E;
3.分别设置线程组业务A、业务B、业务C、业务D、业务E的线程数为:40、10、20、25、5(总并发量为100,按并发比例设置并发用户数)
第二种方式:
jmeter的函数对话框中${__counter(True,)}函数获取当前迭代的次数。迭代次数也能获取到,那如何保持3:2的比例呢?这就是一个数学问题了。不卖观子,直接上代码:${__counter(true,)}%2==1||${__counter(true,)}%3==0上面_counter(true,)是获取当前迭代次数,%是取余,也就是是除2余1与3,整除时执行开新帖。以9次迭代为例:回帖9次,1,3,5,6,7,9次迭代时都会开新帖,回帖刚好是6次。9:6=3:2基本上达到了3:2的比例。

方案二:采用jmeter本身自带的计算器,不失为一个好的方法。但是针对一些复杂的场景,这个计算式有点难写,
比如:3:2这个比例,我看到网上的实现都是${__counter(true,)}%2==1||${__counter(true,)}%3==0,
这种计算方式就比较复杂了,那有没有简单一点实现方式呢?
其实是有的。
当参数为true时,每个用户有自己的计数器,比如10个线程组,100个loop,这是计数器的值为1-100.
当选择false,全局计算器,10个线程组,100个loop,计数器值为1-10000
比如下面场景:

那么表达式应该怎么写呢?
上面有3的倍数,5的倍数,那么取其最小公倍数15,按照15分割。
均使用If控制器,表达式分别为:
a: ${__counter(false,)}%15 <=5
b: ${__counter(false,)}%15 >5
c: ${__counter(false,)}%15==1
d: ${__counter(false,)}%15>1&& ${__counter(false,)}%15<=5
总结规律:
按照最小的公倍数分割,每个控制器取他们应占的份数。
上面的3:2的实现手段,就更容易了,一个占2/5,一个占3/5
1、如果每个接口的响应时间都差不多,那么可以通过线程组控制线程数的比例方式,来控制压测比例
2、如果接口的响应时间相差很多,需要通过IF控制器来进行控制
3、jmeter有个参数记录迭代次数 __counter(true,)
4、举例说明:如何我想控制两个接口的比例为1:2,那么可以选择表达式${__jexl3(${__counter(true,)}%3!=1,)} 和${__jexl3(${__counter(true,)}%3==1,)}
如下图所示:
5、测试结果如下所示:
 
如上图所示 test1和test2的比例137/269约等于1:2
====================================================================================================
背景
在进行综合场景压测时,遇到了如何实现不同的请求所占比例不同的问题。
- 有人说将这些请求分别放到单独的线程组下,然后将线程组的线程数按照比例进行配置。
这种方法不是很好,因为服务器对不同的请求处理能力不同,有的处理快,有的处理慢。若采取上述方案的话,并不会按照我们预期的比例进行并发。
那么如何真实模拟按比例进行并发呢?此前使用LR进行过类似场景的测试时的思路如下:
- 每次向服务器发出请求时,先生成一个随机数,我们对随机数的取值划分若干个范围(对应若干个业务请求),然后对随机数进行判断,当随机数落在某个范围内,就可以执行对应的请求。
- 比如,我们压测的过程中,要访问百度和besttest官网,并且请求比例是2:8,那么可以规定随机数取值1<=random<=100,然后再划分2个范围:当随机数的取值在0到20之间,则访问百度;当随机数取值在20和100之间,则访问besttest官网;根据概率论,当取样量足够大的话,访问百度和besttest官网的请求比例会比较接近2:8。
Jmeter也能这样实现吗?答案是肯定的,下面我们使用Jmeter结合刚才的例子进行分解
Jmeter实现(Random)
首先,我们需要一个能够生成随机数的函数,刚好jmeter提供了这个函数
在测试计划下,我们右键“添加”——配置原件——Random Variable

设置随机数的变量名称为num,设置取值范围0到100

添加两个如果(if)控制器,添加控制条件,控制执行请求。
右键线程组添加“逻辑控制器”——如果(if)控制器

然后在两个控制器下,分别添加1个http请求。
当随机数num取值在20和100之间;调用获取图形获取验证码;

添加判断条件,如果当随机数num取值在1和20之间,调用登录接口

添加聚合报告,查看结果

运行jmeter验证,取值是否按照比例请求,我们设置一个线程数,让其循环100次,结果如下,获取图形获取验证码78次,登录接口22次,基本满足我们想要的比例。

可以预见的是当数据量达到一定程度之后,会无限接近设置的2比8的比例。
Jmeter实现(计数器)
计数器可以通过如下方式添加,其他的实现思路一样

后话:
其实在LR中也可以在场景设计里设置不同的请求的比例来实现。但是本文主要是讨论Jmeter的实现思路,所以在前文中没有提及。
本文来自博客园,作者:热爱技术的小牛,转载请注明原文链接:https://www.cnblogs.com/my-blogs-for-everone/articles/12332566.html
 
                    
                     
                    
                 
                    
                
 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号