jmeter做压测时,生成唯一标识
背景
有些项目的字段值,有唯一性校验,不能输入重复,但是做压测的时候,又需要生成大量的数据,所以需要做成参数化,并且不能重复。
方法一:利用jmeter内置组件,计数器
选中线程组层级,右键,选择添加->配置元件->计数器。
计数器配置如下图:
参数介绍:
①Starting value:给定计数器的起始值、初始值,第一次迭代时,会把该值赋给计数器;
②递增:每次迭代后,给计数器增加的值;
③数字格式:可选格式,比如000,000000;
④引用名称:用于在脚本中引用该变量,如${num};
⑤与每用户独立的跟踪计数器:全局的计数器。如果不勾选,即全局的,比如用户#1 获取值为1,用户#2获取值还是为1,比如,并发数设置为2,循环次数设置为2,分布式压测启动2个压力机,那么会有四组2个请求的计数器是一样的。如果仅勾选这个,即每个线程组独立使用计数器,比如比如,并发数设置为2,循环次数设置为2,分布式压测启动2个压力机,那么会有两组4个请求的计数器是一样的。
⑥在每个线程组迭代上重置计数器:可选,仅勾选与每用户独立的跟踪计数器时可用;如果勾选,则每次线程组迭代,都会重置计数器的值,当线程组是在一个循环控制器内时比较有用。比如,并发数设置为2,循环次数设置为2,分布式压测启动2个压力机,那么会有一组8个请求的计数器是一样的。
上面这种方法,执行分布式压测的时候,就不能实现唯一标识的生成了,总是会有重复的,因为每台机器都用自己的全局变量。
方法二:利用bean sampler写生成随机UUID的方法
import java.util.UUID;
UUID uuid1 = UUID.randomUUID();
vars.put("id",(uuid1.toString().replaceAll("-","")))
如果需要使用该变量,则使用
以上这种方法,很少概率会生成重复的uuid,作为压测的入参。
方法三:利用bean sampler写生成当前时间戳的方法
vars.put("timestamp","${__time(,)}");
以上这种方法,几乎不会生成重复的uuid,作为压测的入参。
方法四:利用DB或者redis等中间件创建一个字段
第一步:下载mysql驱动,参考文章:https://www.cnblogs.com/fanf/p/15745037.html
第二步:创建数据库配置原件
第三步:输入本地数据库连接信息,必填参数如下
第四步:创建数据库请求
第五步:数据库请求参数如下
第六步:使用变量,一定要在上面步骤设置的变量名后面加个下划线,代表的是第一行记录,从1开始
第七步:执行完脚本的http请求后,立马更新刚才的cur_range字段
可以看一下user表的数据结构
但是这种方式有一个小问题,第一次跑脚本的时候,因为是同时进入脚本的,所以查询出来的值都是初始值,会导致第一个迭代查询到的cur_range都是一样的。
如下图
解决办法:先做数据的更新,再做查询,因为更新操作数据库本身会有锁,则会有先后顺序。创建订单都成功了。