20. 函数和变量¶
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 ”。
或者,只需使用/代替路径分隔符 - 例如C:/test/${test} - Windows JVM 将根据需要转换分隔符。
功能列表,松散地分组为类型。
功能类型 | 姓名 | 评论 | 自从 |
---|---|---|---|
信息 | 线程数 | 获取线程号 | 1.X |
信息 | 线程组名 | 获取线程组名 | 4.1 |
信息 | 采样器名称 | 获取采样器名称(标签) | 2.5 |
信息 | 机器IP | 获取本机IP地址 | 2.6 |
信息 | 机器名 | 获取本地机器名 | 1.X |
信息 | 时间 | 以各种格式返回当前时间 | 2.2 |
信息 | 时移 | 返回各种格式的日期,并添加指定的秒数/分钟数/小时数/天数 | 3.3 |
信息 | 日志 | 记录(或显示)消息(并返回值) | 2.2 |
信息 | 登录 | 记录(或显示)一条消息(空返回值) | 2.2 |
输入 | 字符串从文件 | 从文件中读取一行 | 1.9 |
输入 | 文件到字符串 | 读取整个文件 | 2.4 |
输入 | CSV读取 | 从 CSV 分隔文件读取 | 1.9 |
输入 | XPath | 使用 XPath 表达式从文件中读取 | 2.0.3 |
输入 | 字符串到文件 | 将字符串写入文件 | 5.2 |
计算 | 柜台 | 生成一个递增的数字 | 1.X |
格式化 | 日期时间转换 | 将日期或时间从源格式转换为目标格式 | 4.0 |
计算 | 消化 | 生成摘要(SHA-1、SHA-256、MD5...) | 4.0 |
计算 | 整数 | 添加整数 | 1.8.1 |
计算 | 长和 | 添加长数字 | 2.3.2 |
计算 | 随机的 | 生成一个随机数 | 1.9 |
计算 | 随机日期 | 在特定日期范围内生成随机日期 | 3.3 |
计算 | RandomFromMultipleVars | 从由|分隔的一组变量的值中提取一个元素 | 3.1 |
计算 | 随机字符串 | 生成随机字符串 | 2.6 |
计算 | UUID | 生成随机类型 4 UUID | 2.9 |
脚本 | 时髦的 | 运行 Apache Groovy 脚本 | 3.1 |
脚本 | 豆壳 | 运行 BeanShell 脚本 | 1.X |
脚本 | 脚本 | 处理 JavaScript (Nashorn) | 1.9 |
脚本 | jexl2 | 评估 Commons Jexl2 表达式 | jexl2(2.1.1) |
脚本 | jexl3 | 评估 Commons Jexl3 表达式 | jexl3 (3.0) |
特性 | isPropDefined | 测试属性是否存在 | 4.0 |
特性 | 财产 | 读取属性 | 2.0 |
特性 | 磷 | 读取属性(速记方法) | 2.0 |
特性 | 设置属性 | 设置 JMeter 属性 | 2.1 |
变量 | 分裂 | 将字符串拆分为变量 | 2.0.2 |
变量 | 评估 | 计算变量表达式 | 2.3.1 |
变量 | 评估变量 | 计算存储在变量中的表达式 | 2.3.1 |
特性 | isVarDefined | 测试变量是否存在 | 4.0 |
变量 | 五 | 评估变量名 | 2.3RC3 |
细绳 | 字符 | 从数字列表中生成 Unicode 字符值 | 2.3.3 |
细绳 | 变更案例 | 改变大小写遵循不同的模式 | 4.0 |
细绳 | 转义HTML | 使用 HTML 编码对字符串进行编码 | 2.3.3 |
细绳 | escapeOroRegexpChars | 引用 ORO 正则表达式使用的元字符 | 2.9 |
细绳 | 逃逸Xml | 使用 XML 编码对字符串进行编码 | 3.2 |
细绳 | 正则表达式函数 | 使用正则表达式解析先前的响应 | 1.X |
细绳 | 逃逸 | 处理包含 Java 转义的字符串(例如 \n & \t) | 2.3.3 |
细绳 | 转义HTML | 解码 HTML 编码的字符串 | 2.3.3 |
细绳 | 网址解码 | 解码 application/x-www-form-urlencoded 字符串 | 2.10 |
细绳 | 网址代码 | 将字符串编码为 application/x-www-form-urlencoded 字符串 | 2.10 |
细绳 | 测试计划名称 | 返回当前测试计划的名称 | 2.6 |
20.1 函数可以做什么¶
有两种函数:用户定义的静态值(或变量)和内置函数。
用户定义的静态值允许用户定义在编译测试树并提交运行时用它们的静态值替换的变量。此替换在测试运行开始时发生一次。这可用于替换所有 HTTP 请求的 DOMAIN 字段,例如 - 使更改测试以针对具有相同测试的不同服务器变得简单。
请注意,变量当前不能嵌套;即${Var${N}}不起作用。__V (变量)函数可用于执行此操作:$ {__V(Var${N})}。您也可以使用${__BeanShell(vars.get("Var${N}")}。
这种类型的替换在没有功能的情况下是可能的,但不太方便且不太直观。它要求用户创建默认配置元素来填充采样器的空白值。变量允许仅替换任何给定值的一部分,而不仅仅是填充空白值。
使用内置函数,用户可以在运行时根据以前的响应数据、函数所在的线程、时间和许多其他来源计算新值。这些值是在整个测试过程中为每个请求生成的。
20.2 函数和变量可以用在什么地方?¶
函数和变量可以写入任何测试组件的任何字段(除了 TestPlan - 见下文)。某些字段不允许使用随机字符串,因为它们需要数字,因此不会接受函数。但是,大多数字段都允许使用函数。
测试计划中使用的功能有一些限制。JMeter线程变量在处理函数的时候还没有完全设置好,所以作为参数传递的变量名不会设置,变量引用也不起作用,所以split()和regex()以及变量求值函数都不会不工作。threadNum ()函数不起作用(并且在测试计划级别没有意义)。以下功能在测试计划上应该可以正常工作:
- 整数
- 长和
- 机器名
- 豆壳
- 时髦的
- 脚本
- jexl2/jexl3
- 随机的
- 时间
- 属性函数
- 日志功能
配置元素由单独的线程处理。因此,诸如__threadNum之类的函数在用户定义变量等元素中无法正常工作。另请注意,UDV 元素中定义的变量在处理完该元素后才可用。
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 采样器配合使用效果很好,因为它们可用于测试 Javascript、Jexl 和 BeanShell 脚本。
函数可以引用变量和其他函数,例如 ${__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 使用该匹配。' 1 ' 表示找到的第一个匹配项,' 2 ' 表示第二个匹配项,依此类推
- RAND - 告诉 JMeter 随机选择一个匹配项。
- ALL - 告诉 JMeter 使用所有匹配项,并为每个匹配项创建一个模板字符串,然后将它们全部附加在一起。这个选项很少使用。
- 一个介于 0 和 1 之间的浮点数 - 告诉 JMeter 使用以下公式找到第 X个匹配项:(number_of_matches_found * float_number) 四舍五入到最接近的整数。
存储的值是${refName}(替换模板字符串)和${refName_g#},其中“ # ”是正则表达式中的组号(“ 0 ”可用于引用整个匹配项)。
__计数器¶
计数器每次调用时都会生成一个新数字,从 1 开始,每次递增 +1。计数器可以配置为将每个模拟用户的值分开,或者为所有用户使用相同的计数器。如果每个用户的值分别递增,这就像计算测试计划的迭代次数。全局计数器就像计算该请求运行了多少次。
计数器使用一个整数变量来保存计数,因此它的最大值为 2,147,483,647。
计数器函数实例是完全独立的。全局计数器 - “ FALSE ” - 由每个计数器实例单独维护。
同一迭代中的多个__counter函数调用不会进一步增加该值。
如果您想要为每个样本增加一个计数,请使用预处理器中的函数,例如User Parameters。
参数 ¶
存储值的格式为 ${refName}。这允许您保留一个计数器并在多个位置引用其值。
__threadNum ¶
线程号函数只是返回当前正在执行的线程号。这些数字仅相对于它们的 ThreadGroup 是局部唯一的,这意味着从这个函数的角度来看,一个线程组中的线程 #1 与另一个线程组中的线程 #1 无法区分。
ctx.getThreadNum()
此函数没有参数。
使用示例:
${__threadNum}返回一个介于 1 和包含线程组中配置的最大运行线程数之间的数字
__threadGroupName ¶
线程组名称函数只返回正在执行的线程组的名称。
此函数没有参数。
使用示例:
${__threadGroupName}
__intSum ¶
intSum 函数可用于计算两个或多个整数值的总和。
参数 ¶
例子:
${__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 数据集配置测试元素。但是,目前不支持多个输入文件。
每次调用它都会从文件中读取下一行。所有线程共享同一个实例,因此不同的线程将得到不同的行。当到达文件末尾时,它将重新从头开始读取,除非已达到最大循环计数。如果测试脚本中有多个对该函数的引用,则每个引用都将独立打开文件,即使文件名相同。[如果要在其他地方再次使用该值,请为每个函数调用使用不同的变量名。]
如果打开或读取文件发生错误,则函数返回字符串“ **ERR** ”
参数 ¶
打开或重新打开文件时解析文件名参数。
每次执行函数时都会解析引用名称参数(如果提供)。
使用序列号:
使用可选序列号时,路径名用作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 函数返回本地主机名。这使用 Java 方法InetAddress.getLocalHost()并将其传递给getHostName()
例子:
${__machineName()}将返回机器的主机名
${__machineName}将返回机器的主机名
__machineIP ¶
machineIP 函数返回本地 IP 地址。这使用 Java 方法InetAddress.getLocalHost()并将其传递给getHostAddress()
例子:
${__machineIP()}将返回机器的 IP 地址
${__machineIP}将返回机器的 IP 地址
__javaScript ¶
javaScript 函数执行一段 JavaScript(不是 Java!)代码并返回其值
JMeter Javascript 函数调用一个独立的 JavaScript 解释器。Javascript用作脚本语言,因此您可以进行计算等。
对于 Rhino 引擎,请参阅Mozilla Rhino 概述
以下变量可用于脚本:
- log -函数的Logger
- ctx - JMeterContext对象
- vars - JMeterVariables对象
- threadName - 包含当前线程名称的字符串
- sampler - 当前的Sampler对象(如果有)
- sampleResult - 以前的 SampleResult对象(如果有)
- props - JMeterProperties(类java.util.Properties)对象
Rhinoscript 允许通过其 Packages 对象访问静态方法。请参阅脚本 Java文档。例如,可以访问 JMeterContextService 静态方法: Java.type("org.apache.jmeter.threads.JMeterContextService").getTotalThreads()
参数 ¶
- new Date() - 返回当前日期和时间
- Math.floor(Math.random()*(${maxRandom}+1)) - 0和变量maxRandom 之间的随机数
- ${minRandom}+Math.floor(Math.random()*(${maxRandom}-${minRandom}+1)) - 变量minRandom和maxRandom之间的随机数
- "${VAR}"=="abcd"
${__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(0,10)}将返回 0 到 10 之间的随机数
${__Random(0,10, MYVAR)}将返回 0 到 10 之间的随机数并将其存储在MYVAR中。${MYVAR}将包含随机数
__随机日期¶
RandomDate 函数返回一个介于给定开始日期和结束日期值之间的随机日期。
参数 ¶
例子:
${__RandomDate(,,2050-07-08,,)}将返回从现在到2050-07-08之间的随机日期。例如2039-06-21
${__RandomDate(dd MM yyyy,,08 07 2050,,)}将返回具有自定义格式的随机日期,例如04 03 2034
__随机字符串¶
RandomString 函数使用要使用的字符中的字符返回长度的随机字符串。
例子:
${__RandomString(5)}将返回一个 5 个字符的随机字符串,该字符串是否可读
${__RandomString(10,abcdefg)}将返回从abcdefg集合中挑选的 10 个字符的随机字符串,例如cdbgdbeebd或adbfeggfad,...
${__RandomString(6,a12zeczclk, MYVAR)}将返回从a12zeczclk集合中挑选的 6 个字符的随机字符串,并将结果存储在MYVAR中,MYVAR将包含类似2z22ak或z11kce的字符串,...
__RandomFromMultipleVars ¶
RandomFromMultipleVars 函数根据Source Variables提供的变量值返回一个随机值。
变量可以是简单的或多值的,因为它们可以由以下提取器生成: 多值变量是在您为Match Numbers设置-1时提取的变量。这导致创建名为varName_matchNr的匹配编号变量,并为每个值创建变量varName_n,其中 n = 1、2、3 等。例子:
${__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功能允许多次打开同一个文件,也允许使用更短的文件名 。
每个线程都有自己的内部指针,指向文件数组中的当前行。当一个线程第一次引用该文件时,它将被分配到数组中的下一个空闲行,因此每个线程将访问与所有其他线程不同的行。[除非线程数多于数组中的行数。]
参数 ¶
例如,您可以如下设置一些变量:
- 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)}
__属性¶
属性函数返回 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 (除非这些属性已定义别处!)
__log ¶
log 函数记录一条消息,并返回其输入字符串
参数 ¶
OUT和ERR日志级别名称分别用于将输出定向到System.out和System.err。在这种情况下,输出总是被打印出来——它不依赖于当前的日志设置。
- ${__log(消息)}
- 写入日志文件为“ ......线程名称:消息”
- ${__log(消息,输出)}
- 写入控制台窗口
- ${__log(${VAR},,,VAR=)}
- 写入日志文件为“ ……线程名称 VAR=value ”
__logn ¶
logn 函数记录一条消息,并返回空字符串
参数 ¶
OUT和ERR日志级别名称分别用于将输出定向到System.out和System.err。在这种情况下,输出总是被打印出来——它不依赖于当前的日志设置。
- ${__logn(VAR1=${VAR1},OUT)}
- 将变量的值写入控制台窗口
__BeanShell ¶
BeanShell 函数评估传递给它的脚本,并返回结果。
有关使用 BeanShell 的完整详细信息,请参阅 BeanShell 网站http://www.beanshell.org/
可以从多个线程调用函数的单个实例。但是函数execute()方法是同步的。
如果定义了属性“ beanshell.function.init ”,它将作为源文件的名称传递给解释器。这可用于定义常用方法和变量。bin 目录中有一个示例初始化文件:BeanShellFunction.bshrc。
在执行脚本之前设置以下变量:
- log - BeanShell 函数的Logger (*)
- ctx - JMeterContext对象
- vars - JMeterVariables对象
- props - JMeterProperties(类java.util.Properties)对象
- threadName - 线程名(字符串)
- Sampler - 当前的Sampler(如果有)
- SampleResult - 当前的SampleResult(如果有)
例子:
- ${__BeanShell(123*456)}
- 返回56088
- ${__BeanShell(source("function.bsh"))}
- 处理function.bsh中的脚本
__groovy ¶
__groovy函数评估传递给它 的Apache Groovy脚本,并返回结果。
如果定义了属性“ groovy.utilities ”,它将由 ScriptEngine 加载。这可用于定义常用方法和变量。bin目录中有一个示例初始化文件:utility.groovy。
在执行脚本之前设置以下变量:
- log - groovy 函数的Logger (*)
- ctx - JMeterContext对象
- vars - JMeterVariables对象
- props - JMeterProperties(类java.util.Properties)对象
- threadName - 线程名(字符串)
- sampler - 当前的Sampler,如果有的话
- prev - 上一个SampleResult(如果有)
- OUT - System.out
(*) 表示这是在处理初始化文件(如果有)之前设置的。其他变量因调用而异。
例如,不要执行以下操作:
${__groovy("${myVar}".substring(0\,2))}
想象一下,变量 myVar 随每次交易而变化,上面的 Groovy 无法缓存,因为脚本每次都在变化。
而是执行以下操作,可以缓存:
${__groovy(vars.get("myVar").substring(0\,2))}
参数 ¶
例子:
-
${__groovy(123*456)}
- 返回56088
-
${__groovy(vars.get("myVar").substring(0\,2))}
- 如果 var 的值为JMeter,它将在运行String.substring(0,2)时返回JM。请注意,已转义为\,
__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 =空
参数 ¶
__XPath ¶
XPath 函数读取一个 XML 文件并匹配 XPath。每次调用该函数时,都会返回下一个匹配项。在文件末尾,它将环绕到开头。如果没有节点匹配,则函数将返回空字符串,并将警告消息写入 JMeter 日志文件。
${__XPath(/path/to/build.xml, //target/@name)}这将匹配build.xml中的所有目标并返回下一个 name 属性的内容
__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 函数返回计算 Commons JEXL 表达式的结果。有关 JEXL 表达式的更多信息,请参阅下面的链接。
__jexl2函数使用 Commons JEXL 2
以下变量可用于脚本:
- log -函数的Logger
- ctx - JMeterContext对象
- vars - JMeterVariables对象
- props - JMeterProperties(类java.util.Properties)对象
- threadName - 包含当前线程名称的字符串
- sampler - 当前的Sampler对象(如果有)
- sampleResult - 以前的 SampleResult对象(如果有)
- OUT - System.out - 例如OUT.println("message")
Jexl 还可以创建类并在其上调用方法,例如:
Systemclass=log.class.forName("java.lang.System"); now=Systemclass.currentTimeMillis();请注意,网站上的 Jexl 文档错误地建议“ div ”进行整数除法。实际上“ div ”和“ / ”都执行正常的除法。可以得到如下相同的效果:
i= 5 / 2; i.intValue(); // or use i.longValue()
__jexl3 ¶
jexl 函数返回计算 Commons JEXL 表达式的结果。有关 JEXL 表达式的更多信息,请参阅下面的链接。
__jexl3函数使用 Commons JEXL 3
以下变量可用于脚本:
- log -函数的Logger
- ctx - JMeterContext对象
- vars - JMeterVariables对象
- props - JMeterProperties(类java.util.Properties)对象
- threadName - 包含当前线程名称的字符串
- sampler - 当前的Sampler对象(如果有)
- sampleResult - 以前的 SampleResult对象(如果有)
- OUT - System.out - 例如OUT.println("message")
Jexl 还可以创建类并在其上调用方法,例如:
Systemclass=log.class.forName("java.lang.System"); now=Systemclass.currentTimeMillis();请注意,网站上的 Jexl 文档错误地建议“ div ”进行整数除法。实际上“ div ”和“ / ”都执行正常的除法。可以得到如下相同的效果:
i= 5 / 2; i.intValue(); // or use i.longValue()
__V ¶
V(变量)函数返回对变量名表达式求值的结果。这可用于评估嵌套变量引用(当前不支持)。
例如,如果有变量A1、A2和N = 1:
- ${A1} - 工作正常
- ${A${N}} - 不起作用(嵌套变量引用)
- ${__V(A${N})} - 工作正常。A${N}变为A1,__V函数返回A1的值
__evalVar ¶
evalVar 函数返回计算存储在变量中的表达式的结果。
这允许人们从文件中读取字符串,并处理其中的任何变量引用。例如,如果变量“ query ”包含“ select ${column} from ${table} ”并且“ column ”和“ table ”包含“ name ”和“ customers ”,则${__evalVar(query)} 将评估为“从客户中选择名称”。
__eval ¶
eval 函数返回计算字符串表达式的结果。
这允许在存储在变量中的字符串中插入变量和函数引用。例如,给定以下变量:
- 姓名=史密斯
- 列=年龄
- 表=生日
- SQL = select ${column} from ${table} where name='${name}'
这可以与 CSV 数据集结合使用,例如 SQL 语句和值都在数据文件中定义。
__char ¶
char 函数将计算数字列表的结果作为 Unicode 字符返回。另请参见下面的__unescape()。
这允许将任意字符值添加到字段中。
示例:
${__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(<Français>)}将返回<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。
__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。
__FileToString ¶
FileToString 函数可用于读取整个文件。每次调用它都会读取整个文件。
如果打开或读取文件发生错误,则函数返回字符串“ **ERR** ”
参数 ¶
每次执行函数时都会解析文件名、编码和引用名称参数。
__samplerName ¶
samplerName 函数返回当前采样器的名称(即标签)。
该功能在没有关联采样器的测试元素中不起作用。例如测试计划。配置元素也没有关联的采样器。然而,一些配置元素被采样器直接引用,例如 HTTP Header Manager 和 Http Cookie Manager,在这种情况下,函数在 Http Sampler 的上下文中解析。预处理器、后处理器和断言总是有一个关联的采样器。
例子:
${__samplerName()}
__TestPlanName ¶
TestPlanName 函数返回当前测试计划的名称(可以在 Include Plans 中使用以了解调用测试计划的名称)。
例子:
${__TestPlanName}将返回您的测试计划的文件名,例如,如果计划在名为 Demo.jmx 的文件中,它将返回“ Demo.jmx
__escapeOroRegexpChars ¶
转义ORO Regexp 元字符的函数,它相当于Java Regexp Engine 中的\Q \E。
例如,
${__escapeOroRegexpChars([^"].+?,)}返回: \[\^\"\]\.\+\?。
使用来自 ORO 的 Perl5Compiler#quotemeta(String)。
__escapeXml ¶
使用 XML 1.0 实体对字符串中的字符进行转义的函数。
例如,
${__escapeXml("bread" & 'butter')}返回: “面包”;& “黄油” .
使用来自 Commons Lang 的 StringEscapeUtils#escapeXml10(String) 。
__timeShift ¶
timeShift 函数返回给定格式的日期,并添加指定的秒数、分钟数、小时数、天数或月数
参数 ¶
- PT20.345S解析为 20.345 秒
- PT15M解析为 15 分钟
- PT10H解析为 10 小时
- P2D解析为 2 天
- -P6H3M解析为 -6 小时 -3 分钟
例子:
${__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 日回归
__摘要¶
摘要函数返回特定散列算法中的加密值,带有可选的盐、大写字母和变量名。
参数 ¶
- MD2
- MD5
- SHA-1
- SHA-224
- SHA-256
- SHA-384
- SHA-512
例子:
${__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)
__isVarDefined ¶
__isVarDefined函数如果变量存在则返回 true,否则返回 false 。
例子:
${__isVarDefined(JMeterThread.last_sample_ok)}将返回真
__changeCase ¶
change case 函数返回一个字符串值,该值已按照特定模式更改。结果可以选择保存在 JMeter 变量中。
参数 ¶
- 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
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 启动时间,而不是测试开始时间。它们主要用于文件名等。