软件测试 | JMeter函数和变量
X 关闭
JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试原件所引用。函数调用的语法如下:
其中,_functionName匹配被调用的函数名称。用圆括号包含参数的形参,例如$(_time(YMD)),不同函数要求的参数不同。有些JMeter函数不要求参数,则可以不适用圆括号,例如$(_threadNum)。
如果一个函数的参数中包含逗号,那么必须对逗号进行转义(使用“\”),否则JMeter会把逗号当成参数分隔符。例如:
(资料图片仅供参考)
$(_time(EEE\, d MMM yyy)}
变量引号的语法如下:
${VARIABLE}
如果测试计划中引用了未定义的变量或者函数,那么JMeter并不会报告/记录错误信息,引用返回的值就是引用自身。例如,假设字符串UNDEF没有被定义为变量,那么${UNDEF}返回的值就是$(UNDEF)。变量、函数(包括属性)都是大小写敏感的。及其后续版本会剔除参数名中的空格,例如,$(_Random(1,63,LOTTERY)}中的“LOTTERY”会被“LOTTERY”所代替。
1.使用函数可以做些什么
目前有两种类型的函数:用户定义的静态值(或者变量)和JMeter内置函数。
当需要编译测试树或者提交运行时,用户可以使用自定义变量来代替常用的静态值。这种替换只在测试的开始阶段执行一次。一个典型的应用就是使用自定义变量来替换所有HTTP请求的DOMAIN域,例如,做出轻微改动,就可以让同一个测试脚本适配多个服务器。
需要注意,目前变量不支持嵌套:例如${Var${N}}不能正常工作。但是在及其以后版本中,可以借助函数_V(variable)来达成嵌套变量的目的(如${_V(Var${N})})。在早期的JMeter版本中可以使用$(_BeanShell(("Var${N}")))。
这种类型的替换也可以不用函数来实现,但是就不像使用函数时那么直观和方便。用户可以创建默认配置测试元件,它们会填充采样器中的空白设置。
使用JMeter内置函数,用户可以基于前面的服务器响应数据、函数所在线程、当前时间或者其他资源来动态地计算变量值。这些变量的值会在整个测试期间针对每个请求动态更新。
2.函数和变量可以被用在哪里
函数和变量理论上可以被用在任何测试元件的任何输入域之中(除了测试计划之外,见下面的内容)。有些输入域不支持随机数组,因为它们只接受数字,这样一来就不支持函数。当然,大多数输入域支持函数。
将函数用于测试计划(Test Plan)的设置时,会受到一些限制。此种情况下,JMeter线程的变量在函数被处理时还没有被设定,因此变量作为参数传递时没有初始化,函数引用当然不会生效。如此一来,split()、regex()及变量赋值函数就都不能正常工作。函数threadNum()同样不能正常工作,该函数在测试计划层没有意义。在测试计划中,函数intSum、longSum、machineName、BeanShell、JavaScript、jexl、random、time、property functions、log functions应该能正常工作。
配置元件是通过一个独立线程处理的。因此函数(如_threadNum)不能在这些测试元件(如用户定义的变量)之中正常工作。另外还需要注意,在用户定义的变量(UDV)中定义的变量,在UDV被处理前是不能使用的。