用过JMeter参数化的小伙伴,想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称,是否忽略首行等参数,其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例,原因就出在最后一个参数“线程共享模式”上。记录一下,大家避坑。
某系统用户提交订单之后,在订单列表页面会新增一条记录。
压测前后,需要分别查询订单数量,根据提交订单的成功事务数来判断,是否所有的订单都成功入库。
但是,因为测试过程中多用户并发,每个用户只能查到自己的订单,所以检查时需要逐个检查所有参与并发测试的用户名下的订单数量,然后加总求和。
详情可参见JMeter案例分享:通过采样器自动完成性能测试过程中的功能检查-数据条目验证-CSDN博客
脚本调试时,仅使用有限几个账户,一切正常。但是,当项目组提供真正的登录账号后,数据验证总是对不上。于是,减少并发数,并把用户、订单数量信息一一打印出来查看。
原来:
业务前数据检查的用户是usr1、2、3
执行业务的用户是usr4、5、6
业务后数据检查的用户又变成了usr7、8、9
它们分属3个线程组,虽然使用的是同一个数据文件,但是因为数据文件是放置在线程组内的,按照我的理解,作用域也应该仅限于本线程组,那么每一个线程组都应该从这个数据文件的第一行开始读取。
然而,事实上,这个数据文件似乎是三个线程组间共享的。
官网中对该选项的介绍如下:
下面我们分别设置来看看效果
默认值,效果前面已经看到了,所有的线程组中的所有线程,共享一个文档,从第一行顺序向下读取。
文件仅在当前线程组中有效,本线程组结束后,下一个线程组将重新打开一遍数据文件,从第一行开始向下读取。这就是我当前这个测试场景中需要的效果。
数据文件仅在当前线程中有效。同一个线程组的不同线程间,不共享数据文件。
本例中数据验证线程组是单线程,用循环控制器顺序执行的,看不出效果,看业务线程组:3个并发执行1次,也就是三个线程,但是usr1登录了3次。
也就是说,线程1打开数据文件,从第一行开始读取;
线程2打开数据文件,从第一行开始读取
每个线程读取各自的文件。
我在业务前数据验证和业务线程组中分别输入1,标识这两个线程组是group 1
在业务后数据验证线程组中,输入2,标识这是group2
执行结果如下:
红色的两个线程组(group ID为1)作为一个group,共享数据文件。
黄色的线程组(group ID为2)作为一个group,独享数据文件。
最后一种共享模式中这句话我不知道该怎么操作,官网没有示例。
Or you could use the thread number to share the file between the same thread numbers in different thread groups.