目录
一、Function Helper Dialog(函数助手对话框)
一、Function Helper Dialog(函数助手对话框)
函数助手对话框:
1、函数助手对话框启用快捷键:Ctrl + Shift + F1
2、在性能测试过程中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫参数化。
3、JMeter 配置元件与前置处理器都能帮我们进行参数化,但都有局限性,为了帮助我们更好地进行参数化,
JMeter 提供了一组函数来帮我们生成需要的数据,这些函数可以通过函数助手对话框来进行编辑。
4、当然,函数助手的功能不仅仅是做参数化,还可以帮助我们进行运算、字符编码格式转换、获取运行时参数
等功能。
5、函数调用都是以 ${__function()} 这种形式开始的,其中:
"__" 是英文半角两个下横线,function 是函数名,其中的参数视不同函数而定。
6、下面示例均以中文版为例。
// ************************* 【函数助手对话框】 参数说明 ************************* //
1、选择一个功能:函数下拉列表选择一个函数。
(点击“帮助”按钮可以前往官网查看函数使用说明。)
[下拉框]
2、函数参数:从下拉列表中选择一个函数后,需为其参数设定值,不同函数要求的参数也不同。
● 名称:函数参数的简要描述
● 值:供用户填充参数的值。
[输入框]
3、拷贝并黏贴函数字符串:提醒用户复制生成的内容,复制到取样器中进行参数化
● 生成:点击 “生成” 按钮,生成函数,方便复制。
● Reset Variables:重置变量,点击 “Reset Variables” 按钮,重置参数变量。
[输入框]
4、The result of the function is:函数的结果是
[输入框]
5、Current JMeter Variables:当前 JMeter 变量
[输入框]
二、函数(68 个)
☆ __base64Decode
☆ __base64Encode
☆ __BeanShell
__BeanShell:
1、JMeter 支持 BeanShell 脚本语言,JMeter 函数助手中提供 BeanShell 函数的支持。
2、BeanShell 函数入参可以是 BeanShell 语法的程序语句或者 BeanShell 脚本文件。
3、函数 __BeanShell 会执行传递给它的脚本,并返回结果。
4、关于 BeanShell 的详细资料,请参考 BeanShell 的 Web 站点:http://www.beanshell.org/ 。
5、需要注意,测试脚本中每一个独立出现的函数调用,都会使用不同的解释器,但是后续对函数调用的援引
会使用相同的解释器;这就意味着变量会持续存在,并跨越函数调用。
6、单个函数实例可以从多个线程调用。
另外,该函数的execute()方法是同步的。
如果定义了属性"beanshell.function.init",那么它会作为一个源文件传递给解释器。
7、这样就可以定义一些通用方法和变量。
在bin目录中有一个初始化文件的例子:BeanShellFunction.bshrc 。
8、如下变量在脚本执行前就已经设置:
(1)log:函数 BeanShell(*) 的记录器
(2)ctx:目前的 JMeter Context 变量
(3)vars:目前的 JMeter 变量
(4)props:JMeter 属性对象
(5)threadName:线程名(字符串)
(6)sampler:当前采样器(如果存在)
(7)sampleResult:当前采样器(如果存在)
(7)"*" 意味着该变量在 JMeter 使用初始化文件之前就已经设置了。
9、其他变量在不同调用之间可能会发生变化。
// ************************* 【__BeanShell】 参数说明 ************************* //
● Expression to evaluate
第 1 个参数:要计算的表达式
● Name of variable in which to store the result (optional)
第 2 个参数:存储结果的变量的名称(可选)
// ************************* 【__BeanShell】 示例补充 ************************* //
例如:
${__BeanShell(123*456)}:123*456 计算结果返回 56088
${__BeanShell(source("function.bsh"))}:行在 function.bsh 中的脚本;
// 请记得为文本字符串及代表文本字符串的 JMeter 变量添加必要的引号
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | BeanShell 脚本:一个 BeanShell 脚本(不是文件名) | 是 |
第 2 个参数 | 变量名:重用函数计算值的引用名 | 否 |
☆ __caseFormat
☆ __changeCase
☆ __char
__char:
1、功能是把一组数字转化成 Unicode 字符,比如我们输入 65、66 两个数字,那么转成 Unicode 码就应该是 A 、B 两个字母。
2、char 函数接受多个数字。
3、函数 __char 会将一串数字翻译成 Unicode 字符,另外还请参考 __unescape() 函数。
4、Unicode字符编码(十进制数或者十六进制数) 待转换的Unicode字符编码,可以是十进制数或者十六进制数。
// 例如:
// ${__char(0xC,0xA)} = CRLF
// ${__char(165)} = � (yen)
// ************************* 【__char】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
函数参数 | 描述 | 是否必需 |
---|---|---|
Unicode字符编码(十进制数或者十六进制数) | 待转换的Unicode字符编码,可以是十进制数或者十六进制数 | 是 |
☆ __chooseRandom
☆ __counter
__counter:
1、__counter 可以作为一个计数器使用,支持多线程(可以理解成多用户)。
// 比如有线程 1 与 2 ,这个计数器可以分开记录线程迭代的次数,也可以把两个线程的迭代次数合在一起记录。
2、每次调用计数器函数都会产生一个新值,从1开始每次加1。
3、计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。
4、如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。
5、全局计数器通常被用于记录发送了多少次请求,计数器使用一个整数值来记录,允许的最大值为:2,147,483,647。
6、目前计数器函数实例是独立实现的;全局计数器(FALSE)每个计数器实例都是独立维护的。
// JMeter 2.1.1及其以前版本,使用一个固定的线程变量来跟踪每个用户的计数器,因此多个计数器函数会操作同一个值。
// ************************* 【__counter】 参数说明 ************************* //
● TRUE, for each user to have own counter, FALSE for a global counter
第 1 个参数:如果每个用户都有自己的计数器,则为 true ;如果是全局计数器,则为 false
● Name of variable in which to store the result (optional)
第 2 个参数:存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必须 |
---|---|---|
第1个参数 | 1、True,如果希望每个虚拟用户的计数器保持独立,与其他用户的计数器相区别; 2、false,全局计数器; |
是 |
第2个参数 | 1、重用计数器函数创建值的引用名。 2、测试人员可以这样引用计数器的值:${refName}。 3、这样一来,测试人员就可以创建一个计数器后,在多个地方引用它的值 |
否 |
☆ __CSVRead
__CSVRead:
1、__CSVRead 可以从文件中读取指定列的值,功能有 3 个:
(1)读取固定值
// 例如:读取第 0 列(实际是第 1 列,编号从 0 开始),多次迭代时值是不会改变的,还是取第一行第一列。
(2)读取动态值
// 例如:如果想要每次迭代时取值不一样,可以用到类似 ${_CSVRead (D:\testvalue.txt,next())} 这样的表达式,
// next() 会告知程序下次迭代取下一行数据。
(3)可以使用文件别名
// 例如:我们使用 testfile 作为 D:\testvalue.txt 文件的别名,在 Java 请求中我们可以使用
// ${__CSVRead (*testfile,1)} 来读取 D:\testvalue.txt 中的值。
2、函数 __CSVRead 会从 CSV 文件读取一个字符串(请注意与 StringFromFile 的区别)。
3、JMeter 1.9.1 以前的版本仅支持从单个文件中读取,JMeter 1.9.1 及其以后版本支持从多个文件中读取。
在大多数情况下,新配置元件 CSV Data Set 更好用一些。
4、当对某文件进行第一次读取时,文件将被打开并读取到一个内部数组中;
如果在读取过程中找到了空行,函数就认为到达文件末尾了,即允许拖尾注释( JMeter 1.9.1 版本引入);
后续所有对同一个文件名的引用,都使用相同的内部数组。
5、另外,文件名大小写对函数调用很重要,哪怕操作系统不区分大小写,
CSVRead(abc.txt,0) 和 CSVRead(aBc.txt,0) 会引用不同的内部数组;
使用 *ALIAS 特性可以多次打开同一个文件,另外还能缩减文件名称。
6、每一个线程都有独立的内部指针指向文件数组中的当前行;
当某个线程第一次引用文件时,函数会为线程在数组中分配下一个空闲行;
如此一来,任何一个线程访问的文件行,都与其他线程不同(除非线程数大于数组包含的行数)。
7、默认下,函数会在遇到每一个逗号处断行;如果希望在输入列中使用逗号,那么需要换一个分隔符
(设置属性 csvread.delimiter 实现,且该符号没有在 CSV 文件任何列中出现。
// ************************* 【__CSVRead】 参数说明 ************************* //
● CSV file to get values from | *alias
第 1 个参数:从*别名的 csv 文件获取值
● Column number of CSV file | next | *alias
第 2 个参数:*别名的 csv 文件的下一列列号
// ************************* 【__CSVRead】 示例补充 ************************* //
例如,可以用如下参数来设置某些变量:
● 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)}
(1)上面例子会从一行中读取两列,接着从下一行中读取两列。
(2)如果所有变量都在同一个前置处理器中(用户参数上定义),那么行都是顺序读取的。
(3)否则,不同线程可能会读取不同的行。
(4)这一函数并不适合于读取很大的文件,因为整个文件都会被存储到内存之中。
(5)对于较大的文件,请使用配置元件 CSV Data Set 或者 StringFromFile 。
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 文件名:设置从哪个文件读取(或者*ALIAS) | 是 |
第 2 个参数 | 1、列数:从文件的哪一列读取。 2、0 = 第一列, 1 = 第二列,依此类推。 3、next:为走到文件的下一行。 4、*ALIAS:为打开一个文件,并给它分配一个别名。 |
是 |
☆ __dateTimeConvert
☆ __digest
☆ __doubleSum
☆ __env
☆ __escapeHtml
__escapeHtml:
1、把字符转换成 Html 格式的字符,比如引号转成 HTML 就是 " ,比如空格就是 ,
这样编码后传给浏览器,浏览器就能够识别引号与空格了。
2、函数 __escapeHtml 用于转义字符串中的字符(使用HTML实体)。
3、支持HTML 4.0实体。
// 例如:"bread" & "butter"变为"bread" & "butter"。
// ************************* 【__escapeHtml】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 待转义字符串 | 是 |
☆ __escapeOroRegexpChars
__escapeOroRegexpChars:
1、帮我们把正则表达式转换成 Java 正则引擎能够识别的表达式,使用支持 Perl5 的 ORO 正则表达式库来编译。
2、说得比较绕口,通俗点说就是把一些 Java 正则表达式引擎不识别的正则式转换一下,这样就可以识别了;
转换过程中使用了 ORO 正则表达式库,这个库也支持 Perl5 兼容的正则表达式语法。
3、Perl 是一种高级、通用、直译式、动态的脚本语言,内部集成了正则表达式的功能。
// ************************ 【__escapeOroRegexpChars】 参数说明 ************************ //
● Value to escape from ORO Regexp meta chars
第 1 个参数:要从 oro regexp 元字符转义的值
● 存储结果的变量名(可选)
第 2 个参数:存储结果的变量名(可选)
☆ __escapeXml
☆ __eval
__eval:
1、用来返回一个表达式的值,也就是可以用此函数表达式来嵌套引用表达式。
2、函数 __eval 可以用来执行一个字符串表达式,并返回执行结果。
3、如此一来,用户就可以对字符串(存储在变量中)中的变量和函数引用做出修改。
// 例如,给定变量 name = Smith、column = age、table = birthdays、SQL = select columnfrom{table} where name = '${name}',
// 那么通过 {__eval({SQL})} ,就能执行 "select age from birthdays where name='Smith'"。
// 这样一来,就可以与 CSV 数据集相互配合;
// 例如:将SQL语句和值都定义在数据文件中。
// ************************* 【__eval】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
☆ __evalVar
__evalVar:
1、函数__evalVar可以用来执行保存在变量中的表达式,并返回执行结果,并把结果存入一个变量,供 Sampler 引用。
2、如此一来,用户可以从文件中读取一行字符串,并处理字符串中引用的变量。
// 例如,假设变量 "query" 中包含有 "select columnfrom{table}",
// 而 "column" 和 "table" 中分别包含有 "name" 和 "customers" ,
// 那么 ${__evalVar(query)} 将会执行 "select name from customers"。
3、__evalVar 支持嵌套表达式。
// ************************* 【__evalVar】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 变量名:待执行变量名 | 是 |
☆ __fifoGet
☆ __fifoPop
☆ __fifoPut
☆ __fifoSize
☆ __FileToString
__FileToString:
1、用来读取文件,它可以一次性读取文件内容,然后保存到变量;此变量之后可以由其他 Sampler 引用。
2、函数 __FileToString 可以被用来读取整个文件。每次对该函数的调用,都会读取整个文件。
3、如果在打开或者读取文件时发生错误,那么函数就会返回字符串 "**ERR**" 。
// ************************* 【__FileToString】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
● File encoding if not the platform default (opt)
第 2 个参数:文件编码如果不是平台默认值(opt)
● 存储结果的变量名(可选)
第 3 个参数:存储结果的变量名(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 文件名:包含路径的文件名(路径可以是相对于JMeter启动目录的相对路径) | 是 |
第 2 个参数 | 文件编码方式(如果不采用平台默认的编码方式): 1、读取文件需要用到的文件编码方式。 2、如果没有指明就使用平台默认的编码方式。 |
否 |
第 3 个参数 | 变量名:引用名(refName)用于重用函数创建的值 | 否 |
☆ __groovy
☆ __if
☆ __intSum
__intSum:
1、用来对整数求和,支持多个整数累加,多个数之间用逗号分隔。
2、函数 __intSum 可以被用来计算两个或者更多整数值的合。
// JMeter 2.3.1及其以前版本,要求必须有引用名参数。
// 后续JMeter版本中,引用名是可选的参数,但是引用名不能是整数值。
// ************************* 【__intSum】 参数说明 ************************* //
● First int to add.
第 1 个参数:要添加的第一个int。
● Name of variable in which to store the result (optional)
第 2 个参数:存储结果的变量的名称(可选)
● Name of variable in which to store the result (optional)
第 n 个参数:存储结果的变量的名称(可选)
● Name of variable in which to store the result (optional)
最后 1 个参数:存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必须 |
---|---|---|
第1个参数 | 第1个整数值 | 是 |
第2个参数 | 第2个整数值 | 是 |
第n个参数 | 第n个整数值 | 否 |
最后1个参数 | 1、重用函数计算值的引用名。 2、如果用户指定了这一参数,那么引用名中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算 |
否 |
☆ __isDefined
☆ __isPropDefined
☆ __isVarDefined
☆ __iterationNum
☆ __javaScript
__javaScript:
1、此函数可以用来返回 JavaScript 脚本的执行结果,也可以调用 JavaScript 中的库函数(JavaScript 类库提供的函数)。
2、${__javaScript(3*10,sum)} ,引用了一个简单的 javaScript(3*10) 语句。
3、函数 __javaScript 可以用来执行 JavaScript 代码片段(非 Java ),并返回结果值。
4、JMeter 的 _javaScript 函数会调用标准的 JavaScript 解释器。
5、JavaScript 会作为脚本语言使用,因此测试人员可以做相应的计算。
6、在脚本中可以访问如下一些变量:
● Log:该函数的日志记录器
● Ctx:JmeterContext对象
● Vars:JmeterVariables对象
● threadName:字符串包含当前线程名称 // 在 2.3.2 版本中它被误写为"theadName"
● sampler:当前采样器对象(如果存在)
● sampleResult:前面的采样结果对象(如果存在)
● props:JMeter 属性对象
● Rhinoscript允许通过它的包对象来访问静态方法
// 例如,用户可以使用如下方法访问JMeterContextService静态方法:
// Packages.org.apache.jmeter.threads.JMeterContextService.getTotalThreads()
7、JMeter 不是一款浏览器,它不会执行从页面下载的 JavaScript。
8、注意:记得为文本字符串添加必要的引号。
9、另外,如果表达式中有逗号,请确保对其转义。
// 例如:${__javaScript('${sp}'.slice(7\,99999))},对7之后的逗号进行了转义。
// ************************* 【__javaScript】 参数说明 ************************* //
● Name of variable in which to store the result (optional)
第 1 个参数:变量名/存储结果的变量的名称(可选)
● Name of variable in which to store the result (optional)
第 n 个参数:变量名/存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
变量名 | 重用函数计算值的引用名 | 是 |
JavaScript代码片段 | 1、待执行的JavaScript代码片段; 2、例如: ● new Date():返回当前日期和时间 ● Math.floor(Math.random()*(${maxRandom}+1)):在0和变量maxRandom之间的随机数 ● ${minRandom}+Math.floor(Math.random()*(maxRandom−maxRandom−{minRandom}+1)): 在变量 minRandom和maxRandom之间的随机数 ● "${VAR}"=="abcd" |
否 |
☆ __jexl2
☆ __jexl3
__jexl:
1、JMeter 提供对 JEXL 表达式的支持,JEXL 全称 Jakarta Commons Jexl,它是一种表达式语言
( Java Expression Language)解释器, Commons Jexl 是对 JSP 表达式语言的一种扩充,
并不依赖于 ServletAPI ,所以它可以被集成到任何需要表达式语言的应用程序中。
2、__jexl 是 JEXL1.0 的版本,jexl2 是 JEXL2.0 的版本。
3、JMeter 中部分变量能够被 jexl 直接访问:
● log:函数记录器,直接调用 logger 函数。
● ctx:获取 JMeterContent 对象。
● vars:获取 JMeter 定义的变量,获取 JMeterVariables 对象。
● props: 获取 JMeter 配置属性对象。
● threadName:获取 JMeter 线程名,字符串包含当前线程名称 (在2.3.2 版本中它被误写为"theadName")。
● sampler:获取 Sampler 实例,当前的采样器对象(如果存在)。
● sampleResult: 获取 SamplerResult 实例,前面的采样结果对象(如果存在)。
● OUT:类似 System.out.println ,OUT.println() 。
// OUT - System.out,例如: OUT.println("message")
4、JEXL 可以基于它们来创建类,或者调用方法,例如:
● Systemclass = log.class.forName("java.lang.System")
● now = Systemclass.currentTimeMillis()
// 需要注意的是,Web 站点上的 JEXL 文档错误地建议使用 "div" 做整数除法。
// 事实上 "div" 和 "/" 都执行普通除法。
// JMeter 2.3.2 以后的版本允许在表达式中包含多个声明。
// JMeter 2.3.2 及其以前的版本只处理第一个声明(如果存在多个声明,就会记录一条警告日志)。
5、函数 __jexl 可以用于执行通用 JEXL 表达式,并返回执行结果。
// 可以从下面这两个网址获取更多关于 JEXL 的信息:
// ● http://commons.apache.org/jexl/reference/syntax.html
// ● http://commons.apache.org/jexl/reference/examples.html#Example_Expressions
// ************************* 【__jexl】 参数说明 ************************* //
● JEXL expression to evaluate
第 1 个参数:要计算的 jexl 表达式
● Name of variable in which to store the result (optional)
第 2 个参数:变量名/存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 表达式:待执行的表达式。例如,6*(5+2) | 是 |
第 2 个参数 | 变量名:待设置变量名 | 否 |
☆ __log
__log:
1、日志方法,返回输入的字符串信息。
// 例如:输入字符串是 "testing",那么正常返回即是 "testing"。
2、函数 __log 会记录一条日志,并返回函数的输入字符串。
// ************************* 【__log】 参数说明 ************************* //
● String to be logged (and returned)
第 1 个参数:要记录(和返回)的字符串
(1)将会被日志输出的字符串 //如上面的 testing 。
(2)当然 log 不仅仅是这个功能,它可以写日志。
● Log level (default INFO) or OUT or ERR
第 2 个参数:日志级别(默认信息)或out或err
(1)用来指定日志输出的级别,日志级别有 OUT,ERR,DEBUG,INFO (default) ,WARN or ERROR 。
(2)OUT: 在控制台打印出来 (点击快捷菜单栏的 △0(带感叹号“!”的三角形) 按钮,在 GUI 中打开控制台),
另外也会打印到标准输出窗口(在 Windows 下我们运行 JMeter 时会有一个标准输出窗口),
类似 Java 中的 System.out.print() 。
(3)ERR: 在控制台输出日志信息,同时也打印到标准输出,类似 Java 中的 System.err 。
(4)DEBUG: 在控制台输出日志信息,DEBUG 级别以上的都将打印,可以参考 Log4j 。
(5)INFO: 在控制台打印 INFO 及 ERROR 级别的日志。
(6)WARN:在控制台打印 WARN 、INFO 、ERROR 级别的日志。
(7)ERROR: 在控制台仪打印 ERROR 日志。
(8)另外对于 DEBUG 、INFO 、WARN、ERROR 级别的日志还可能会写入 JMeter 的运行时日志
(这要看是否已经配置,主要通过配置 jmeter. properties 文件中的日志选项)。
● Throwable text (optional)
第 3 个参数:抛出的异常信息(可选)
● Additional comment (optional)
第 4 个参数:附加的备注信息(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 待记录字符串:一个字符串 | 是 |
第 2 个参数 | 日志级别:OUT、ERR、DEBUG、INFO(默认)、WARN或者ERROR | 否 |
第 3 个参数 | 可抛弃的文本:如果非空,会创建一个可抛弃的文本传递给记录器 | 否 |
第 4 个参数 | 注释:如果存在,注释会在字符串中展示,用于标识日志记录了什么 | 否 |
☆ __logn
__logn:
1、与 log 类似,不过它只记录一条日志,不返回值而已。
2、函数 __logn 会记录一条日志,并返回空字符串。
// ************************* 【__logn】 参数说明 ************************* //
● String to be logged
第 1 个参数:要记录的字符串
● Log level (default INFO) or OUT or ERR
第 2 个参数:日志级别(默认信息)或 out 或 err
● Throwable text (optional)
第 3 个参数:可丢弃文本(可选)
// ************************* 【__logn】 示例补充 ************************* //
1、OUT 和 ERR 的日志级别,将会分别导致输出记录到 System.out 和 System.err 中。
2、在这种情况下,输出总是会被打印(它不依赖于当前的日志设置)。
3、例如:{__logn(VAR1={VAR1},OUT)}:将变量值写到控制台窗口中。
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 待记录字符串:一个字符串 | 是 |
第 2 个参数 | 日志级别:OUT,ERR,DEBUG, INFO(默认),WARN 或者ERROR | 否 |
第 3 个参数 | 可抛弃的文本:如果非空,会创建一个可抛弃的文本传递给记录器 | 否 |
☆ __longSum
__longSum:
1、与 __intSum 类同,只不过把整数变成了长整型,在此不述。
2、函数 __longSum 可以被用来计算两个或者更多长整型值的合。
// ************************* 【__longSum】 参数说明 ************************* //
● First long to add
第 1 个参数:第一个要添加的长整型值
● Second long to add - further longs can be summed by adding further arguments.
第 2 个参数:第二个要添加的长整型值-可以通过添加更多的参数来求和更多的长整型值。
● ...
第 n 个参数:第 n 个要添加的长整型值-可以通过添加更多的参数来求和更多的长整型值。
● Name of variable in which to store the result (optional)
最后 1 个参数:存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第1个参数 | 第 1 个长整型值 | 是 |
第2个参数 | 第 2 个长整型值 | 是 |
第n个参数 | 第 n 个长整型值 | 否 |
最后1个参数 | 1、重用函数计算值的引用名。 2、如果用户指定了这一参数,那么引用名中必须包含一个非数字字母,否则它会被当成另一个长整型值,而被函数用于计算 |
否 |
☆ __lowercase
☆ __machineIP
__machineIP:
1、该函数引用返回本机 IP ,我们在 Java 请求中引用此函数,引用方式有两种,一种带参数名一种不带参数名,都可以返回本机 IP 。
2、如果带参数名,此参数还可以被其他的 Sampler 引用。
// ************************* 【__machineIP】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
☆ __machineName
__machineName:
1、该函数返回本机的主机名。
2、引用时可以带参数名也可以不带,如果带参数名,此参数还可以被其他的取样器引用。
// ************************* 【__machineName】 参数说明 ************************* //
● Name of variable in which to store the result (optional)
第 1 个参数:变量名/存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第1个参数 | 重用函数计算值的引用名 | 否 |
☆ __MD5
☆ __P
__P:
1、获取属性的函数,可以获取命令行中定义的属性,默认值为 1 。
// 例如:我们在命令窗口打开 JMeter 且设置 group1.threads = 7 ,我们在打开的 JMeter GUI 中可以获取到此参数。
// 在非 GUI 方式运行测试计划时这个函数可用来做参数化,由运行命令动态指定参数值,
// 方便我们与 Jenkins 、Maven 或者 Ant 进行集成未完成性能测试自动化工作。
2、函数 __P 是一个简化版的属性函数,目的是使用在命令行中定义的属性。
3、不同于函数 __property ,本函数没有提供选项用于设置保存属性值的变量。
4、另外,如果没有设置默认值,默认值自动设为 1 。
5、之所以选择 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(除非这些属性在其他地方有定义)
// ************************* 【__P】 参数说明 ************************* //
● Name of property
第 1 个参数:属性名
● Default value
第 2 个参数:默认值
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 属性名:获取属性值、所需的属性名 | 是 |
第 2 个参数 | 1、默认值:属性未定义时的默认值。 2、如果省略此参数,默认值自动设为 1 。 |
否 |
☆ __property
__property:
1、该函数用来获取 JMeter 的属性,我们打开文件 %JMETER_HOME%\bin\jmeter.properties ,
在此我们已设置 JMeter 的各项属性,通过这个函数我们可以获取到在此设置的属性值。
// 例如:如果在 jmeter.properties 中设置的日志级别是 INFO ,所以:
// {$__property(log_level.jmeter,logLevel,)}获取的将会是 INFO 。
2、另外我们把日志级别保存到了 logLevel 变量中,此变量也可以被其他的取样器进行调用。
3、函数 __property 会返回一个 JMeter 属性的值,如果函数找不到属性值,而又没有提供默认值,
则它会返回属性的名称。
// 例如:
// ${__property(user.dir)} :返回属性 user.dir 的值
// ${__property(user.dir,UDIR)} :返回属性 user.dir 的值,并保存在变量 UDIR 中
// ${__property(abcd,ABCD,atod)} :返回属性 abcd 的值(如果属性没有定义,返回"atod"),并保存在变量 ABCD 中
// {__property(abcd,,atod)} :返回属性 abcd 的值(如果属性没有定义,返回"atod"),但是并不保存函数的返回值
// ************************* 【__property】 参数说明 ************************* //
● Name of property
第 1 个参数:属性名
● Column number of CSV file | next | *alias
第 2 个参数:*别名的 csv 文件的下一列列号
● Default value
第 3 个参数:默认值
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 属性名:获取属性值、所需的属性名 | 是 |
第 2 个参数 | 变量名:重用函数计算值的引用名 | 否 |
第 3 个参数 | 默认值:属性未定义时的默认值 | 否 |
☆ __Random
__Random:
1、随机数函数,用此函数可以生成一个一定范围内的随机数并保存到指定变量,此变量可以被其他的取样器引用。
2、函数 __Random 会返回指定最大值和最小值之间的随机数。
// ************************* 【__Random】 参数说明 ************************* //
● Name of variable in which to store the result (optional)
第 1 个参数:变量名/存储结果的变量的名称(可选)
● The maximum value allowed for a range of values
第 2 个参数:一个值范围允许的最大值
● Name of variable in which to store the result (optional)
第 3 个参数:变量名/存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
最小值 | 最小数值 | 是 |
最大值 | 最大数值 | 是 |
变量名 | 重用函数计算值的引用名 | 否 |
☆ __RandomDate
☆ __RandomFromMultipleVars
☆ __RandomString
__RandomString:
1、随机字符串函数,支持中文。
2、用此函数我们可以生成指定长度的随机字符串并保存到指定变量,此变量可以被其他的 Sampler 引用。
// ************************* 【__Random】 参数说明 ************************* //
● Random string length
第 1 个参数:随机字符串长度
● Chars to use for random string generation
第 2 个参数:用于随机字符串生成的字符
● 存储结果的变量名(可选)
第 3 个参数:变量名/存储结果的变量的名称(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 表示希望生成的字符串的长度 | 是 |
第 2 个参数 | 表示从这些字符中随机组合,同个字可能会重复 |
否 |
第 3 个参数 | 变量名称,表示生成的字符串保存在这个变量中 | 否 |
☆ __regexFunction
__regexFunction:
1、正则表达式提取函数,此函数用来正则匹配上一个取样器的返回值。
2、正则表达式函数可以使用正则表达式(用户提供的)来解析前面的服务器响应(或者是某个变量值),
函数会返回一个有模板的字符串,其中携带有可变的值。
3、__regexFunction 还可以被用来保存值,以便供后续使用。
// ************************* 【__regexFunction】 参数说明 ************************* //
● Base64 string to be decoded
第 1 个参数:要解码的base64字符串
● Template for the replacement string, using groups from the regular expression. Format is $[group]$.
Example $1$.
第 2 个参数:替换字符串的模板,使用正则表达式中的组。格式为$[组]$。
例如 1 美元。
● Which match to use.
An integer 1 or greater,RAND to indicate JMeter should randomly choose,
A float, or ALL indicating all matches should be used ([1])
第 3 个参数:哪个匹配使用。
整数 1 或更大,RAND 表示 JMeter 应该随机选择,一个 float 或 all 表示应该使用所有匹配项([1])
● Between text.
If ALL is selected, the between text will be used to generate the results ([""])
第 4 个参数:在文本之间。
如果全部选中,中间文本将用于生成结果([“”])
● Default text.
Used instead of the template if the regular expression finds no matches ([""])
第 5 个参数:默认文本。
如果正则表达式找不到匹配项([“”])则使用,而不用模板
● Name of variable in which to store the result (optional)
第 6 个参数:存储结果的变量的名称(可选)
● Input variable name containing the text to be parsed ([previous sample])
第 7 个参数:包含要分析的文本的输入变量名([上一个示例])
// ************************* 【__regexFunction】 参数补充 ************************* //
在函数的第 6 个参数中,可以指定一个引用名;在函数执行以后,可以使用用户定义值的语法来获取同样的值。
// 例如,如果输入"refName"作为第 6 个参数,那么可以使用:
// ${refName} 来引用第 2 个参数(Template for the replacement string)的计算结果,这依赖于函数的解析结果
// ${refName_g0} 来引用函数解析后发现的所有匹配结果
// ${refName_g1} 来引用函数解析后发现的第一个匹配组合
// ${refName_g#} 来引用函数解析后发现的第n个匹配组合
// ${refName_matchNr} 来引用函数总共发现的匹配组合数目
函数参数 | 描述 | 是否必需 |
---|---|---|
第1个参数 | 1、第 1 个参数是用于解析服务器响应数据的正则表达式,它会找到所有匹配项; 2、如果希望将表达式中的某部分应用在模板字符串中,一定记得为其加上圆括号。 (1)例如,<a href="(.*)">, 这样就会将链接的值存放到第一个匹配组合中(这里只有一个匹配组合)。 (2)又如,<input type="hidden"name="(.*)"value="(.*)">, 在这个例子中,链接的name作为第一个匹配组合,链接的value会作为第二个匹配组合, 这些组合可以用在测试人员的模板字符串中。 |
是 |
第2个参数 | 1、这是一个模板字符串,函数会动态填写字符串的部分内容。 2、要在字符串中引用正则表达式捕获的匹配组合,请使用语法:$[group_number]$。 例如:$1$ 或者 $2$。 3、测试人员的模板可以是任何字符串 |
是 |
第3个参数 | 1、第3个参数告诉 JMeter 使用第几次匹配。 2、测试人员的正则表达式可能会找到多个匹配项。 3、对此,测试人员有 4 种选择: ● 整数:直接告诉 JMeter 使用第几个匹配项,“1” 对应第一个匹配,“2” 对应第二个匹配,以此类推 ● RAND:告诉 JMeter 随机选择一个匹配项 ● ALL:告诉 JMeter 使用所有匹配项,为每一个匹配项创建一个模板字符串,并将它们连接在一起 ● 浮点值 0 到 1 之间:根据公式(找到的总匹配数目*指定浮点值)计算使用第几个匹配项,计算值向最近的整数取整 |
否,默认值为1 |
第4个参数 | 如果在上一个参数中选择了 “ALL”,那么这第 4 个参数会被插入到重复的模板值之间 |
否 |
第5个参数 | 如果没有找到匹配项返回的默认值 | 否 |
第6个参数 | 重用函数解析值的引用名,参见上面内容 | 否 |
第7个参数 | 1、输入变量名称。 2、如果指定了这一参数,那么该变量的值就会作为函数的输入,而不再使用前面的采样结 果作为搜索对象 |
否 |
☆ __samplerName
__samplerName:
该函数用来获取当前 Sampler 的名称。
// ************************* 【__samplerName】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
☆ __setProperty
__setProperty:
1、该函数用来动态设置 JMeter 属性。
2、函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。
3、通过将函数可选的第 3 个参数设置为"true",函数就会返回属性的原始值。
4、属性对于 JMeter 是全局的,因此可以被用来在线程和线程组之间通信。
// ************************* 【__setProperty】 参数说明 ************************* //
● 属性名称
第 1 个参数:属性名称
● XPath expression to match against
第 2 个参数:要匹配的xpath表达式
● Return Original Value of property (default false)?
第 3 个参数:是否返回属性的原始值/是否返回函数结果(默认为否)?
【默认为 false,不返回;如果填入 true ,则返回。】
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 属性名:待设置属性名 | 是 |
第 2 个参数 | 属性值:属性的值 | 是 |
第 3 个参数 | True/False:是否返回属性原始值 | 否 |
☆ __split
__split:
1、该函数用来拆分字符串。
2、String to sp1it: 用来拆分的字符串;
3、函数名称,用于存储在测试计划中其他的方式使用的值:拆分的字符串引用的变量名。
4、String to sp1it on. Default is ,(comma): 分隔字符,默认是逗号。
5、拆分后的字符存入变景中,此变量类似一个字符串数组。
☆ __StringFromFile
__StringFromFile:
1、该函数从文件中读取内容,一行一行地读取,类似于 CSV Data Set Config 元件:;当读完以后会重头开始。
2、每调用此函数一次将打开一次文件,这样效率似乎不太高。
3、__regexFunction 还可以被用来保存值,以便供后续使用。
4、__StringFromFile 可以被用来从文本文件中读取字符串,这对需要大量可变数据的测试很有用。
例如,当测试一个银行系统时,测试人员可能需要100条甚至1000条账户信息。
5、使用配置元件 CSV Data Set Config ,也能达到相同的目的,而且方法更简单,但是该配置元件目前不支持多输入文件。
6、每次调用函数,都会从文件中读取下一行。
当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。
如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的
(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)。
7、如果在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。
// ************************* 【__StringFromFile】 参数说明 ************************* //
● Enter path (absolute or relative) to file
第 1 个参数:文件名/输入文件的全路径——被访问的文件路径(绝对或相对)
● Name of variable in which to store the result (optional)
第 2 个参数:变量名/存储结果的变量的名称(可选)
// 把读取的内容放入变量,这种适用于有多处需要引用文件中的数据的场景,先在这里把读取的数据放入参数,后面再引用。
● Start file sequence number (opt)
第 3 个参数:初始序列号/开始文件序列号(opt)
● Final file sequence number (opt)
第 4 个参数:终止序列号/结束文件序列号(opt)
// 例如:在绝对路径有如下文件名 D:\testvaluel D:\testvalue2 D:\testvalue3 需要读取,
// 可以设置 Start file sequence number (opt) 为 1,Final file sequence number (opt) 为 3 ,
// 这样就可以顺序读取这 3 个文件中的内容。
// ************************* 【__regexFunction】 参数补充 ************************* //
1、当打开或者重新打开文件时,文件名参数将会被解析。
2、每次执行函数时,引用名参数(如果支持)将会被解析。
3、使用序列号:
● 当使用可选的序列号时,文件名需要使用格式字符串java.text.DecimalFormat。
● 当前的序列号会作为唯一的参数。
● 如果不指明可选的初始序列号,就使用文件名作为起始值。
● 一些有用的格式序列如下:
#:插入数字,不从零开始,不包含空格。
000:插入数字,包含3个数字组合,不从零开始。
// 例如:
// 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
4、如果不希望某个格式字符被翻译,测试人员需要为它加上单引号。
注意:"." 是格式字符,必须被单引号所包含。
6、如果省略了初始序列号,而终止序列号参数将会作为循环计数器,文件将会被使用指定的次数。
// 例如:
// ${_StringFromFile(PIN#'.'DAT,,1,2)}:读取 PIN1.DAT, PIN2.DAT。
// ${_StringFromFile(PIN.DAT,,,2)}:读取 PIN.DAT 两次。
函数参数 | 描述 | 是否必需 |
---|---|---|
第1个参数 | 1、文件名(可以使用相对于JMeter启动目录的相对路径)。 2、如果要在文件名中使用可选的序列号,那么文件名必须适合转成十进制格式。 |
是 |
第2个参数 | 1、一个引用名(refName)的目的是复用这一函数创建的值。 2、可以使用语法${refName}来引用函数创建的值。 3、默认值为“StringFromFile_” |
否 |
第3个参数 | 初始序列号(如果省略这一参数,终止序列号会作为一个循环计数器) | 否 |
第4个参数 | 终止序列号(如果省略这一参数,序列号会一直增加下去,不会受到限制) | 否 |
☆ __strLen
☆ __strReplace
☆ __substring
☆ __TestPlanName
__TestPlanName:
该函数返回测试计划的名称,即当前脚本的文件名。
☆ __threadGroupName
☆ __threadNum
__threadNum:
1、函数 __threadNum 只是简单地返回当前线程的编号。
2、线程编号不依赖于线程组,这就意味着从函数的角度看来,某个线程组的线程 #1 和另一个线程组的线程 #1 是没有区别的。
3、这一函数不能用在任何配置元件中(如用户定义的变量),原因在于配置元件是由一个独立线程运行的。
4、该函数没有参数;另外在测试计划中使用也是没有意义的。
☆ __time
__time:
1、函数 __time 可以通过多种格式返回当前时间,可以指定返回格式,由 SimpleDateFormat 类来处理函数格式。
● 年:yyyy
● 月: MM
● 日: dd
● 时:hh
● 分: mm
● 秒: ss
// yyyy-MM-dd HH:mm:ss 返回格式如:2019-04-22 17:30:27
2、如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。
3、其他情况下,当前时间会被转成简单日期格式。
4、包含如下形式:
● YMD = yyyyMMdd
● HMS = HHmmss
● YMDHMS = yyyyMMdd-HHmmss
● USER1 = JMeter 属性 time.USER1
● USER2 = JMeter 属性 time.USER2
5、用户可以通过修改 JMeter 属性来改变默认格式,例如:time.YMD = yyMMdd 。
// ************************* 【__time】 参数说明 ************************* //
● Format string for SimpleDateFormat (optional)
第 1 个参数:SimpleDateFormat 的格式字符串(可选)
● 存储结果的变量名(可选)
第 2 个参数:存储结果的变量名(可选)
__time 函数实战,点击前往查看另一博文:【Jmeter】Jmeter 函数助手实战:__time 时间戳函数
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 格式:设置时间所采用的格式 | 否 |
第 2 个参数 | 变量名:待设置变量名 | 否 |
☆ __timeShift
☆ __tstFeedback
☆ __unescape
__unescape:
返转 escape 字符,如 \r\n 转成 CRLF 。
☆ __unescapeHtml
__unescapeHtml:
1、该函数反转 URL 链接中的 Unicode 编码字符,如 转成空格。
2、函数 __unescapeHtml 用于反转义一个包含 HTML 实体的字符串,将其变为包含实际 Unicode 字符的字符串。
3、支持 HTML 4.0 实体。
// 例如,字符串 "<Français>" 变为 "<Fran?ais>" 。
4、如果函数不认识某个实体,就会将实体保留下来,并一字不差地插入结果字符串中。
// 例如,">&zzzz;x" 会变为 ">&zzzz;x" 。
// ************************* 【__unescapeHtml】 参数说明 ************************* //
● 变量的名称
第 1 个参数:变量的名称
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 待反转义字符串 | 是 |
☆ __uppercase
☆ __urldecode
__urldecode:
该函数反转 URL 链接中的 Unicode 字符,如 Word十%22school%22 反转成 Word "school" 。
☆ __urlencode
__urlencode:
该函数把 URL 链接中的 escap 字符转成 Unicode 编码,如 Word "school" 转成 Word+%22school%22
☆ __UUID
__UUID:
在参数化时有时候我们希望能够生成一个唯一的字串,UUID 能帮我们实现,它能保证生成的字符串是唯一存在的。
☆ __V
__V:
1、该函数用来执行交量表达式,并返回结果。
2、可以被用于执行嵌套函数引用,如果我们需要嵌套的使用变量时,就可以用到它(目前 JMeter 不支持)。
// 例如,如果存在变量A1、A2和N=1,则:
// ${A1}:能正常工作
// {A{N}}:无法正常工作(嵌套变量引用)
// {__V(A${N})}:可以正常工作。
// A{N} 变为 A1,函数 __V 返回变量值 A1
// ************************* 【__V】 参数说明 ************************* //
● Name of variable (may include variable and function references)
第 1 个参数:变量名称(可能包括变量和函数引用)
● Name of variable in which to store the result (optional)
第 2 个参数:存储结果的变量名(可选)
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | 变量名表达式:待执行变量名表达式 | 是 |
☆ __XPath
__XPath:
1、该函数可以从 XML 格式的文件中匹配内容,每次调用返回一个匹配值,到达尾部从头开始,匹配不到返回空。
2、__XPath 使用 XPath 表达式来匹配 XML 文件中的内容。
3、下面简单列举一下 XPath 的语法供参考:
● "/" :表示选择根节点。
● "//" :表示选择任意位置的某个节点。
● "@" :表示选择某个属性。
● "*" :表示匹配任何元素节点。
● "@*" :表示匹配任何属性值。
● company :选取 company 元素的所有子节点。
● /company : 选取根节点 company ,/开头是绝对路径。
● company /name :选取所有属于 company 的子元素的 name 元素,相对路径写法。
● //name :选择所有 name 子元素,而不管它们在文档中的位置。
● company//address :选择所有属于 company 元素的 address 元素,而不管它们位于 company 之下的什么位置。
● //@type :选取所有名为 type 的属性。
备注:本部分内容来自于 W3C School,需要更详细了解 XPath 表达式的读者可以参考:W3C School
( http://www.w3schoo l.com.cn/xpath/xpath_syntax.asp )中的内容。
// ************************* 【__XPath】 参数说明 ************************* //
● XML file to get values from
第 1 个参数:从中获取值的 XML 文件
● XPath expression to match against
第 2 个参数:要匹配的 xpath 表达式
函数参数 | 描述 | 是否必需 |
---|---|---|
第 1 个参数 | XML 文件名:一个待解析的 XML 文件名 | 是 |
第 2 个参数 | XPath:一个 XPath 表达式,用于在 XML 文件中寻找目标节点 | 是 |