其他文章
每天15分钟JMeter入门篇(一):Hello JMeter
每天15分钟JMeter入门篇(二):使用JMeter实现并发测试
每天15分钟JMeter入门篇(三):认识JMeter的逻辑控制器
每天15分钟JMeter入门篇(四):认识JMeter中的函数
每天15分钟JMeter入门篇(五):认识JMeter中的Test Fragment
每天15分钟JMeter入门篇(六):学会用好JMeter中的断言
每天15分钟JMeter入门篇(七):认识JMeter中的监听器
每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用
每天15分钟JMeter入门篇(四):认识JMeter中的函数
前言
通过本章的内容,你可以:
- 了解JMeter的公式
- 了解JMeter中公式的用法
- 在实际的测试脚本中使用公式
让我们开始吧
了解JMeter中的公式
用过excel的人都应该知道,excel最强大的功能之一就是它丰富的公式,利用公式你甚至可以用excel实现简单数据库的功能,其实我真的见到过有拿csv给客户做数据存储的,而且做的非常棒。在JMeter中公式也同样起到很重要的作用,通过公式,你可以实现脚本的参数化,你可以快速的处理数据,你甚至可以像javascript的eval那样执行表达式。JMeter的函数是它强大的原因之一
JMeter函数介绍
JMeter使用函数的方法很简单,在脚本的任意位置都可以用${__function()}这种形式来调用一个函数,function是函数名
除了手写函数,JMeter还可以用函数助手来快速生成所需要的函数,生成后可以拷贝到脚本中。
JMeter的函数从用途上可以分为三类,一是系统函数,用来获取JMeter各种运行时状态和属性,例如线程名称、客户端机器IP等,二是数据处理函数,例如生成随机数、时期函数等;三是BeanShell函数,将它单独作为一个类别,就是因为它能执行表达式,和其他任何函数的用途都不一样;
函数助手
工具栏上点击【工具】——【函数助手】,可以打开函数助手对话框,如图:
函数助手的使用还是比较简单的,首先选择要生成的函数,然后在“函数参数”中分别设置函数的参数,点击生成可以生成函数的字符串,复制粘贴到i脚本中即可,下面有预览函数的结果,
函数一览
掌握函数的重点是了解函数的用法。你可以不用死记硬背每个函数的参数、解释、定义,但是你需要了解JMeter有哪些函数,他们能干什么。例如你可以不用死记JMeter有哪些日期函数,函数有什么参数,你只需要知道【JMeter提供了日期函数,它能处理日期】就足够了,具体的用法在网络上或者官方文档里都能找到
整理函数列表时,使用的版本是5.4.1,如果你的版本是5.2及以上,那么是包含以下这些函数的,以下是JMeter的函数列表
编号 | 函数名称 | 函数解释 | 支持版本 |
---|---|---|---|
1 | ${__BeanShell(,)} | beanshell函数执行一个表达式,也就是计算一个字符串,例如${__BeanShell(“aa” + “bb”},返回的结果就是aabb,BeanShell里的表达式也可以三目运算符或者逻辑表达式 | 1.x |
2 | ${__changeCase(,)} | 返回一个字符串,该字符串按照给定的模式转换小写,例如 ${__changeCase(小写转大写:aaaa,upper,)}返回AAAA,最后一个upper参数将小写转换成大写 ${__changeCase(小写转大写:AAbbCC,lower,)}返回aabbcc,lower参数将大写转换成小写 ${__changeCase(aa bb cc,CAPITALIZE,)}返回Aa bb cc,如果字符串以英文开头,则将第一个首字母转换成大写,其他都小写,如果不是英文开头,则不做任何处理。 | 4.0 |
3 | ${__char()} | 把一组数字转成Unicode字符,例如${__char(65)},结果就是A | 2.3.3 |
4 | ${__counter(,)} | 顾名思义它是个计数器,最常用的场景就是记录线程迭代的次数,也就是执行次数。例如对于异步等待的尝尽个,我们不可能永远等待,这时可以用count函数统计迭代次数,超过阈值则退出循环。第一个参数为true则是每个线程独立的计数器;为false则是全局的,会把所有线程的结果合并到一起 | 1.x |
5 | ${__CSVRead(,)} | 从csv文件中读取指定列的值,可以读取固定值和动态值。${__CSVRead(“d:/test/data.csv”,0)}读取文件第0行第0列(也就是第一行第一列)的值,多次迭代仍然是第一行,${__CSVRead(“d:/test/data.csv”,0)} ${__CSVRead("d:/test/data.csv”,next)}是顺序读取第一列的值,每次迭代会读取下一行,之所以有那个0的调用,是因为要告诉JMeter先读取第一行然后顺序next读取。next也可以换成*别名的方式,例如${__CSVRead(d:/test/data.csv,*data)},此时在脚本中的而难以位置,我们都可以用${__CSVRead(*data,1)}来读取数据了。 | 1.9 |
6 | ${__dateTimeConvert(,)} | 将一个时间戳,从源格式转换成指定的目标格式,例如${__dateTimeConvert(01212018,MMddyyyy,dd/MM/yyyy,)},其中01是月份,21是DD,2018是yyyy,这时函数会按照给定的MMddyyyy解析,并转换成21/01/2018的是返回,如果源格式为空,则字符串必须是一个epoch time,也就是Linux时间戳 | 4.0 |
7 | ${__digest(,)} | 使用给定的加密算法,返回加密后的字符串,例如、${__digest(md5,hello,)},返回字符串5d41402abc4b2a76b9719d911017c592。目前该函数支持的加密算法包括:MD2,MD5,SHA-1,SHA-224,SHA-256,SHA-384,SHA-512 | 4.0 |
8 | ${__escapeHtml()} | 把字符转换成html格式的字符串,简单的说就是转义。例如${__escapeHtml(")}的结果就是" ,在涉及到响应报文处理和解析的时候,这个函数很好用。 | 2.3.3 |
9 | ${__eval()} | 用来返回一个表达式的值,它最常见的做法是嵌套的引用表达式,直接用官方的例子更通俗易读 name=Smith column=age table=birthdays SQL=select ${column} from ${table} where name=‘${name}’ 这个时候你写${__eval(${SQL})},最后得到的结果就是完整的SQL:select age from birthdays where name=‘Smith’,之前的$变量都已经换成了常量,这就是所谓的嵌套引用表达式,你定义的表达式在eval中都被“计算”了 | 2.3.1 |
10 | ${__evalVar()} | 用途和eval类似,区别在于evalvar可以定义一个变量,将表达式计算的结果存储在变量中供sampler取样器引用 | 2.3.1 |
11 | ${__FileToString(,)} | 读取一个文件的内容,例如${__FileToString(d:/test.log,utf-8,context)},该函数读取test.log的内容,并存储到变量context中,编码是utf-8,之后其他取样器就可以通过${context}来引用文件的内容了 | 2.4 |
12 | ${__groovy(,)} | 执行给定的groovy脚本 | 3.1 |
13 | ${__intSum(,)} | 用来对整数求和,多个整数可以累加,用逗号分隔 | 1.8.1 |
14 | ${__isPropDefined()} | 测试一个属性是否存在,再用JMeter构筑执行平台的时候会很有 | 4.0 |
15 | ${__isVarDefined()} | 测试一个变量是否存在 | 4.0 |
16 | ${__javaScript(,)} | 用来返回javascript脚本的执行结果,可以存储在变量中供其他的取样器调用 | 1.9 |
17 | ${__jexl2(,)} | 提供对JEXL表达式的支持,JEXL2是对Commons JEXL 2支持 | 2.1.1 |
18 | ${__jexl3(,)} | 提供对Commons JEXL 3的支持 | 3.0 |
19 | ${__log(,)} | 日志方法,返回输入字符串的信息,并且输出日志 | 2.2 |
20 | ${__logn(,)} | 同log,知识它不返回结果 | 2.2 |
21 | ${__longSum(,)} | 用来对长整数求和 | 2.3.2 |
22 | ${__machineIP()} | 返回本机IP,注意返回的是当前JMeter执行时所在机器的IP。 | 2.6 |
23 | ${__machineName()} | 返回本机机器名 | 1.x |
24 | ${__P(,)} | 获取属性的函数,例如我们在命令行下启动JMeter,会希望通过命令行给JMeter传递参数,那么在命令行里写参数,运行时就可以用${__P()}来获取参数 | 2.0 |
25 | ${__property(,)} | 获取JMeter的属性,能获取到的范围为%JMETER_HOME%\bin\jmeter.properties中的值 | 2.0 |
26 | ${__Random(,)} | 生成随机数并保存到变量 | 1.9 |
27 | ${__RandomDate(,)} | 根据给定的时间范围,生成一个范围内的随机时间,该函数在压测需要对时间进行参数化的时候经常用到 | 3.3 |
28 | ${__RandomFromMultipleVars(,)} | 一个很魔性的函数,它的作用是从给定的变量中随机取值。例如你增加一个”用户定义的变量“,在里面设置5个变量分别为v1,v2,v3…v5,然后你写${__RandomFromMultipleVars(v1 | v2 |
29 | ${__RandomString(,)} | 生成随机字符串 | 2.6 |
30 | ${__regexFunction(,)} | 正则表达式提取函数。例如你又一个HTTP取样器,执行后返回了报文,此时可以用它来匹配返回值,你可以把它理解为后置处理器中的正则表达式 | 1.x |
31 | ${__samplerName()} | 获取当前sampler的名称,sampler就是取样器 | 2.5 |
32 | ${__setProperty(,)} | 用来动态设置JMeter的属性 | 2.1 |
33 | ${__split(,)} | 用来拆分字符串,作用和JAVA的split一样,拆分后是一个数组,保存在变量中 | 2.0.2 |
34 | ${__StringFromFile(,)} | 从文件中读取内容,一行一行的读取。读完完成后会从第一行开始重新读取,但是要特别注意的是,如果脚本有多个__StringFromFile,那么每个__StringFromFile都会打开一次文件。因此这个函数不适应用的太多。如果要读取数据文件,可以考虑csv data set config元件 | 1.9 |
35 | ${__StringToFile(,)} | 将一个字符串写入指定的文件,该函数从5.2开始提供,省去自己用BeanShell写IO了。 | 5.2 |
36 | ${__TestPlanName} | 返回当前测试计划的名称 | 2.6 |
37 | ${__threadGroupName} | 返回当前线程组的名称 | 4.1 |
38 | ${__threadNum} | 返回线程号 | 1.x |
40 | ${__time(,)} | 返回当前时间,可以指定返回时间格式 | 2.2 |
41 | ${__timeShift(,)} | 该函数返回指定格式的日期,并添加秒、分钟、小时、天、月、或者年。例如${__timeShift(dd/MM/yyyy,21/01/2018,P2D,)}返回23/01/2018 | 3.3 |
42 | ${__unescape()} | 返转escape字符, | 2.3.3 |
43 | ${__unescapeHtml()} | 该函数反转url链接中的Unicode编码字符例如"转成" | 2.3.3 |
44 | ${__urldecode()} | 反转url链接中的Unicode字符,例如%22转换成" | 2.10 |
45 | ${__urlencode()} | 把url链接中的escap字符转换成Unicode编码,例如${__urlencode(Word “school” is “école” in french)},转换成Word+%22school%22+is+%22%C3%A9cole%22+in+french | 2.10 |
46 | ${__UUID} | 返回为以后的uuid字符串 | 2.9 |
47 | ${__V(,)} | 执行变量表达式并返回结果 | 2.3RC3 |
48 | ${__XPath(,)} | 可以从xml格式的文件中匹配内容 | 2.0.3 |
49 | ${__escapeOroRegexpChars(,)} | 把正则表达式转换成JAVA正则引擎能够识别的表达式,按照文档,转换过程中使用了ORO正则表达式库。 | 2.9 |