本文内容总结了 JMeter 中的各种常用函数、复杂函数、对我比较有用的函数 等等。
但是,并没有包含全部函数。

JMeter 提供了很多函数,可以很方便的实现一些小功能,几乎可以用于测试计划中的任何元件。

函数调用的格式如下所示:

${__functionName(var1,var2,var3)}

其中,__functionName 为函数名,括号内是函数的参数,无参数时可以不用括号,如 ${__UUID}

Tips:

  • 如果参数包含逗号,那么一定要使用 \ 来转义,否则 JMeter 会把它当作一个参数分隔符;
  • 实际使用时,一般通过函数助手对话框来生成函数字符串,不容易出错。

JMeter 中的函数主要分为如下几类:

函数类型 函数名称 函数作用 启用版本
获取信息函数 __TestPlanName 返回当前测试计划的名称
__threadGroupName 返回当前线程组的名称 4.1
__threadNum 返回当前正在执行的线程的编号 1.X
__samplerName 返回当前请求的名称 2.5
__log 输出日志信息 2.2
__time 以多种格式返回当前时间 2.2
数据输入函数 __StringFromFile 从文本文件中读取字符串,每次调用读取一行 1.9
__FileToString 把文件读取成一个字符串,每次调用都是读取整个文件 2.4
__CSVRead 返回当前正在执行的线程的编号 1.9
__XPath 使用 XPath 语法匹配 XML文件 2.0
数据计算函数 __counter 计数器函数 1.9
__intSum 对多个整数求和 1.8.1
__longSum 长整型求和 2.3.2
__Random 返回指定最大值和最小值之间的随机整数 1.9
__RandomDate 返回给定开始日期和结束日期值之间的随机日期 3.3
_RandomString 根据给定的字符生成指定长度的随机字符串 2.6
__UUID 通用唯一标识符函数 2.9
属性信息函数 __isPropDefined 判断属性是否存在 4.0
__property 对多个整数求和 1.8.1
__P 简化的属性函数,用于与命令行上定义的属性一起使用 2.0
__setProperty 简化的属性函数,用于与命令行上定义的属性一起使用 2.0
字符串操作函数 __split 根据分隔符拆分字符串为多个变量 2.0.2
__changeCase 转换大小写 4.0
__regexFunction 使用正则表达式解析之前的响应结果 1.X
脚本函数 __BeanShell 执行 beanshell 脚本 1.X
__javaScript 执行 js 脚本 1.9

一、获取信息函数

1、__TestPlanName

  • 用法:${__TestPlanName},返回当前测试计划的名称;
  • 如:测试计划名称是 Demo.jmx, 即返回 Demo.jmx

2、__threadGroupName

  • 用法:${__threadGroupName},返回当前线程组的名称,从 4.1 版本开始启用。
  • 该函数不能用在任何配置元件中(如用户定义的变量),因为配置元件是由另外的独立线程运行的,它也不能在测试计划(Test Plan)中使用。

3、__threadNum

  • 用法:${__threadNum},返回当前正在执行的线程的编号,而且不依赖于线程组;
  • 也就是说以这个函数的结果来看,不能区别线程组1的线程#1 和 线程组2的线程#1,如下图所示:
  • 不能用在配置元件 和 测试计划中。

4、__samplerName

  • 用法:${__samplerName()},返回当前请求的名称。

5、__log

  • 记录一条日志,并返回函数的输入字符串。
  • 可以设置不同的日志级别,如 OUTERR 将会分别输出记录到 System.outSystem.err 中。在这种情况下,输出总是会被打印(它不依赖于当前的日志设置)。

示例:

${__log(Message)}:写入日志文件,形如 "...thread Name : Message"。${__log(Message,OUT)}:写到控制台窗口。${__log(${VAR},,,VAR=)}:写入日志文件,形如"...thread Name VAR=value"。

6、__time

  • 以多种格式返回当前时间
  • 如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。

jmeter 中默认定义的时间格式属性值有:

YMD = yyyyMMdd。
HMS = HHmmss。
YMDHMS = yyyyMMdd-HHmmss。
USER1 = JMeter属性time.USER1。
USER2 = JMeter属性time.USER2。
用户可以通过修改JMeter属性来改变默认格式,例如,time.YMD=yyMMdd。

使用示例:

${__time()} 返回'1548133155699'${__time(YMD,)} 返回'20190122'${__time(dd/MM/yyyy,)} 返回'22/01/2019'

二、数据输入函数

1、__StringFromFile

1.1 作用

  • 用于从文本文件中读取字符串,每次读取一行,支持读取多个文件。
  • 使用配置元件CSV Data Set Config ,也能达到相同的目的,而且方法更简单,但是它目前不支持多个输入文件。
  • 每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)。
  • 如果在打开或者读取文件时发生错误,那么函数就会返回字符串 **ERR**

1.2 参数

参数 描述 是否必填
文件名 文件名的路径 (路径可以相对于 JMeter 启动目录)。
如果使用序列号,路径名称应该适合传递到 DecimalFormat。
变量名 用于后续调用该函数的变量名称
启动序号 初始序列号(如果省略,则将结束序列号视为循环计数)
末端序号 最终序列号(如果省略,序列号可以无限制地增加)
  • 启动序号:初始的序列号,如果省略,那么结束序列号就代表文件的循环读取次数。
  • 末端序号:结束序列号,如果省略,那么序列号会无限增长。

1.3 示例

读取单个文件:
${_StringFromFile(demo.txt,,,)}    读取demo.txt读取多个文件,需要在文件名中使用序列号:
${_StringFromFile(PIN.DAT,,,2)}    读取 PIN.DAT 两次
${_StringFromFile(PIN#'.'DAT,,1,3)}    读取 PIN1.DAT PIN2.DAT PIN3.DAT
${_StringFromFile(pin000'.'dat,,6,8)}    读取 pin006.dat pin007.dat pin008.dat

使用序列号时,路径名被用作 java.text.DecimalFormat 的格式字符串。当前序列号作为唯一参数传入。如果未指定开始序列号,则按原样使用路径名称。

1.4 格式化序列

常用的两个格式化序列:

  • #:插入数字,没有前导零或空格。
  • 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

注意:上面的 . 是格式化字符,必须用单引号括起来。

2、__FileToString

  • 把文件读取成一个字符串,每次调用都是读取整个文件。
  • 如果出现打开或读取文件的错误,则函数将返回字符串 **ERR**

参数:

参数 描述 是否必填
文件名 文件名的路径。(路径可以相对于JMeter启动目录)
文件编码 用于读取文件的编码。如果未指定,则使用平台默认值。
变量名 用于后续调用该函数的变量名称。

3、__CSVRead

3.1 作用

  • 从一个 CSV 文件中返回一个字符串,支持多个文件名。
  • 当第一次调用该函数时,文件将被打开并读取到一个内部数组中。如果检测到空行,这将被视为文件的末尾。
  • 所有对同一文件名的后续引用都使用相同的内部数组,文件名区分大小写。
  • 每个线程都有自己的指向文件数组中当前行的内部指针。当线程首先引用文件时,它将在数组中分配下一个空闲行,因此每个线程将访问与所有其他线程不同的行(除非数组中的线程多于行)。

3.2 参数

参数 描述 是否必填
文件名 要读取的文件名
列号 文件中的列号。0–第一列,1–第二列,next–文件的下一行。

3.3 示例

读取文件中的第1行第1列:
${__CSVRead(random.txt,0)}读取文件中的第1行第2列,并进入文件下一行:
${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}读取文件第2行第1列:
${__CSVRead(random.txt,0)}读取文件中的第2行第2列,并进入文件下一行:
${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}

注意:

  • 该函数不适合用于大型文件,因为整个文件都存储在内存中。
  • 对于较大的文件,最好使用 CSV Data Set Config 或者 StringFromFile
  • 默认情况下,该函数在每个逗号处拆分行。如果要输入包含逗号的列,则需要通过设置属性将分隔符更改为不出现在任何列数据中的字符,修改 jmeter.properties 文件中的 csvread.delimiter=

4、__XPath

  • 该函数读取 XML 文件,并在文件中寻找与指定 XPath 相匹配的地方。
  • 每调用函数一次,就会返回下一个匹配项。到达文件末尾后,会从头开始。如果没有匹配的节点,那么函数会返回空字符串,另外,还会向JMeter日志文件写一条警告信息。
  • 整个节点列表都会被保存在内存之中,所以文件较大时不适合使用。

示例:

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

这会找到 build.xml 文件中的所有目标节点,并返回下一个 name 属性的内容。

三、数据计算函数

1、 __counter

  • 每次调用该计数器函数都会产生一个新值,从1开始每次加1。
  • 计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。
  • 如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。
  • 计数器使用一个整数值来记录,允许的最大值为 2,147,483,647。
  • 目前计数器函数实例是独立实现的(JMeter 2.1.1及其以前版本,使用一个固定的线程变量来跟踪每个用户的计数器,因此多个计数器函数会操作同一个值)。全局计数器(FALSE)的每个计数器实例都是独立维护的。
  • 该函数也有对应的配置元件:计数器,功能类似。

2、__intSum

  • 函数 __intSum 可以被用来计算两个或者更多整数值的和。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。

注意:
在 4.0 版本之前,当有多个整数时,要通过点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击 生成 的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。 在 4.0 版本之后,该问题已解决。

4.0 之前版本添加多个整数示例如下:

3、__longSum

该函数用来计算两个或更多长整型值的和,使用方法跟上面的 __intSum 函数一样,这里不再赘述。

4、__Random

  • 随机数函数返回指定最大值和最小值之间的随机整数,
返回 0--10 之间的随机整数:
${__Random(0,10)}

5、__RandomDate

  • 返回位于给定开始日期和结束日期值之间的随机日期。

    示例:
${__RandomDate(,,2050-07-08,,)}  随机返回一个从现在到 2050-07-08 的日期,例如 2039-06-21${__RandomDate(dd MM yyyy,,08 07 2050,,)}  返回带有自定义格式的随机日期,如 04 03 2034

6、_RandomString

  • 根据给定的字符,生成指定长度的随机字符串。
  • Random string length:生成的随机字符的长度
  • Chars to use for random string generation:用来生成随机字符串的字符,可以是纯数字,纯字符,字符字母数字组合。
  • Name of variable in which to store the result (optional):保存结果的变量

例如:
${__RandomString(6,abcdefgh1234566,ranstr)}
随机生成一个6位长度的字符串,并保存在变量 ranstr 中,后续可以通过 ${ranstr} 来调用。

7、__UUID

  • 通用唯一标识符函数,生成一个32位不重复的随机字符串。

示例:
${__UUID()}
返回结果类似:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd

四、属性信息函数

1、__isPropDefined

  • 用于判断属性是否存在。

示例:

${__isPropDefined(START.HMS)}
判断属性 START.HMS 是否存在,返回 true。

2、__property

  • 获取属性值。

示例:

${__property(user.dir)}  返回 user.dir 的值。
${__property(user.dir,UDIR)}   返回 user.dir 的值,并保存在变量 UDIR 中。${__property(abcd,ABCD,atod)}   返回属性 abcd 的值,如果该属性未定义则返回 atod,并保存在变量 ABCD 中。
${__property(abcd,,atod)}    返回属性 abcd 的值,如果该属性未定义则返回 atod,不保存结果值。

3、__P

  • 这是一个简化的属性函数,用于与命令行上定义的属性一起使用。
  • _property 函数不同,没有选项可以将值保存在变量中,如果不提供默认值,则假定为1。

示例:

在脚本中定义如下两个函数:
${__P(group1.threads, 10)}
${__P(group1.loops)}在命令行中调用:
jmeter -Jgroup1.threads=50  -Jgroup1.loops=100   执行时,两个参数分别是 50、100。若命令行中不设置属性,执行时,两个参数分别是 10、1。

4、__setProperty

  • 该函数用于设置 JMeter 属性的值。
  • 函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。

  • 通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。
  • 属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

五、字符串操作函数

1、__split

  • 根据分隔符拆分字符串为多个变量。
  • 当两个分隔符中间没有字符时,返回 ?
  • 被拆分出来的字符串,保存在变量中,类似这样:${VAR_1}, ${VAR_2} ...,总个数是 ${VAR_n}
  • 如果最后一个字符是分隔符,也会返回 ?

示例:

定义字符串:
VAR="a||c|"调用 split 函数:
${__split(${VAR},VAR,|)}
返回 "a||c|",并生成如下变量:
VAR_n=4
VAR_1=a
VAR_2=?
VAR_3=c
VAR_4=?
VAR_5=null

2、__changeCase

  • 根据指定的模式,修改字符串大小写;
  • 可选模式有:UPPERLOWERCAPITALIZE

示例:

UPPER--转换成大写字母:
${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}
返回 AVARO OMNIA DESUNT, INOPI PAUCA, SAPIENTI NIHILLOWER--转换成小写字母:
${__changeCase(LABOR OMNIA VINCIT IMPROBUS,LOWER,)}
返回 labor omnia vincit improbusCAPITALIZE--单词首字母大写:
${__changeCase(omnibus viis romam pervenitur,CAPITALIZE,)}
返回 Omnibus viis romam pervenitur

3、__regexFunction

  • 使用正则表达式解析之前的响应结果。

  • 该函数使用用户提供的正则表达式来解析前面的服务器响应(或者是某个变量值)。函数会返回包含变量值的模板字符串。
  • 在函数的第6个参数中,可以指定一个引用名,保存变量值,供后续调用。

变量调用示例:

Name of variable in which to store the result:在这个参数中设置变量名为 refName ,那么我们可以使用:

${refName}  来引用第2个参数(Template for the replacement string)的计算结果,这依赖于函数的解析结果。
${refName_g0}   来引用函数解析后发现的所有匹配结果。
${refName_g1}  来引用函数解析后发现的第一个匹配组合。
${refName_g#}  来引用函数解析后发现的第n个匹配组合。
${refName_matchNr}  来引用函数总共发现的匹配组合数目。

具体参数描述如下:

其实这个函数的作用跟正则表达式提取器的作用是类似的。

六、脚本函数

1、__BeanShell

  • 它有两个参数,第一个参数是要执行的语句,可以是beanshell语句或者是文件地址,是必选参数;
  • 第二个参数是保存结果的变量名称,非必选参数。

示例:

${__BeanShell(123*456)}  返回56088${__BeanShell(source("function.bsh"))}  会执行外部脚本function.bsh,并返回结果${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName  = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}  根据不同系统返回端口号

与 beanshell 元件比较:
该函数与 beanshell 元件(beanshell sampler、beanshell preprocess等)作用是一样的,只是 beanshell 函数更常用于一些简单的判断或计算等,可以把少量的脚本放在函数中直接赋值给一个变量,而不用总是添加 beanshell 元件。

2、__javaScript

  • 用来执行 JavaScript 脚本片段,并返回结果值。
  • 该函数会调用标准的 JavaScript 解释器,还可以直接调用 jmeter 的内置函数。

注意:文本字符串要添加必要的引号。如果表达式中有逗号,要确保对其转义。

例如:${__javaScript('${sp}'.slice(7\,99999))},对 7 之后的逗号进行了转义。

【JMeter】总结 jmeter 中各种函数相关推荐

  1. 关于Jmeter中的函数和变量用法

    以下内容来自官方页面,链接:Apache JMeter - User's Manual: Functions and Variables github 20. 函数和变量 JMeter 函数是可以填充 ...

  2. python函数助手_转jmeter(十五)函数助手

    由于时间和版本问题,其中有些内容和排版我做了修改和重新整理,使其更符合最新的jmeter版本. 一.使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷 ...

  3. Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文

    在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...

  4. 将jmeter响应结果中部分数据保存到本地文件

    以登录接口为例,将jmeter响应结果中的data中的username字段的值,导出到本地文件,文件格式可以是.csv,txt 等等: 1.建一个登录接口的线程组: 1)新增一个--HTTP信息头管理 ...

  5. 如何在JMeter负载测试中模拟不同的网络速度

    移动终于超越了桌面流量 - 这种趋势看起来有望上升.但这对我们意味着什么? 对于初学者来说,这意味着现在,我们比以往任何时候都更需要在运行性能测试时关注移动用户.如果我们的移动网站或应用程序表现不佳 ...

  6. 在jmeter中怎么提取数据_如何使用JMeter从文件中提取数据

    在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...

  7. jmeter压力测试过程中遇到过的问题及解决方法(包括jmeter和服务程序)

    1. 关于jmeter相关的问题 1.1 为什么要编写接口测试代码? 因为有些接口需要特殊格式的参数,比如需要特定的加密处理和解密处理,有的接口参数是动态生成的,有的接口参数是上一个接口返回的,所以测 ...

  8. JMeter基础 — JMeter聚合报告详解

    提示:聚合报告组件的使用和察看结果树组件的使用方式相同.本篇文章主要是详细的介绍一下聚合报告组件内容,不做示例演示. 1.聚合报告介绍 在使用JMeter进行性能测试时,聚合报告(Aggregate ...

  9. 【jmeter】JMeter日志查看与日志分析

    ​1 JMeter日志概览 jmeter日志文件保存在bin目录中,名称为jmeter.log.我们可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起 另外,JMeter可以 ...

最新文章

  1. Java双大括号_什么是Java中的双BRACE初始化?
  2. 程序员转实施工程师_只有程序员才能看得懂?程序员:算了,不看了,我得写代码了...
  3. 【渝粤题库】陕西师范大学201941 Java程序设计 作业(专升本)
  4. 为什么即使在班级均衡的情况下,准确度仍然令人困扰
  5. azure多功能成像好用吗_了解Azure持久功能
  6. ThreadLocal知识点详解
  7. raspberry pi_如何使用Raspberry Pi设置个人Web服务器
  8. CSS隐藏内容的三种方法比较
  9. Crust Network将于1月14日12点开始暂停HTTP版本应用
  10. python 分割不等长字符串表格_python如何将字符串等长分割
  11. 经济学原理_宏观经济学,微观经济学合集 N.格里高利·曼昆PDF
  12. php林大飞,和大飞签约
  13. SpringCloud 微服务(一)
  14. 【数据库】聚簇索引与非聚簇索引
  15. 如何修改非root用户的ulimit -n的值
  16. Linux日常软件安装(FC6)
  17. Kali Linux渗透测试 093 自动注入-Sqlmap
  18. java读取 png_JAVA如何操作PNG图片
  19. Android FrameWork学习(一)Android 7.0系统源码下载\编译
  20. 回撤率 python_回的解释|回的意思|汉典“回”字的基本解释

热门文章

  1. 数据元素、数据项、组合项、数据结构
  2. 以太坊经典的现状- Anthony Lusardi
  3. 人工神经网络的发展前景,人工神经网络及其应用
  4. 华为手机忘记密码如何解开,有什么相关教程吗
  5. 梯度下降算法与随机梯度下降算法:实现波士顿房价问题
  6. (c语言)通俗易懂的冒泡代码思路
  7. L298N驱动俩路电机按键控制正反转
  8. textarea文本不换行的问题
  9. 想要远程办公,这些一定要知道
  10. android 动态加载sdk,LiteAVSDK集成,因此可以动态加载库