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

在控制器中加入下面代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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,完全不需要写那么复杂的数学表达式~~~

转自:http://www.cnblogs.com/lzlfighter/p/5731300.html

Jmeter实现百分比业务比例的更多相关文章

  1. canvas制作原生的百分比圆形比例等

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. JMeter性能测试中控制业务比例

    性能测试混合场景中,我们需要组合多个业务操作到场景中来.比如有一个论坛的业务分布如下:发布新帖与回复帖子的比例为2:3,那么我们在JMeter测试计划中如何控制其比例呢? 可以通过以下两种方式解决:多 ...

  3. jmeter通过if控制器控制业务比例

    以发帖,看帖,回帖三个事物为例,这里就10个用户跑10次,进行测试下: 可以看到看帖,回帖,发帖比例是5:3:2,先来说说怎么做到的,就是通过if控制器,分别来看下几个控制器的内容, 看帖(if控制器 ...

  4. 在JMeter测试计划中如何控制业务比例

    作者:Selingchen 来源:CSDN 原文:https://blog.csdn.net/selingchen/article/details/47844375

  5. jmeter-控制业务比例

    方式一: 多线程组 缺点:由于各事务相应时间一般不一致,故只能粗略的控制业务占比 实例:待补充

  6. (转)使用JMeter对秒杀示例进行性能测试

    背景 秒杀是我们ServiceComb开源团队以领域驱动设计(DDD)为背景,从零开始构建一个微服务架构的示例项目:在<秒杀开发历程>系列博文中提到它作为一个高并发压力场景的应用,采用了C ...

  7. 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能测试场景设计

    说明: 本文是基于虚拟机环境配置设计的 性能测试需求 总tps≥100 每个业务的rt<500ms 持续稳定跑50万业务量 单场景 目的:找到单场景的性能问题,为容量场景提供参考,如果低于容量场 ...

  8. 五. SpringCloud服务降级和熔断

    1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...

  9. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

随机推荐

  1. 如何加快Vue项目的开发速度

    如何加快Vue项目的开发速度 本文摘自奇舞周刊,侵权删. 现如今的开发,比如内部使用的管理平台这种项目大都时间比较仓促.实际上来说,在使用了webpack + vue 这一套来开发的话已经大大了提高了 ...

  2. JavaScript仿淘宝实现放大镜效果的实例

    我们都知道放大镜效果一般都是用于一些商城中的,列如每当我们打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大镜的效果.在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是 ...

  3. Bootstrap 过渡效果

    <!DOCTYPE html> <html <!DOCTYPE html> <html lang="en"> <head> & ...

  4. bi包

    闭包是函数式编程的概念 闭包的定义:由函数极其封闭的自由变量组成的集合体. 其实每一个函数都是一个闭包 特点:函数中嵌套函数. 在返回的时候不仅返回函数本身,而且返回内部函数的值,关键词‘释放’ 闭包 ...

  5. Ubuntu如何安装谷歌Chrome浏览器

    这里提供一个Ubuntu安装谷歌浏览器的简单方法. 1. 下载谷歌浏览器安装包 wget https://dl.google.com/linux/direct/google-chrome-stable ...

  6. 【Nginx】缓存配置

    1.如何配置基本缓存设置 开启简单的缓存配置,只需要两个指令:proxy_cache_path和proxy_cache.proxy_cache_path配置缓存的存放地址和其他的一些常用配置,prox ...

  7. SpringBoot使用Swagger2搭建强大的RESTful API 文档功能

    swagger用于定义API文档. Swagger2的使用 Maven Plugin添加Swagger2相关jar包 <!--swagger2 start--> <dependenc ...

  8. feign学习

    feign集成了ribbon,只需要新建接口加注解即可 <!--feign相关--> <dependency> <groupId>org.springframewo ...

  9. sql中简单的触发器功能

    触发器分为DML触发器和DDL触发器DML触发器包含After触发器,执行insert update delete语句后会触发after触发器,会事务回滚DML触发器还包含instead of触发器, ...

  10. <自动化测试>之<selenium API 查找元素操作底层方法>

    搜罗了一些查找元素的除标准语句外,另外的语句使用方法,摘自 开源中国 郝云鹏driver = webdriver.Chrome(); 打开测试页面 driver.get( "http://b ...