第20节 函数与变量(20.1~20.3)

第20节 函数与变量

    JMeter函数是特殊值,可以填充在测试树中任何Sampler或其他元素的字段。函数调用如下所示:${__functionName(var1,var2,var3)},其中"__functionName"与函数名称匹配。发送给函数的参数被圆括号包围,如:${__time(YMD)} ,实际参数因函数而异。不需要参数的函数可以省略圆括号,如:${__threadNum}。如果函数参数包含逗号,请确保使用“\”进行转义,否则JMeter会将其视为参数分隔符,例如:${__time(EEE, d MMM yyyy)}
如果逗号没有转义,如:\ ${__javaScript(Math.max(2,5))},你将得到一个错误:

ERROR - jmeter.functions.JavaScript: Error processing Javascript: [Math.max(2]
    org.mozilla.javascript.EvaluatorException: missing ) after argument list (<cmd>#1)

     这是因为字符串"Math.max(2,5)",被视为__javascript 函数的两个参数:Math.max(2 and 5) ,可能还有其他错误消息。变量引用如下:${VARIABLE}。
    如果引用了未定义的函数或变量,JMeter不会报告错误——引用将不加更改地返回,例如,如果UNDEF没有定义为变量,那么${UNDEF}的值就是${UNDEF}.变量、函数(和属性)都是区分大小写的.JMeter在使用前会裁剪变量名称里的空格,所以,例如:${__Random(1,63, LOTTERY )} ,将使用变量’LOTTERY’,而不是 ’ LOTTERY '。
属性与变量不同。变量是线程的本地变量;属性对所有线程都是通用的,需要使用__P或__property函数进行引用。
    在用于Windows路径的变量之前使用\时,例如:C:\test\${test},请确保已通过\进行转义,否则,JMeter不会解释变量,例如:C:\test\${test}. 或者,只需使用/代替路径分隔符 - 例如C:/ test / $ {test} ,Windows jvm将根据需要转换分隔符。
根据类型,有如下函数列表:
待补充

20.1 函数能干什么

    有两种函数:用户定义的静态值(或变量)和内置函数。当编译并提交要运行的测试集时,用户定义的静态值允许用户去定义变量以替换它们的静态值。这种替换在测试运行开始时发生一次。这可以用于替换所有HTTP请求的域名,例如,相同测试中使用到了不同的服务器,修改它将变成很简单的事情。

    请注意,变量目前不能嵌套,例如:${Var${N}}不能被执行。__V功能可以这样用:${__V(Var${N})},你也可以这样用:${__BeanShell(vars.get(“Var${N}”)}.这种类型的替换在没有函数的情况下是可能的,但是不太方便,也不太直观。它要求用户创建默认配置元素,以填充采样器的空白值。变量允许只替换任何给定值的一部分,而不仅仅是填充空白值。使用内置函数,用户可以在运行时基于先前的响应数据(函数所在的线程、时间和许多其他源)计算新值。在整个测试过程中,每个请求都会生成这些值。函数在线程之间共享。测试计划中每次函数调用的发生都由一个单独的函数实例来处理。

20.2 哪里可以使用函数和变量

    函数和变量可以被写入任何测试组件的任何字段中(除了TestPlan—参见下面)。有些字段不允许随机字符串,因为它们需要数字,因此不接受函数。然而,大多数字段将允许函数。在测试计划中使用函数会有一些限制。

    在处理这些函数时,JMeter线程变量还没有完全设置好。因此,将不会设置作为参数传递的变量名,并且变量引用将不起作用,因此split()和regex()以及变量求值函数将不起作用。threadNum()函数将不起作用(并且在测试计划级别上没有意义)。以下功能在测试计划中应该可以正常运行:

  • intSum
  • longSum
  • machineName
  • BeanShell
  • groovy
  • javaScript
  • jexl2/jexl3
  • random
  • time
  • property functions
  • log functions

    配置元素由单独的线程处理。因此,threadNum等函数在用户定义的变量等元素中不能正常工作。还要注意,在UDF元素中定义的变量在元素被处理之前是不可用的。在SQL代码中,引用函数或变量,请记住,要使用必要的引号,如:
SELECT item from table where name=’${VAR}‘
而不是
SELECT item from table where name=${VAR}
(除非VAR本身包含引号)

20.3如何引用函数和变量

    在测试元素中引用一个变量是通过在变量名中加上’${‘和’}'来实现的。函数以相同的方式引用,但按照惯例,函数名称以“__”开头,以避免与用户值名称冲突。如果函数不带参数,则可以省略括号。

    应该根据需要转义本身包含逗号的参数值,如果您需要在参数值中包含逗号,请将其转义为:’,’。这适用于脚本函数–Javascript,Beanshell,Jexl,groovy - 其中必须转义脚本方法调用中可能需要的任何逗号 - 例如:

${__BeanShell(vars.put("name"\,"value"))}

或者,您可以将脚本定义为变量,如:

SCRIPT          vars.put("name","value")

然后可以按照以下方式引用该脚本:

${__BeanShell(${SCRIPT})}

    不需要在SCRIPT变量中转义逗号,因为在变量被其值替换之前,函数调用会被解析。这与JSR223或BeanShell Samplers一起使用效果很好,因为它们可用于测试Javascript,Jexl和BeanShell脚本。

    函数可以引用变量和其他函数,例如:${__XPath(${__P(xpath.file),${XPATH})}。将使用属性“xpath.file”作为文件名,并使用变量XPATH的内容作为要搜索的表达式。JMeter提供了一个工具来帮助您构建各种内置函数的函数调用,然后可以复制粘贴。它不会自动转义您的值,因为函数可以是其他函数的参数,您应该只转义您想要的文本值。

如果字符串包含反斜杠('\')并且还包含函数或变量引用,则如果反斜杠出现在'$'或','或'\'之前,将删除反斜杠。这种行为对于包含逗号或字符串${的嵌套函数是必要的。如果字符串不包含函数或变量引用,则不删除'$'或','或'前的反斜杠

    可以使用__logn()函数报告变量或函数的值。在定义变量之后,可以在测试计划中的任何位置使用__logn()函数引用。或者,Java Request采样器可用于创建包含变量引用的示例;输出将显示在相应的Listener中。请注意,有一个Debug Sampler可用于在Tree View Listener中显示变量等的值。

如果定义一个与内置函数同名的用户定义静态变量,则静态变量将覆盖内置函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值