FunctionHelper
4.1_csvRead 函数
4.1.1函数介绍
_cvsRead函数从一个文件中读取参数。
多线程运行时,函数值才会变化,每个线程依次取值,当线程数大于函数可取值个数时,会从头循环取值。
仅单线程循环运行时,函数的值为固定值,始终为第一次取的值。
CSV file to get values from | *alias:表示要读取的文件路径,需要是绝对路径(放在和脚本相同目录直接写文件名是不能正确读取到的)。
CSV文件列号| next| *alias:表示当前变量读取第几列数据,从第0列开始。
4.1.2使用方式
1、 将生成的函数直接放到需要使用的地方
2、 察看运行结果
注意:如果中文乱码,需要修改文件格式为GB2312格式。
4.2_Random 函数
从一个数据段中随机读取数据替换参数。
多线程运行,或者单线程循环运行,该值均会更新。
4.3_split 函数
4.3.1函数介绍
将一个字符串或者一个变量,分割成多个值
String to split:需要进行分割的字符串或者变量。
函数名称。存储变量名,可以在其他地方进行使用。
String to split:分割符。
4.3.2使用方式
1、定义传入的变量的值
2、使用forEach控制器循环取出split函数生成的值
3、请求结果
4.4_counter函数
4.4.1函数介绍
该函数功能和计数器相同。
第一个参数:True,每个线程的计数器保持独立。False,全局,所有线程共用的计数器。
第二个参数:存储脚本返回结果的变量名,当函数为${__counter(false,i)}时,可以直接调用函数${__counter(false,i)},也可以调用${i},效果相同。
4.4.2使用方式
比如有一个论坛的业务分布如下,回复帖子与开新帖的比例为3:2,在测试中控制业务比例,两种方式:
1.多线程组方式
2.逻辑控制器控制
多线程组方式:
我们知道JMeter是用线程组来模拟虚拟用户的,JMeter还可以支持一个计划中多个线程组。利用这个特性我们可以把开新帖业务放在一个线程组中,回帖业务放在另外一个线程组中。为了制造出业务量的比例关系,我们通过控制线程数来达到效果。如下图:
ReplayTopic为回帖线程组,添加90个线程;
SendTopic为开新帖线程组,添加60个线程,刚好是3:2。
当然,这只能是近似的,如果这两个事务的响应时间不一样,最终完成的业务数比例也会不一样。
当前线程数是在假定两个业务的响应时间一样的情况下,所以这完全是理想状况。
因为需要模拟的是单线程的操作比例,而单线程循环请求的特征,是需要等当前请求得到响应之后,才会继续下一个请求。所以此处直接使用多线程模拟不合适。
下面我们用第2种方式:
控制器控制
下图是一个IF控制器,IF控制器可以使用表达式来做为条件,这样我们事以获取迭代次数来决定是回帖还是开帖,比如一共3次迭代,第1次与第3次迭代时开新帖,1,2,3次迭代都会进行回帖
接下来我们就要获取迭代次数,JMeter函数助手提供了一个__counter函数,可以用来获取当前的迭代次数。
${__counter(true,)}%2==1||${__counter(true,)}%3==0
上面__counter(true,)是获取当前迭代次数,%是取余,也就是除2余1与3整除时执行开新帖。
以9次迭代为例,回帖9次,1,3,5,6,7,9 次迭代时都会开新帖,回刚好是6次
9:6=3:2
基本上保护了3:2的比例。
${__counter(true,)}%2==1||${__counter(true,)}%3==0
写法2:${__counter(true,)}%3!=0
4.5_time函数
格式:非必填项,格式如果不填那么就是默认获取当前时间的毫秒数(此项也常被用于接口参数中那些不允许重复的字段);
参数名称:非必填项,如果填了,则生成的时间会被放到该参数中,可以在任意地方调用这个参数,常用于多接口中某个值使用同一个时间参数的情况;
${__time(,)}:获取当前时间的毫秒数;
${__time(/1000,time_s)}:获取当前时间的秒数并存入参数time_s中;
${__time(yyyy-MM-dd,time_date1)}:获取当前日期并存入参数time_date1中;
${__time(yyyyMMddHHmmss,time_1)}:获取当前时间,固定格式,并存入参数time_1中;
日期格式可以根据情况灵活填写。