1-性能测试 - JMeter参数化
about
在工作中,使用固定的参数多次测试一个接口,意义并不大,比如老是用同一个用户测试登录接口。比较好的办法是什么呢?就是使用不同的用户访问登录接口,模拟更真实的登录场景。
在jmeter中,提供了参数化函数和参数化文件两种方式来实现参数化。
来看看都是怎么玩的。
参数化函数
首先:这里需要在插件管理中心下载了Custom JMeter Functions
插件,该插件扩展了函数助手对话框内的内置函数数量。
jmeter内置了很多函数来供我们使用,比如:
- 随机数函数系列
- 加密
- 时间戳函数
- UUID
怎么用呢?在你的菜单栏,有个函数助手对话框,里面包含了jmeter提供的所有的函数,内置的和自定义的都有。
我们通过几个示例来学习函数如何使用。
如下图:
- 在菜单栏,点击
函数助手对话框
。 - 在弹出的窗口中,下拉选择随机数函数。
- 对于随机数范围的限制,和将随机数函数赋值给一个变量(可选参数,可以不写),方便别的地方引用。
- 点击生成,左侧的输入栏就是jmeter生成的随机数函数,把它拷贝走即可。
- 当你点击生成的时候,自动的执行了该函数,随机生成了一个随机数。
来看怎么用,我们现在访问下面的URL,而stock值需要随机生成。
http://www.neeo.cc:6002/get?stock=10 # get
在线程组(线程数设置为2)新建"HTTP请求"取样器:
如上的随机数中,将会从1~100
内随机取值。来看"察看结果树"中的结果:
可以看到,两次请求携带的stock值都是随机生成的。
那么,如果有这样一个场景,就是一个生成的随机数要被多处引用怎么办?你可能会说,这么干:
哪里用到就放到哪里!但是这么着不行,因为当jmeter调用一次该函数,就会重新生成一个值:
由上图可以看到,每次的值都不一样,这怎么才能一样呢?这就用到在函数助手中的某个参数了:
没错,就是"存储结果的变量名(可选)"这个参数,这个参数就是将函数执行的结果保存到变量中,然后我们就可以直接别处使用这个变量了,来看怎么用:
看结果:
一个字,好使!原理是啥呢?jmeter在执行内置函数后,会将结果保存到到变量中,而这个变量在哪看呢?其实这个变量被保存到了jmeter的全局中了,不信你看"调试取样器":
OK,完美!
其他的内置函数用法都类似,所以这里就不一一细表了。
但是,还有个重要而内置函数要说,它就是内置的"CSVRead"函数,这个函数用来读取外部的CSV文件。
所谓“CSV”,是Comma Separated Value(逗号分隔值)的英文缩写,通常指的都是纯文本文件,可以以txt方式或者Excel表打开,更多参考:https://baike.baidu.com/item/CSV/10739
在参数化中,文件参数化是非常重要的一个点。比如做登录参数化,登录的用户名和密码总不能都是随机的,而是要从数据库或者文件中读取出来的真实的用户。
首先,我们需要在本地创建一个data.csv
文件,注意以逗号分隔:
zhangsan,111
lisi,222
wangwu,333
zhaoliu,444
怎么用呢?上URL:
http://www.neeo.cc:6001/get # get
上面这个链接想必你也很熟悉了,可以携带用户和密码参数。
首先,由于上面data.csv
文件有4个用户,所以,我们这里配置线程组的线程数为4,表示一个线程代表一个用户;然后,在线程组内创建一个"HTTP请求"取样器:
来看"察看结果树"中的结果:
如上图,这完全没有问题,一个线程获取一个用户的信息;但是,我由于在设置线程组的线程数时,手一抖,多设置了一个线程,现在有5个线程数了,也就是数据文件是4个用户,而线程数是5了, 那么第5个线程获取的信息是什么?我们有必要来看下:
哦,是第一个用户的用户信息,这就意味着,当数据文件到末尾时,线程并没有结束,而是从头开始循环着再次从头取值了。
来个小结:__CSVRead
函数规定每个线程都只读取一行数据。
那,遇到当数据文件到末尾时,就结束线程的这种操作该怎么办?
很明显__CSVRead
函数,有一定的局限性,我们需要更灵活的控制。
参数化文件
"CSV数据文件设置"这个元件对__CSVRead
函数做了一定的扩展,使其更加的灵活,来看如何添加"CSV数据文件设置":
如上图新建一个配置元件"CSV数据文件设置":
我们可以对"CSV数据文件设置"做如下配置:
- 文件名:就是我们要使用的CSV文件。
- 文件编码就不多说了。
- 变量名称这里,之前我们都是用0代表第一列,1代表第二列,现在我们可以为这些列起一个变量名。
- 忽略首行的意思是,在第一行是否有title。有title就忽略它。
- 分割符默认是西文逗号,也可以自己指定分隔符。
- 你的数据是否带引号?
- 当文件所有行读取完毕后,遇到文件结束符后再次循环?和遇到文件结束符停止线程?的关系是互斥的,也就是一个如果设置为true则另一个要设置为false。
- 线程共享一般设置为所有线程(汉化的没那么精准)。也就是这个CSV文件可以被所有线程使用。
然后,HTTP请求
取样器中直接引用变量名即可:
由于在"CSV数据文件设置"中设置了遇到文件结束符时结束循环,所以,5个线程执行了4个就停止了。
以上就是jmeter在参数化方面的用法,更多姿势,请自行探索!
欢迎斧正,that's all