jmeter-性能混合场景设计

发布时间 2023-04-09 23:56:57作者: 无敌大牛牛

混合场景

不同数量的并发用户数,对不同接口进行性能测试

在多个线程组下,才能控制不同的并发用户数,多个线程组下,挂接口, 才能实现 不同数量的人对不同接口进行性能测试。

  • 跨线程组传参

    • 属性 __setproperty 设置动态属性

      • 使用bean shell后置处理器、JSR223也行

      • 使用调试后置处理程序也行

      • 直接使用调试取样器进行设置也行

      • 设置过属性以后,使用__P或者__property函数来根据属性名称进行获取属性

    • 文件嫁接(保存响应到文本)

    • 数据库嫁接(sqllite数据库)

jmeter多个线程组之间默认是并行执行

因为是并行运行的,比如混合场景中设置了三个线程组,依次是从上到下关联的,有可能刚开始运行的时候,最上面的线程组还没有执行完,而导致后面关联的线程组取不到值

  • 这里是调试脚本阶段的时候先在测试计划中勾选了独立运行每个线程组,即改为了串行

  • 实际性能测试中,是肯定不能取勾选这个独立运行每个线程组,只有调试的时候 看脚本是否能通

 

实现思路

通过设置动态属性的方式, 进行混合场景设计

/*
1、前面的线程组中,设置属性   setproperty函数,把我们需要关联的参数,设置为属性。 首先,我们设置肯定是  属性名称唯一的  固定属性。(属性名称唯一,导致 后一次执行,会覆盖属性的前一次的值,)
​
2、、后面的依赖接口的线程组, 就使用 获取属性P 函数   去获取属性,就可以使用了。
3、但是,这个设计中,属性名称只有一个,导致 后一次执行,会覆盖属性的前一次的值
4、可以设置  属性名称动态变化, 可以再属性名称后面  ${__threadNum} 
*/

实现方案

/*
上面的线程组设置的线程数小于下面的线程组所设置的线程数
但这样的话,比如线程组A设置了6个线程数,${__threadNum}最大是6
线程组B设置了10个线程数,这就会导致最多会使用线程组A的6个属性,导致线程组B中的threadNum_7/8/9/10这4个属性根本取不到,这样就要去用计数器去控制线程组取最大值,如线程组A设置的线程数为6,则线程组B中计数器最大值就要设置为6,这样就能保证线程组B永远都能取到线程组A所设置的1-6个属性
​
​
如果上面的线程组大于下面的线程组数的话,就可以直接使用threadNum
​
​
总结:
1、混合场景中如果线程组A大于下面线程组B的线程数,就直接用threadNum函数即可
​
2、如果线程组A小于线程组B设置的线程数,线程组B使用线程组A所设置的属性时,则线程组B里面就要使用计数器函数来控制取属性的最大值不能超过线程组A的threadNum函数所设置的最大线程数
​
补充:
counter函数只会一直加1,而计数器可以设置最大值,超过最大值以后就会继续从头开始取
​
补充到博客:
threadNum函数的值只与线程组中设置的线程数有关,设置了几个线程数,则threadNum的最大值就为几,跟执行运行多久没有任何关系
*/

为什么用threadNum而不用counter函数

/*
,coner函数会一直累加1,会**导致 属性过多。这些属性放再内存中,会占用过高的内存**。属性名称\_threadNum函数,为属性名称,属性的数量是可控的有限的。 同一个线程数会覆盖前一次的值,整体的  属性的利用率更高、内存占用相比  属性名称\_counter函数会更少.
*/

总结

/*
**场景设计时, 
​
场景一:线程组1 线程数 大于  线程组2的线程数
​
线程组2中获取属性值,就可以直接使用 属性名称\_threadNum;
​
场景二:线程组1线程数小于线程组2的线程数,  
​
线程组2中 添加计数器元件,元件中的最大值为线程组1的 线程数量,线程组2中使用时,获取属性, 属性名称\_计数器的值
​
​
*/