Jmeter实现百分比业务比例
来源:互联网 发布:淘宝买家评价多久清空 编辑:程序博客网 时间:2024/05/16 13:38
Jmeter实现百分比业务比例
相较于LoadRunner,jmeter在复杂场景方式貌似略有欠缺。前一段时间,想实现一个功能,如有两个采样器a与b,a采样器与b采样器被执行的概率分别为1/4与3/4,那么应该怎么实现呢?
在网上找了下资料,发现网上大多都是三种做法:
1.多线程方式,比如a采样器用20个线程,b线程用60个线程,这样比例即为1:3
但是这样会产生一个问题,若按照时间维度执行,均执行10min,a采样器与b采样器的response时间不一样,那么在这段时间内a与b的请求数无法做到1:3
2.jmeter自带一个计算函数,使用该函数则可达到效果。
简述一下该控制器的功能,这个控制器为每个请求计数,相当于给了他一个编号。
当参数为true时,每个用户有自己的计数器,比如10个线程组,100个loop,这是计数器的值为1-100.
当选择false,全局计算器,10个线程组,100个loop,计数器值为1-10000
那么想使用1:3的比例时,则使用一个if控制器。
条件分别为 ${__counter(true,)}%4==0 与${__counter(true,)}%4!=0
详见http://blog.csdn.net/selingchen/article/details/47844375
3.使用JSR223 Sampler + Groovy
在控制器中加入下面代码
int
[] values = (
int
[])vars.getObject(
"RANDOM_VALUES"
);
if
(values==
null
) {
values = [
0
,
1
,
2
,
3
,
2
,
3
,
1
,
3
,
2
,
3
] as
int
[];
vars.putObject(
"RANDOM_VALUES"
,values);
}
// Increment that will be used in SwitchController value will be between 0 and 2
// because there are 3 TCs
Integer increment = (Integer)vars.getObject(
"INCREMENT"
);
if
(increment==
null
) {
increment = Integer.valueOf(
0
);
}
else
{
increment = Integer.valueOf((increment.intValue()+
1
)%values.length);
}
String value = Integer.toString(values[increment.intValue()]);
vars.put(
"SWITCH_VALUE"
, value);
vars.putObject(
"INCREMENT"
, increment);
SampleResult.setResponseData(
"SWITCH_VALUE from inside:"
+value,
null
);
return
"SWITCH_VALUE:"
+value;
相当于每次都在给RANDOM_VALUES数组遍历,依次取里面的值,然后用if控制器判断,达到实现百分比的效果。
详见:http://www.oschina.net/translate/jmeter-control-percentage-of-sampler?cmp
针对上面三种方式进行比较:
方案一不用说,有时候达不到百分比分发请求的效果,为下策。
方案三经过试验,有一个很大的缺点,采用的是采样器,消耗就较大。尤其是遇到更加复杂的场景,比如有a,b两个场景,需要用一个JSR223采样器,a场景下面又有一个复合场景,需要按照比例分发请求(这种情况蛮常见的),这时又需要加一个采样器。这样的话,就显得太麻烦,如果用本地的jmeter,不用分布式,可能都会因为开销太大导致压力上不去。
方案二:采用jmeter本身自带的计算器,倒不失为一个好的方法。但是针对一些复杂的场景,这个计算式有点难写,
比如:3:2这个比例,我看到网上的实现都是${__counter(true,)}%2==1||${__counter(true,)}%3==0,
这种计算方式就比较复杂了,那有没有简单一点实现方式呢?
其实是有的。
比如下面场景:
那么表达式应该怎么写呢?
上面有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,完全不需要写那么复杂的数学表达式~~~
- Jmeter实现百分比业务比例
- 在JMeter测试计划中如何控制业务比例
- 在JMeter测试计划中如何控制业务比例
- CSS百分比padding实现比例固定图片自适应布局
- 计算百分比-比例函数ratio_to_report
- MySQL 优化百分比/比例计算
- 利用padding百分比继承父级元素宽度特性实现元素宽高比例缩放
- 如何根据业务比例设定不同业务的用户比例?
- 用Canvas画占百分比的圆形比例
- rem布局百分比与rem的比例换算
- Java实现百分比
- RelativeLayout实现百分比布局
- java实现百分比
- jquery实现百分比进度条
- 电量百分比实现
- css实现百分比进度条
- Jmeter做简单业务性能测试
- write实现输出百分比&breakpoint
- Vitya and Strange Lesson(01字典树)
- 快速排序-java实现
- 初始CSS
- Java中的回车(\r)和换行(\n)
- 【01】vue.js — 简析入门
- Jmeter实现百分比业务比例
- 用Virtual User Generator 录制
- 京东面试题分析
- 命令模式
- JupyterNotebook配置
- 逆向入门--第一次的HelloWorld
- 字符串问题---字典树(前缀树)的实现
- 链表的增删改
- 解决myeclipse自带maven下载中央仓库插件报403错误的问题(8.6版本不报403)