跳到主要内容

函数和变量

关于 JMeter 的相关的函数和变量介绍可访问 JMeter 官网 Functions and Variables 介绍。下面是一些基本的应用。

JMeter 函数是可以填充测试树中任何采样器或其他元素的字段的特殊值。函数调用如下所示:

${__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 和 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 将根据需要转换分隔符。

功能列表,松散地分组为类型。

功能类型姓名评论自从
Information线程数获取线程号1.X
Information线程组名获取线程组名4.1
Information采样器名称获取采样器名称(标签)2.5
InformationmachineIP获取本机 IP 地址2.6
Information机器名获取本地机器名1.X
Information时间以各种格式返回当前时间2.2
InformationtimeShift返回各种格式的日期,并添加指定的秒数/分钟数/小时数/天数3.3
Information日志记录(或显示)消息(并返回值)2.2
Information登录记录(或显示)一条消息(空返回值)2.2
Input字符串从文件从文件中读取一行1.9
Input文件到字符串读取整个文件2.4
InputCSV 读取从 CSV 分隔文件读取1.9
InputXPath使用 XPath 表达式从文件中读取2.0.3
Input字符串到文件将字符串写入文件5.2
Calculationcounter生成一个递增的数字1.X
格式化日期时间转换将日期或时间从源格式转换为目标格式4.0
Calculationdigest生成摘要(SHA-1、SHA-256、MD5...)4.0
Calculation整数添加整数1.8.1
CalculationlongSum添加长数字2.3.2
Calculation随机的生成一个随机数1.9
Calculation随机日期在特定日期范围内生成随机日期3.3
CalculationRandomFromMultipleVars从由分隔的一组变量的值中提取一个元素3.1
Calculation随机字符串生成随机字符串2.6
CalculationUUID生成随机类型 4 UUID2.9
Scriptinggroovy运行 Apache Groovy 脚本3.1
ScriptingBeanShell运行 BeanShell 脚本1.X
ScriptingScripting处理 JavaScript (Nashorn)1.9
Scriptingjexl2评估 Commons Jexl2 表达式jexl2(2.1.1)
Scriptingjexl3评估 Commons Jexl3 表达式jexl3 (3.0)
特性isPropDefined测试属性是否存在4.0
特性property读取属性2.0
特性P读取属性(速记方法)2.0
特性setProperty设置 JMeter 属性2.1
变量split将字符串拆分为变量2.0.2
变量eval计算变量表达式2.3.1
变量evalVar计算存储在变量中的表达式2.3.1
特性isVarDefined测试变量是否存在4.0
变量V评估变量名2.3RC3
String字符从数字列表中生成 Unicode 字符值2.3.3
StringchangeCase改变大小写遵循不同的模式4.0
String转义 HTML使用 HTML 编码对字符串进行编码2.3.3
StringescapeOroRegexpChars引用 ORO 正则表达式使用的元字符2.9
StringescapeHtml使用 XML 编码对字符串进行编码3.2
String正则表达式函数使用正则表达式解析先前的响应1.X
Stringunescape处理包含 Java 转义的字符串(例如 \n & \t)2.3.3
StringunescapeHtml解码 HTML 编码的字符串2.3.3
Stringurldecode解码 application/x-www-form-urlencoded 字符串2.10
Stringurlencode将字符串编码为 application/x-www-form-urlencoded 字符串2.10
StringTestPlanName返回当前测试计划的名称2.6

20.1 函数可以做什么

有两种函数:用户定义的静态值(或变量)和内置函数。
用户定义的静态值允许用户定义在编译测试树并提交运行时用它们的静态值替换的变量。此替换在测试运行开始时发生一次。这可用于替换所有 HTTP 请求的 DOMAIN 字段,例如 - 使更改测试以针对具有相同测试的不同服务器变得简单。

请注意,变量当前不能嵌套;即${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 之类的函数在用户定义变量等元素中无法正常工作。另请注意,UDV 元素中定义的变量在处理完该元素后才可用。

在 SQL 代码(等)中使用变量/函数引用时,请记住为文本字符串包括任何必要的引号,即使用

SELECT item from table where name='${VAR}'

不是

SELECT item from table where name=${VAR}

(除非 VAR 本身包含引号)

20.3 如何引用变量和函数

引用测试元素中的变量是通过用' ${ '和' } '将变量名括起来来完成的。

函数的引用方式相同,但按照惯例,函数的名称以\_\_开头,以避免与用户值名称*冲突。有些函数需要参数来配置它们,这些参数放在括号中,以逗号分隔。如果函数没有参数,括号可以省略。

本身包含逗号的参数值应根据需要进行转义。如果你需要在参数值中包含逗号,请将其转义,如下所示:' \, '。 例如,这适用于 Scripting 函数 - Javascript、Beanshell、Jexl、groovy - 有必要在 Scripting 方法调用中转义任何可能需要的逗号 - 例如

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

或者,你可以将 Scripting 定义为变量,例如在测试计划中:

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

然后可以按如下方式引用该 Scripting:

${__BeanShell(${SCRIPT})}

不需要在 SCRIPT 变量中转义逗号,因为在将变量替换为其值之前会解析函数调用。这与 JSR223 或 BeanShell 采样器配合使用效果很好,因为它们可用于测试 Javascript、Jexl 和 BeanShell Scripting。

函数可以引用变量和其他函数,例如 ${__XPath(${__P(xpath.file),${XPATH})} 将使用属性xpath.file作为文件名,变量 XPATH 的内容为要搜索的表达式。

JMeter 提供了一个工具来帮助你为各种内置函数构建函数调用,然后你可以复制粘贴。它不会自动为你转义值,因为函数可以是其他函数的参数,并且你应该只将你想要作为文字的值转义。

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

可以使用 __logn() 函数报告变量或函数的值。定义变量后,__logn()函数引用可以在测试计划中的任何地方使用。或者,Java 请求采样器可用于创建包含变量引用的示例;输出将显示在适当的侦听器中。请注意,有一个 调试采样器 可用于在树视图侦听器中显示变量的值等。

\*如果你定义了一个与内置函数同名的用户定义的静态变量,你的静态变量将覆盖内置函数。

20.4 函数助手对话框

函数助手对话框可从 JMeter 的工具菜单中获得。

函数助手对话框

函数助手对话框

使用函数助手,你可以从下拉列表中选择一个函数,并为其参数赋值。表中的左列提供了参数的简要描述,右列是你为该参数写入值的位置。不同的函数采用不同的参数。

完成此操作后,单击生成按钮,并生成适当的字符串供你复制粘贴到你喜欢的任何地方的测试计划中。

20.5 功能

__正则表达式函数

Regex 函数用于使用任何正则表达式(由用户提供)解析先前的响应(或变量的值)。该函数返回填充了变量值的模板字符串。

__regexFunction 还可以存储值以供将来使用。在第六个参数中,你可以指定一个引用名称。执行此函数后,稍后可以使用用户定义值的语法检索相同的值。例如,如果你输入refName作为第六个参数,你将能够使用:

  • ${refName}引用此函数解析的第二个参数(替换字符串的模板)的计算结果
  • ${refName_g0}引用此函数解析的整个匹配项。
  • ${refName_g1}引用此函数解析的第一个组。
  • ${refName_g#}引用此函数解析的第 n组。
  • ${refName_matchNr}引用此函数找到的组数。

如果使用分布式测试,请确保切换模式(请参阅 jmeter.properties),以免它不是剥离模式,请参阅 错误 56376

选项描述Required
第一个论点第一个参数是应用于响应数据的正则表达式。它将抓取所有匹配项。你希望在模板字符串中使用此表达式的任何部分,请务必用括号括起来。示例: <a href="(.\*)">。这将获取链接的值并将其存储为第一组(只有 1 组)。另一个例子:<input type="hidden" name="(.\*)" value="(.\*)">。这将获取名称作为第一组,并将值作为第二组。这些值可以在你的模板字符串中使用
第二个论点这是将在运行时替换函数的模板字符串。要引用正则表达式中捕获的组,请使用语法: $[group_number]$。即:$1$或$2$。你的模板可以是任何字符串。是的
第三个论点第三个参数告诉 JMeter 使用哪个匹配。你的正则表达式可能会找到许多匹配项。你有四个选择:(1) 一个整数 - 告诉 JMeter 使用该匹配。' 1 ' 表示找到的第一个匹配项,' 2 ' 表示第二个匹配项,依此类推(2)RAND - 告诉 JMeter 随机选择一个匹配项。(3) ALL - 告诉 JMeter 使用所有匹配项,并为每个匹配项创建一个模板字符串,然后将它们全部附加在一起。这个选项很少使用。(4) 一个介于 0 和 1 之间的浮点数 - 告诉 JMeter 使用以下公式找到第 X匹配项:(number_of_matches_found * float_number) 四舍五入到最接近的整数。不,default=1
第四个论点如果为上述参数值选择了ALL,则该参数将插入到模板值的每个附加副本之间。
第六个论点用于重用此函数解析的值的引用名称。 存储的值是${refName}(替换模板字符串)和${refName_g#},其中#是正则表达式中的组号(0可用于引用整个匹配项)。
第七个论点输入变量名。如果指定,则将变量的值用作输入,而不是使用先前的样本结果。

__计数器

计数器每次调用时都会生成一个新数字,从 1 开始,每次递增 +1。计数器可以配置为将每个模拟用户的值分开,或者为所有用户使用相同的计数器。如果每个用户的值分别递增,这就像计算测试计划的迭代次数。全局计数器就像计算该请求运行了多少次。

计数器使用一个整数变量来保存计数,因此它的最大值为 2,147,483,647。

计数器函数实例是完全独立的。全局计数器 - FALSE - 由每个计数器实例单独维护。

同一迭代中的多个__counter 函数调用不会进一步增加该值。
如果你想要为每个样本增加一个计数,请使用预处理器中的函数,例如 User Parameters

选项描述Required
第一个论点如果你希望每个模拟用户的计数器保持独立并与其他用户分开,则为 TRUE 。全局计数器为 FALSE。
第二个论点用于重用此函数创建的值的引用名称。 存储值的格式为 ${refName}。这允许你保留一个计数器并在多个位置引用其值。

__threadNum

线程号函数只是返回当前正在执行的线程号。这些数字仅相对于它们的 ThreadGroup 是局部唯一的,这意味着从这个函数的角度来看,一个线程组中的线程 #1 与另一个线程组中的线程 #1 无法区分。

该函数返回一个介于 1 和最大运行线程数之间的数字。请注意,如果你将 JSR223 代码与 JMeterContext 对象(ctx 变量)一起使用,则以下代码将返回一个介于零和(最大运行线程数减一)之间的数字

ctx.getThreadNum()

此函数没有参数。

使用示例:

${__threadNum}

返回一个介于 1 和包含线程组中配置的最大运行线程数之间的数字

此功能不适用于任何配置元素(例如用户定义的变量),因为它们是从单独的线程运行的。在测试计划中使用它也没有意义。

__threadGroupName

线程组名称函数只返回正在执行的线程组的名称。

此函数没有参数。

使用示例:

${__threadGroupName}

此功能不适用于任何配置元素(例如用户定义的变量),因为它们是从单独的线程运行的。在测试计划中使用它也没有意义。

__intSum

intSum 函数可用于计算两个或多个整数值的总和。

引用名称是可选的,但它不能是有效的整数。

最后一个论点

用于重用此函数计算的值的引用名称。如果指定,引用名称必须至少包含一个非数字字符,否则它将被视为要添加的另一个 int 值。

例子:

${__intSum(2,5,MYVAR)}

将返回 7 (2+5) 并将结果存储在 MYVAR 变量中。所以${MYVAR}将等于 7。

${__intSum(2,5,7)}

将返回 14 (2+5+7) 并将结果存储在 MYVAR 变量中。

${__intSum(1,2,5,${MYVAR})}

如果 MYVAR 值等于 8,将返回 16, 1+2+5+${MYVAR})

__longSum

longSum 函数可用于计算两个或多个 long 值的总和,只要你知道你的值不在 -2147483648 到 2147483647 的区间内,请使用它而不是 __intSum。

最后一个论点

用于重用此函数计算的值的引用名称。如果指定,引用名称必须包含至少一个非数字字符,否则将被视为要添加的另一个长值。

例子:

${__longSum(2,5,MYVAR)}

将返回 7 (2+5) 并将结果存储在 MYVAR 变量中。所以${MYVAR}将等于 7。

${__longSum(2,5,7)}

将返回 14 (2+5+7) 并将结果存储在 MYVAR 变量中。

${__longSum(1,2,5,${MYVAR})}

如果 MYVAR 值等于 8,将返回 16, 1+2+5+${MYVAR})

__StringFromFile

StringFromFile 函数可用于从文本文件中读取字符串。这对于运行需要大量可变数据的测试很有用。例如,在测试银行应用程序时,可能需要 100 或 1000 个不同的帐号。

另请参阅 可能更易于使用的 CSV 数据集配置测试元素。 但是,目前不支持多个输入文件。

每次调用它都会从文件中读取下一行。所有线程共享同一个实例,因此不同的线程将得到不同的行。当到达文件末尾时,它将重新从头开始读取,除非已达到最大循环计数。如果测试 Scripting 中有多个对该函数的引用,则每个引用都将独立打开文件,即使文件名相同。[如果要在其他地方再次使用该值,请为每个函数调用使用不同的变量名。]

函数实例在线程之间共享,并且文件由恰好需要下一行输入的任何线程(重新)打开,因此使用 threadNumber 作为文件名的一部分将导致不可预测的行为。

如果打开或读取文件发生错误,则函数返回字符串 **ERR**

选项描述Required
文件名文件名的路径。(路径可以相对于 JMeter 启动目录)如果使用可选的序列号,路径名应该适合传递给 DecimalFormat。请参阅下面的示例。
变量的名称引用名称 - refName - 用于重用此函数创建的值。存储值的格式为 ${refName}。默认为StringFromFile\_
起始序号初始序列号(如果省略,则将结束序列号视为循环计数)
结束序号最终序号(如果省略,序号可以无限增加)

打开或重新打开文件时解析文件名参数。

每次执行函数时都会解析引用名称参数(如果提供)。

使用序列号:

使用可选序列号时,路径名用作 java.text.DecimalFormat 的格式字符串。当前序列号作为唯一参数传入。如果未指定可选的起始编号,则按原样使用路径名。有用的格式化序列是:

#

插入数字,没有前导零或空格

000

如有必要,将压缩后的数字插入前导零的三位数字

格式字符串的使用

以下是一些格式字符串以及它们将生成的相应序列。

pin#'.'dat

将生成不带前导零的数字并将点按字面意思
视为 pin1.dat、...、pin9.dat、pin10.dat、...、pin9999.dat

pin000'.'dat

将在保留点的同时生成前导零。当数字开始有更多数字时,该格式建议的这三个数字,序列将使用更多数字,如
pin001.dat、... pin099.dat、...、pin999.dat、...、pin9999.dat

pin'.'dat#

将在保留点的同时附加不带前导零的数字并生成
pin.dat1 , ..., pin.dat9 , ..., pin.dat999

如果需要的数字多于格式化字符,则数字将根据需要进行扩展。
为防止格式字符被解释,请将其括在单引号中。请注意,.是一个格式化字符,必须用单引号括起来 (尽管#.和 000.在小数点也是.的语言环境中按预期工作)
在其他语言环境中(例如 fr),小数点是,——这意味着#.变成了nnn,。有关完整详细信息,
请参阅 DecimalFormat 的文档。
如果路径名不包含任何特殊格式字符,则将当前序号附加到名称后,否则将根据格式说明插入序号。
如果省略了开始序号,而指定了结束序号,则序号被解释为循环计数,并且文件将最多使用end次。在这种情况下,文件名未格式化。
${\_\_StringFromFile(PIN#'.'DAT,,1,2)} - 读取 PIN1.DAT , PIN2.DAT
${\_\_StringFromFile(PIN.DAT,,,2)} - 读取 PIN.DAT 两次
注意 " . " 在上面的 PIN.DAT 中应该不被引用。在这种情况下,起始编号被省略,因此文件名完全按原样使用。

__machineName

machineName 函数返回本地主机名。这使用 Java 方法 InetAddress.getLocalHost()并将其传递给 getHostName()

选项描述Required
变量的名称用于重用此函数计算的值的引用名称。

例子:

${__machineName()}

将返回机器的主机名

${__machineName}

将返回机器的主机名

__machineIP

machineIP 函数返回本地 IP 地址。这使用 Java 方法 InetAddress.getLocalHost()并将其传递给 getHostAddress()

选项描述Required
变量的名称用于重用此函数计算的值的引用名称。

例子:

${__machineIP()}

将返回机器的 IP 地址

${__machineIP}

将返回机器的 IP 地址

__javaScript

javaScript 函数执行一段 JavaScript(不是 Java!)代码并返回其值

JMeter Javascript 函数调用一个独立的 JavaScript 解释器。Javascript 用作 Scripting 语言,因此你可以进行计算等。

javaScript 不是用于 JMeter 性能的最佳 Scripting 语言。如果你的计划需要大量线程,建议使用__jexl3 或__groovy 函数。

对于 Nashorn 引擎,请参阅 Java 平台标准版 Nashorn 用户指南
对于 Rhino 引擎,请参阅 Mozilla Rhino 概述

以下变量可用于 Scripting:

Rhinoscript 允许通过其 Packages 对象访问静态方法。请参阅 脚本 Java 文档。例如,可以访问 JMeterContextService 静态方法: Java.type("org.apache.jmeter.threads.JMeterContextService").getTotalThreads()

JMeter 不是浏览器,不会解释下载页面中的 JavaScript。

选项描述Required
表达要执行的 JavaScript 表达式。例如:(1) new Date() - 返回当前日期和时间(2) Math.floor(Math.random()\*(${maxRandom}+1)) - 0 和变量 maxRandom 之间的随机数(3) ${minRandom}+Math.floor(Math.random()\*(${maxRandom}-${minRandom}+1)) - 变量 minRandom 和 maxRandom 之间的随机数(4) "${VAR}"=="abcd"
变量的名称用于重用此函数计算的值的引用名称。

请记住为文本字符串和 JMeter 变量添加任何必要的引号。另外,如果表达式有逗号,请确保将它们转义。例如在:

${__javaScript('${sp}'.slice(7\,99999))}

7 后的逗号被转义。

例子:

${__javaScript(new Date())}

将于 2016 年 1 月 9 日星期六 16:22:15 GMT+0100 (CET)返回

${__javaScript(new Date(),MYDATE)}

将返回 Sat Jan 09 2016 16:22:15 GMT+0100 (CET)并将其存储在变量 MYDATE 下

${__javaScript(Math.floor(Math.random()*(${maxRandom}+1)),MYRESULT)}

将使用 maxRandom 变量,返回一个介于 0 和 maxRandom 之间的随机值并将其存储在 MYRESULT

${__javaScript(${minRandom}+Math.floor(Math.random()*(${maxRandom}-${minRandom}+1)),MYRESULT)}

将使用 maxRandom 和 minRandom 变量,返回 maxRandom 和 minRandom 之间的随机值并将其存储在变量 MYRESULT 下

${__javaScript("${VAR}"=="abcd",MYRESULT)}

将 VAR 变量的值与 abcd 进行比较,返回 true 或 false 并将结果存储在 MYRESULT

__Random

random 函数返回一个介于给定最小值和最大值之间的随机数。

选项描述Required
Minimum valueA number
Maximum valueA bigger number
变量的名称用于重用此函数计算的值的引用名称。

例子:

${__Random(0,10)}

将返回 0 到 10 之间的随机数

${__Random(0,10, MYVAR)}

将返回 0 到 10 之间的随机数并将其存储在 MYVAR 中。${MYVAR}将包含随机数

__RandomDate

RandomDate 函数返回一个介于给定开始日期和结束日期值之间的随机日期。

选项描述Required
时间格式DateTimeFormatter 的格式字符串(默认 yyyy-MM-dd)
Start date开始日期,现在默认为
End date结束日期是
Locale to use for formatDateTimeFormatter 的格式字符用于格式的区域设置区域设置的字符串格式。语言代码必须是小写。国家/地区代码必须大写。分隔符必须是下划线,例如 en_EN。参见 http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html 。如果省略,则默认情况下该函数使用 Apache JMeter 区域设置
Name of variable要设置的变量的名称

例子:

${__RandomDate(,,2050-07-08,,)}

将返回从现在到 2050-07-08 之间的随机日期。例如 2039-06-21

${__RandomDate(dd MM yyyy,,08 07 2050,,)}

将返回具有自定义格式的随机日期,例如 04 03 2034

__RandomString

RandomString 函数使用要使用的字符中的字符返回长度的随机字符串。

选项描述Required
变量的名称用于重用此函数计算的值的引用名称。

例子:

${__RandomString(5)}

将返回一个 5 个字符的随机字符串,该字符串是否可读

${__RandomString(10,abcdefg)}

将返回从 abcdefg 集合中挑选的 10 个字符的随机字符串,例如 cdbgdbeebd 或 adbfeggfad,...

${__RandomString(6,a12zeczclk, MYVAR)}

将返回从 a12zeczclk 集合中挑选的 6 个字符的随机字符串,并将结果存储在 MYVAR 中,MYVAR 将包含类似 2z22ak 或 z11kce 的字符串,...

__RandomFromMultipleVars

参数

源变量

由|分隔的变量名 包含将用作随机计算输入的值

是的

变量的名称

用于重用此函数计算的值的引用名称。

例子:

${__RandomFromMultipleVars(val)}

将根据变量 val 的内容返回一个随机字符串,同时考虑它们是否为多值

${__RandomFromMultipleVars(val1|val2)}

将根据变量 val1 和 val2 的内容返回一个随机字符串,同时考虑它们是否为多值

${__RandomFromMultipleVars(val1|val2, MYVAR)}

将根据变量 val1 和 val2 的内容返回一个随机字符串,同时考虑它们是否为多值,并将结果存储在 MYVAR

__UUID

UUID 函数返回一个伪随机类型 4 通用唯一标识符 (UUID)。

参数

例子:

${__UUID()}

将返回此格式的 UUID:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd

__CSVRead

CSVRead 函数从 CSV 文件中返回一个字符串 (cf StringFromFile )

注意:JMeter 支持多个文件名。

在大多数情况下,较新的 CSV 数据集配置元素 更易于使用。

当第一次遇到文件名时,文件被打开并读入一个内部数组。如果检测到空行,则将其视为文件结尾 - 这允许使用尾随注释。

对相同文件名的所有后续引用都使用相同的内部数组。注意文件名大小写对函数很重要,即使操作系统不关心,所以 CSVRead(abc.txt,0)和 CSVRead(aBc.txt,0)将引用不同的内部数组。

*ALIAS 功能允许多次打开同一个文件,也允许使用更短的文件名 。

每个线程都有自己的内部指针,指向文件数组中的当前行。当一个线程第一次引用该文件时,它将被分配到数组中的下一个空闲行,因此每个线程将访问与所有其他线程不同的行。[除非线程数多于数组中的行数。]

默认情况下,该函数在每个逗号处拆分行。如果要输入包含逗号的列,则需要通过设置属性将分隔符更改为不出现在任何列数据中的字符:csvread.delimiter

参数

文件名

要从中读取的文件(或*ALIAS )

是的

列号

文件中的列号。 0 = 第一列,1 = 第二列,以此类推。下一个 - 转到文件的下一行。 *ALIAS - 打开一个文件并将其分配给别名

是的

例如,你可以如下设置一些变量:

  • COL1a ${__CSVRead(random.txt,0)}
  • COL2a ${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}
  • COL1b ${__CSVRead(random.txt,0)}
  • COL2b ${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}

这将从一行读取两列,从下一个可用行读取两列。如果所有变量都定义在同一个用户参数预处理器上,那么这些行将是连续的。否则,不同的线程可能会抓取下一行。

该功能不适用于大文件,因为整个文件都存储在内存中。对于较大的文件,请使用 CSV 数据集配置元素StringFromFile

__属性

属性函数返回 JMeter 属性的值。如果找不到属性值,并且没有提供默认值,则返回属性名称。提供默认值时,无需提供函数名称 - 参数可以设置为 null,它将被忽略。

例如:

  • ${__property(user.dir)} - user.dir 的返回值
  • ${__property(user.dir,UDIR)} - user.dir 的返回值并保存在 UDIR
  • ${__property(abcd,ABCD,atod)} - 属性 abcd 的返回值(或atod,如果未定义)并保存在 ABCD
  • ${__property(abcd,,atod)} - 属性 abcd 的返回值(或atod,如果未定义)但不保存它

参数

变量的名称

用于重用此函数计算的值的引用名称。

__P

这是一个简化的属性函数,旨在与命令行上定义的属性一起使用。与__property 函数不同,没有将值保存在变量中的选项,如果没有提供默认值,则假定为 1。选择 1 的值是因为它对循环等常见测试变量有效,线程数,斜升等。

例如:

定义属性值:

jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu

获取值:
${__P(group1.threads)} - 返回group1.threads的值
${__P(group1.loops)} - 返回 group1.loops 的值
${__P(hostname,www.dummy.org) } -如果未定义 ,则返回属性 hostname 或www.dummy.org
在上面的示例中,第一个函数调用将返回 7,第二个函数调用将返回 1,最后一个将返回www.dummy.org (除非这些属性已定义别处!)

参数

默认值

属性的默认值。如果省略,默认设置为1

__log

log 函数记录一条消息,并返回其输入字符串

参数

日志级别

OUT,ERR,DEBUG,INFO(默认),WARN 或 ERROR

可抛出的文本

如果非空,则创建一个 Throwable 传递给记录器

评论

如果存在,则显示在字符串中。用于识别正在记录的内容。

OUT 和 ERR 日志级别名称分别用于将输出定向到 System.out 和 System.err。在这种情况下,输出总是被打印出来——它不依赖于当前的日志设置。

${__log(消息)}

写入日志文件为 ......线程名称:消息

${__log(消息,输出)}

写入控制台窗口

${__log(${VAR},,,VAR=)}

写入日志文件为……线程名称 VAR=value

__logn

logn 函数记录一条消息,并返回空字符串

参数

日志级别

OUT,ERR,DEBUG,INFO(默认),WARN 或 ERROR

可抛出的文本

如果非空,则创建一个 Throwable 传递给记录器

OUT 和 ERR 日志级别名称分别用于将输出定向到 System.out 和 System.err。在这种情况下,输出总是被打印出来——它不依赖于当前的日志设置。

${__logn(VAR1=${VAR1},OUT)}

将变量的值写入控制台窗口

__BeanShell

BeanShell 函数评估传递给它的脚本,并返回结果。

为了提高性能,最好使用 __groovy 函数

有关使用 BeanShell 的完整详细信息,请参阅 BeanShell 网站 http://www.beanshell.org/

请注意,不同的解释器用于测试脚本中函数的每个独立出现,但相同的解释器用于后续调用。这意味着变量在对函数的调用中持续存在。

可以从多个线程调用函数的单个实例。但是函数 execute()方法是同步的。

如果定义了属性beanshell.function.init,它将作为源文件的名称传递给解释器。这可用于定义常用方法和变量。bin 目录中有一个示例初始化文件:BeanShellFunction.bshrc。

在执行脚本之前设置以下变量:

(*) 表示这是在处理初始化文件(如果有)之前设置的。其他变量因调用而异。

参数

BeanShell 脚本

beanshell 脚本(不是文件名)

是的

例子:

${__BeanShell(123*456)}

返回 56088

${__BeanShell(source("function.bsh"))}

处理 function.bsh 中的脚本

请记住为文本字符串和表示文本字符串的 JMeter 变量包括任何必要的引号。

__groovy

__groovy 函数评估传递给它 的 Apache Groovy 脚本,并返回结果。

如果定义了属性groovy.utilities,它将由 ScriptEngine 加载。这可用于定义常用方法和变量。bin 目录中有一个示例初始化文件:utility.groovy。

在执行脚本之前设置以下变量:

(*) 表示这是在处理初始化文件(如果有)之前设置的。其他变量因调用而异。

使用此函数时,请使用上面定义的变量,而不是使用字符串替换来访问脚本中的变量。遵循此模式将通过确保可以缓存 Groovy 来确保你的测试是高性能的。

例如,不要执行以下操作:

${__groovy("${myVar}".substring(0\,2))}

想象一下,变量 myVar 随每次交易而变化,上面的 Groovy 无法缓存,因为脚本每次都在变化。

而是执行以下操作,可以缓存:

${__groovy(vars.get("myVar").substring(0\,2))}

参数

要评估的表达式

Apache Groovy 脚本(不是文件名)

本身包含逗号的参数值应根据需要进行转义。如果你需要在参数值中包含逗号,请将其转义为:' \, '

是的

例子:

${__groovy(123*456)}

返回 56088

${__groovy(vars.get("myVar").substring(0\,2))}

如果 var 的值为 JMeter,它将在运行 String.substring(0,2)时返回 JM。请注意,已转义为\,

请记住为文本字符串和表示文本字符串的 JMeter 变量包括任何必要的引号。

__split

split 函数根据分隔符将传递给它的字符串拆分,并返回原始字符串。如果任何分隔符相邻,则返回作为值。拆分字符串在变量${VAR_1}、${VAR_2}等中返回。变量的计数在${VAR_n}中返回。尾随分隔符被视为缺失变量,并返回。此外,为了让它更好地与 ForEach 控制器一起工作, __split 现在删除第一个未使用的变量,以防它是由先前的拆分设置的。

示例: 在测试计划中
定义 VAR =" a||c| "。

${__split(${VAR},VAR,|)}

这将返回 VAR 的内容,即a||c|并设置以下变量:
VAR_n = 4
VAR_1 = a
VAR_2 = ?
VAR_3 = c
VAR_4 = ?
VAR_5 =空

参数

要拆分的字符串

分隔字符串,例如a|b|c

是的

分隔符

分隔符,例如| . 如果省略,则使用 ,。请注意,需要将 , 指定为\,。

__XPath

XPath 函数读取一个 XML 文件并匹配 XPath。每次调用该函数时,都会返回下一个匹配项。在文件末尾,它将环绕到开头。如果没有节点匹配,则函数将返回空字符串,并将警告消息写入 JMeter 日志文件。

请注意,整个 NodeList 都保存在内存中。

例子:

${__XPath(/path/to/build.xml, //target/@name)}

这将匹配 build.xml 中的所有目标并返回下一个 name 属性的内容

参数

要解析的 XML 文件

要解析的 XML 文件

是的

XPath

用于匹配 XML 文件中的节点的 XPath 表达式

是的

__setProperty

setProperty 函数设置 JMeter 属性的值。函数的默认返回值是空字符串,因此函数调用可以在函数有效的任何地方使用。

可以通过将可选的第三个参数设置为`true`来返回原始值。

属性对 JMeter 来说是全局的,因此可以用来在线程和线程组之间进行通信

参数

__时间

time 函数以各种格式返回当前时间。

参数

如果省略格式字符串,则函数返回自纪元以来的当前时间(以毫秒为单位)。如果格式匹配/ddd(其中 ddd 是十进制数字),则该函数返回当前时间(以毫秒为单位)除以 ddd 的值。例如,/1000返回自纪元以来的当前时间(以秒为单位)。否则,将当前时间传递给 SimpleDateFormat。提供了以下速记别名:

  • YMD = yyyyMMdd
  • HMS = HHmmss
  • YMDHMS = yyyyMMdd-HHmmss
  • USER1 = JMeter 属性 time.USER1 中的任何内容
  • USER2 = JMeter 属性 time.USER2 中的任何内容

可以通过设置适当的 JMeter 属性来更改默认值,例如 time.YMD=yyMMdd

${__time(dd/MM/yyyy,)}

如果在 2018 年 1 月 21 日运行, 将返回 21/01/2018

${__time(YMD,)}

如果在 2018 年 1 月 21 日运行, 将返回 20180121

${__time()}

将以毫秒为单位返回时间 1516540541624

__jexl2

参数

以下变量可用于脚本:

Jexl 还可以创建类并在其上调用方法,例如:

Systemclass=log.class.forName("java.lang.System");
now=Systemclass.currentTimeMillis();

请注意,网站上的 Jexl 文档错误地建议div进行整数除法。实际上div/都执行正常的除法。可以得到如下相同的效果:

i= 5 / 2;
i.intValue(); // or use i.longValue()

JMeter 允许表达式包含多个语句。

__jexl3

参数

以下变量可用于脚本:

Jexl 还可以创建类并在其上调用方法,例如:

Systemclass=log.class.forName("java.lang.System");
now=Systemclass.currentTimeMillis();

请注意,网站上的 Jexl 文档错误地建议div进行整数除法。实际上div/都执行正常的除法。可以得到如下相同的效果:

i= 5 / 2;
i.intValue(); // or use i.longValue()

JMeter 允许表达式包含多个语句。

__V

V(变量)函数返回对变量名表达式求值的结果。这可用于评估嵌套变量引用(当前不支持)。

例如,如果有变量 A1、A2 和 N = 1:

  • ${A1} - 工作正常
  • ${A${N}} - 不起作用(嵌套变量引用)
  • ${__V(A${N})} - 工作正常。A${N}变为 A1,__V 函数返回 A1 的值

参数

默认值

未找到变量时的默认值,如果为空且未找到变量,则函数返回变量名称

__evalVar

evalVar 函数返回计算存储在变量中的表达式的结果。

这允许人们从文件中读取字符串,并处理其中的任何变量引用。例如,如果变量query包含select ${column} from ${table}并且columntable包含namecustomers,则${__evalVar(query)} 将评估为从客户中选择名称

参数

__eval

eval 函数返回计算字符串表达式的结果。

这允许在存储在变量中的字符串中插入变量和函数引用。例如,给定以下变量:

  • 姓名\=史密斯
  • 列\=年龄
  • 表\=生日
  • SQL = select ${column} from ${table} where name='${name}'

然后${__eval(${SQL})}将评估为从 name='Smith' 的生日中选择年龄

这可以与 CSV 数据集结合使用,例如 SQL 语句和值都在数据文件中定义。

参数

__char

char 函数将计算数字列表的结果作为 Unicode 字符返回。另请参见下面的__unescape()。

这允许将任意字符值添加到字段中。

参数

Unicode 字符编号(十进制或 0xhex)

要转换为 Unicode 字符 的十进制数(或十六进制数,如果以 0x 为前缀,或八进制数,如果以 0 为前缀)。

是的

示例:
${__char(13,10)} = ${__char(0xD,0xA)} = ${__char(015,012)} = CRLF
${__char(165)} = ¥(日元)

__unescape

unescape 函数返回对 Java 转义字符串求值的结果。另请参见上面的__char()。

这允许人们向字段添加字符,否则这些字符很难通过 GUI 定义(或不可能)。

参数

示例:
${__unescape(\r\n)} = CRLF
${__unescape(1\t2)} = 1 [tab] 2

__unescapeHtml

将包含 HTML 实体转义的字符串转义为包含与转义对应的实际 Unicode 字符的字符串的函数。支持 HTML 4.0 实体。

例如,字符串

${__unescapeHtml(&lt;Fran&ccedil;ais&gt;)}

将返回<Français>。

如果一个实体无法识别,则将其单独放置,并逐字插入结果字符串中。例如${__unescapeHtml(>&zzzz;x)}将返回>&zzzz;x。

使用来自 Commons Lang 的 StringEscapeUtils#unescapeHtml(String) 。

参数

__escapeHtml

使用 HTML 实体对字符串中的字符进行转义的函数。支持 HTML 4.0 实体。

例如,

${__escapeHtml("bread" & "butter")}

返回: 面包 & 黄油 .

使用来自 Commons Lang 的 StringEscapeUtils#escapeHtml(String) 。

参数

__urldecode

解码 application/x-www-form-urlencoded 字符串的函数。注意:使用 UTF-8 作为编码方案。

例如,字符串

${__urldecode(Word+%22school%22+is+%22%C3%A9cole%22+in+french)}

返回 单词school在法语中是école

使用 Java 类 URLDecoder

参数

要解码的字符串

带有要解码的 URL 编码字符的字符串。

是的

__urlencode

将字符串编码为 application/x-www-form-urlencoded 字符串的函数。

例如,字符串

${__urlencode(Word "school" is "école" in french)}

返回 Word+%22school%22+is+%22%C3%A9cole%22+in+french。

使用 Java 类 URLEncoder

参数

要编码的字符串

以 URL 编码字符编码的字符串。

是的

__FileToString

FileToString 函数可用于读取整个文件。每次调用它都会读取整个文件。

如果打开或读取文件发生错误,则函数返回字符串\*\*ERR\*\*

参数

文件名

文件名的路径。(路径可以相对于 JMeter 启动目录)

是的

如果不是平台默认的文件编码

用于读取文件的编码。如果未指定,则使用平台默认值。

变量的名称

引用名称 - refName - 用于重用此函数创建的值。存储值的格式为 ${refName}。

每次执行函数时都会解析文件名、编码和引用名称参数。

__samplerName

samplerName 函数返回当前采样器的名称(即标签)。

该功能在没有关联采样器的测试元素中不起作用。例如测试计划。配置元素也没有关联的采样器。然而,一些配置元素被采样器直接引用,例如 HTTP Header Manager 和 Http Cookie Manager,在这种情况下,函数在 Http Sampler 的上下文中解析。预处理器、后处理器和断言总是有一个关联的采样器。

例子:

${__samplerName()}

参数

变量的名称

引用名称 - refName - 用于重用此函数创建的值。存储值的格式为 ${refName}。

__TestPlanName

TestPlanName 函数返回当前测试计划的名称(可以在 Include Plans 中使用以了解调用测试计划的名称)。

例子:

${__TestPlanName}

将返回你的测试计划的文件名,例如,如果计划在名为 Demo.jmx 的文件中,它将返回` Demo.jmx

__escapeOroRegexpChars

转义 ORO Regexp 元字符的函数,它相当于 Java Regexp Engine 中的\Q \E。

例如,

${__escapeOroRegexpChars([^"].+?,)}

返回: \[\^\"\]\.\+\?。

使用来自 ORO 的 Perl5Compiler#quotemeta(String)。

参数

变量的名称

引用名称 - refName - 用于重用此函数创建的值。存储值的格式为 ${refName}。

__escapeXml

使用 XML 1.0 实体对字符串中的字符进行转义的函数。

例如,

${__escapeXml("bread" & 'butter')}

返回: 面包;& 黄油 .

使用来自 Commons Lang 的 StringEscapeUtils#escapeXml10(String) 。

参数

__timeShift

timeShift 函数返回给定格式的日期,并添加指定的秒数、分钟数、小时数、天数或月数

参数

换班日期

以参数 'Format' 设置的格式指示日期要移位 如果省略,则日期设置为现在

价值转移

根据持续时间的文本表示,例如 PnDTnHnMn.nS,指示要转换的指定秒数、分钟数、小时数或天数。请参阅 https://docs.oracle.com/javase/8/docs/api/java/time/Duration#parse-java.lang.CharSequence-

  • PT20.345S 解析为 20.345 秒
  • PT15M 解析为 15 分钟
  • PT10H 解析为 10 小时
  • P2D 解析为 2 天
  • -P6H3M 解析为 -6 小时 -3 分钟

用于格式的语言环境

语言环境的字符串格式。语言代码必须是小写的。国家代码必须是大写的。分隔符必须是下划线。例如:en_EN 请参阅 http://www.oracle.com/technetwork/java/javase/javase7locales-334809 如果省略,默认情况下该函数使用 ApacheJMeter 语言环境之一。

例子:

${__timeShift(dd/MM/yyyy,21/01/2018,P2D,,)}

返回 23/01/2018

${__timeShift(dd MMMM yyyy,21 février 2018,P2D,fr_FR,)}

2018 年 2 月 23 日回归

__摘要

摘要函数返回特定散列算法中的加密值,带有可选的盐、大写字母和变量名。

参数

例子:

${__digest(MD5,Errare humanum est,,,)}

返回 c49f00b92667a35c63708933384dad52

${__digest(SHA-256,Felix qui potuit rerum cognoscere causas,mysalt,,)}

返回 a3bc6900fe2b2fc5fa8a601a4a84e27a079bf2c581d485009bc5c00516729ac7

__dateTimeConvert

__dateTimeConvert 函数将源格式的日期转换为目标格式,将结果可选地存储在变量名称中。

参数

日期字符串

要从源日期格式转换为目标日期格式的日期字符串。如果源日期格式为空,则此处可以使用日期作为纪元时间。

是的

源日期格式

原始日期格式。如果为空,则日期字符串字段必须是纪元时间。

例子:

${__dateTimeConvert(01212018,MMddyyyy,dd/MM/yyyy,)}

返回 21/01/2018

使用纪元时间值:1526574881000,

${__dateTimeConvert(1526574881000,,dd/MM/yyyy HH:mm,)}

返回 UTC 时间 17/05/2018 16:34 (-Duser.timezone=GMT)

__isPropDefined

__isPropDefined 函数如果属性存在则返回 true,否则返回 false 。

参数

例子:

${__isPropDefined(START.HMS)}

将返回真

__isVarDefined

__isVarDefined 函数如果变量存在则返回 true,否则返回 false 。

参数

例子:

${__isVarDefined(JMeterThread.last_sample_ok)}

将返回真

__changeCase

change case 函数返回一个字符串值,该值已按照特定模式更改。结果可以选择保存在 JMeter 变量中。

参数

改变案例模式

用于更改大小写的模式,例如 ab-CD eF:

  • UPPER 结果为 AB-CD EF
  • 降低结果为 ab-cd ed
  • 将结果大写为 Ab-CD eF

更改大小写模式不区分大小写

是的

例子:

${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}

将返回 AVARO OMNIA DESUNT、INOPI PAUCA、SAPIENTI NIHIL

${__changeCase(LABOR OMNIA VINCIT IMPROBUS,LOWER,)}

将返回劳动力 omnia vincit improbus

${__changeCase(omnibus viis romam pervenitur,CAPITALIZE,)}

将返回 Omnibus viis romam pervenitur

__StringToFile

__StringToFile 函数可用于将字符串写入文件。每次调用它时,它都会将一个字符串写入文件追加或覆盖。

函数的默认返回值是空字符串

要写入的字符串

要写入文件的字符串。
如果你需要在内容中插入换行符,请在字符串中 使用\n 。

是的

附加到文件?

字符串的写法,true 表示追加,false 表示覆盖。如果未指定,则默认附加为 true。

文件编码(如果不是 UTF-8)

用于写入文件的编码。如果未指定,则默认编码为 UTF-8。

20.6 预定义变量

大多数变量是通过调用函数或通过用户定义变量等测试元素设置的;在这种情况下,用户可以完全控制所使用的变量名称。然而,一些变量是由 JMeter 在内部定义的。下面列出了这些。

  • COOKIE_cookiename - 包含 cookie 值(请参阅 HTTP Cookie 管理器
  • JMeterThread.last_sample_ok - 最后一个样本是否正常 - true / false。注意:这是在 PostProcessors 和 Assertions 运行后更新的。
  • START 变量(见下一节)

20.6 预定义属性

JMeter 属性集是从 JMeter 启动时定义的系统属性初始化的;额外的 JMeter 属性在 jmeter.properties、user.properties 或命令行中定义。

JMeter 定义了一些内置属性。下面列出了这些。为方便起见,START 属性也被复制到具有相同名称的变量中。

  • START.MS - JMeter 开始时间(以毫秒为单位)
  • START.YMD - JMeter 开始时间为 yyyyMMdd
  • START.HMS - JMeter 开始时间为 HHmmss
  • TESTSTART.MS - 测试开始时间,以毫秒为单位

请注意,START 变量/属性代表 JMeter 启动时间,而不是测试开始时间。它们主要用于文件名等。