Jmeter强大之处是其开源性和可扩展性,所以Jmeter拥有大量丰富的插件和元件,还有各种好用的函数,如果能巧妙应用函数助手里的函数,就能让性能测试脚本插上翅膀,实现各种复杂的计算和逻辑应用场景。

以下是我整理的各个版本所启用的函数(可能也会有一点出入,欢迎大家指正),这些函数在不同的jmeter版本中启用,所以jmx脚本的兼容性一定要考虑到这些因素(如果函数一但不能被解析,就会出问题),以下列表只是说明了函数的作用,具体使用方法可以见Jmeter函数助手(主要是参数及相关格式要搞清楚):

函数类型 函数名称 函数作用 启用版本
获取信息函数 __TestPlanName 返回当前测试计划的名称,调用 ${__TestPlanName}
__threadGroupName 返回当前线程组的名称 4.1
__threadNum 返回当前正在执行的线程的编号 1.X
__samplerName 返回当前请求的名称 2.5
__log 输出日志信息,示例 ${__log(报错了,ERR,,)},另一个简化的函数__logn,少了第四个参数[日志注释] 2.2
__machineName 获取当前机器名称,调用${__machineName()} 2.2
__machineIP 获取当前机器IP,调用${__machineIP()} 2.2
__time 以多种格式返回当前时间,默认13位时间戳如 ${__time(,)} 2.2
__timeShift 可对日期时间进行移位加减操作,包含5个参数(格式,日期,移位,语言环境,存储变量);举例 ${__timeShift(dd/MM/yyyy,,P-1D,,)}表示以指定格式创建当前日期,减去一天 4.0
数据输入函数 __StringFromFile 从文本文件中读取字符串,每次调用读取一行 1.9
__FileToString 把文件读取成一个字符串,每次调用都是读取整个文件 2.4
__CSVRead 读取参数文件的值,如读取第一列的参数 ${__CSVRead(D:\jmeter\login.txt,0)} 1.9
__XPath 使用 XPath 语法匹配 XML文件 2.0
__evel 返字符串表达式的结果。可以在一个变量中插入一个有值的字符串表达式或函数或变量,比如变量嵌套:举例${__evel{你好$id}},其中id来自txt参数文件,文件中的id第一行为1${__UUID},第二行2${__UUID},以此类推 2.0
__evelVar 作用同evel,只是参数不是表达式,是变量名,这个变量的值允许含表达式或函数或变量,如 ${__evalVar(SQL)} 2.0
__V 嵌套函数,作用类似于__evel,支持在变量中嵌套变量,如 ${__V(userName_${no},)} 2.0
数据计算函数 __counter 计数器函数 1.9
__intSum 对多个整数求和,如:${__intSum(${year},-1,)} 1.8.1
__longSum 长整型求和 2.3.2
__Random 返回指定最大值和最小值之间的随机整数 1.9
__RandomDate 返回给定开始日期和结束日期值之间的随机日期 3.3
__RandomString 根据给定的字符生成指定长度的随机字符串 2.6
__RandomFromMultipleVars 从多个变量中随机取一个变量值,用|号分隔变量 3.2
__dateTimeConvert 提供两种时间格式的快速转换,举例:${__dateTimeConvert(01 Jan 2017,dd MMM yyyy,dd/MM/yyyy,)} 4.0
__UUID 通用唯一标识符函数,如${__UUID} 2.9
__digest 加密计算,支持MD5、SHA等;如:${__digest(MD5,Apache JMeter 4.0 rocks !,,,)} 4.0
__char ASCII码/十进制 转 字符,如:${__char(97)}输出a 4.0
属性信息函数 __isPropDefined 判断属性是否存在 4.0
__setProperty 用于动态设置JMeter属性,一般用于不同线程组之间传递变量,如将旧变量保存为全局变量:${__setProperty(new_var,${old_var},false)} 2.0
__property 获取属性值的函数,支持将结果另存为变量,如 ${__property(START.MS,新变量,默认值)} 1.8.1
__P 简化的获取属性值函数,用于与命令行上定义的属性一起使用,不支持另存为变量,如 ${__P(START.MS,默认值)} 2.0
字符串操作函数 __split 根据分隔符拆分字符串为多个变量,如${__split(1\,2\,3\,4,var,\,)} 逗号分隔符用\转义,分解完var_1表示第一个值1 2.0.2
__changeCase 转换大小写,如转为小写${__changeCase(ABC,LOWER,)} 4.0
__regexFunction 使用正则表达式解析之前的响应结果(一般不用它,用正则表达式提取器),包含6个参数,具体使用见[这里] 1.X
__escapeHtml 转换为HTML格式的字符,支持HTML 4.0实体,对应反传函数为__unescapeHtml;类似函数还有__escapeXml 2.0
__urlencode 将字符串进行url转码;对应的解码函数是__urldecode 2.0
__unescape 去除字符串中的转义符 2.0
脚本函数 __BeanShell 参数为beanshell脚本表达式,如${__BeanShell(123*456,)}:返回56088;${__BeanShell(source("function.bsh",))}:执行function.bsh代码; 1.X
__groovy 参数为groovy脚本表达式,如${__groovy(123*456,)}:返回56088;${__groovy(${num}%2==1)}:实现if控制; 1.X
__javaScript 执行 js 脚本,涉及逗号要用\转义,变量要用""包含,如:${__javaScript('${var}'.slice(2\,4))} 1.9
__jexl 使用Jexl表达式引擎解析,包括两个版本__jexl2和__jexl3,如${__jexl3(${num}<10)}也相当于if控制 1.9
验证信息函数 __isVarDefined 测试属性是否可用,如:${__isPropDefined(START.HMS)}返回true 4.0
__isPropDefined 测试变量是否可用,如:${__isVarDefined(JMeterThread.last_sample_ok)} 返回true 4.0

除了Jmeter原装的函数,大家还喜欢用到第三方的JMeterPlugins插件,比如JMeterPlugins-ExtrasLibs,这里面还带一些扩展的函数,一般使用率不高,但是其中的__env获取环境变量,__chooseRandom随机选取值,我们用的也比较多:

函数类型 函数名称 函数作用 版本
获取信息函数 __env 获取系统环境变量值,如${__env(JAVA_HOME,newName,C:\jdk1.8)} 1.2
__iterationNum 获取循环迭代号,如${__iterationNum} 1.2
数据计算函数 __base64Encode 将字符串进行base64位编码,对应的解码函数为__base64Decode 1.2
__chooseRandom 枚举随机数,从多个数值或字符串中随机取值,用逗号分隔,最后一个逗号后面为空或是变量名。举例:${__chooseRandom(A1,B2,C3,D4,)},随机4选1返回 1.2
__doubleSum 符点型求和 1.2
__MD5 MD5串生成,如 ${__MD5(12345,)}  返回12345的md5加密串 1.2
字符串操作函数 __lowercase 将字符串转为小写字母,如${__lowercase(ABC,)} 1.2
验证信息函数 __isDefined 测试属性或变量是否可用,如:${__isDefined(START.HMS)}返回1 1.2

除了用到Jmeter自带的函数,以及JMeterPlugins插件所带有的函数,我们还可以进行自定义函数的开发:

在package org.apache.jmeter.functions;中增加自定义函数,代码模板如下:

package org.apache.jmeter.functions;import java.util.Collection;
import java.util.LinkedList;
import java.util.List;import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;public class MyFrisFuncion extends AbstractFunction{private static final List<String> desc = new LinkedList<String>();public static void main(String[] args) {// TODO Auto-generated method stub}@Overridepublic List<String> getArgumentDesc() {/*** Return a list of strings briefly describing each parameter your function* takes. Please use JMeterUtils.getResString(resource_name) to grab a* resource string. Otherwise, your help text will be difficult to* internationalize.** This list is not optional. If you don't wish to write help, you must at* least return a List containing the correct number of blank strings, one* for each argument.* @return List with brief descriptions for each parameter the function takes*///本方法简要描述函数的每个参数,使用JMeterUtils.getResString可获取中文资源字符串//中文描述资源文件路径为 bin/core/org/apache/jmeter/resources/messages_zh_CN.propertiesreturn desc;}@Overridepublic String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException {/*** Given the previous SampleResult and the current Sampler, return a string* to use as a replacement value for the function call. Assume* "setParameter" was previously called.** This method must be threadsafe - multiple threads will be using the same* object.* @param previousResult The previous {@link SampleResult}* @param currentSampler The current {@link Sampler}* @return The replacement value, which was generated by the function* @throws InvalidVariableException - when the variables for the function call can't be evaluated*///本方法是提供一个在Jmeter调用的函数入口return "Jmeter函数";}@Overridepublic String getReferenceKey() {/*** Return the name of your function. Convention is to prepend "__" to the* name (ie "__regexFunction")* @return The name of the function*///本方法是提供一个在Jmeter函数助手显示的函数名称return "__NewFunction";}@Overridepublic void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException {/*** A collection of the parameters used to configure your function. Each* parameter is a CompoundVariable and can be resolved by calling the* execute() method of the CompoundVariable (which should be done at* execution.)** @param parameters The parameters for the function call* @throws InvalidVariableException - when the variables for the function call can't be evaluated*///本方法是设置函数参数使用的!checkParameterCount是校验参数数量//以下第2个参数为MIN_PARAM_COUNT,第3个参数为MAX_PARAM_COUNT,两者差值就是可选参数数量checkParameterCount(arg0, 0, 0); // 都是0表示无入参}
}

2、重构以上代码并打成jar包

(1)创建自定义函数__RandomEmail

package org.smooth.jmeter.functions;import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.smooth.jmeter.functions.core.RandomString;import java.util.Collection;
import java.util.LinkedList;
import java.util.List;/*** 随机生成电子邮箱* @author smooth* @date 2019-12-02 13:15*/
@SuppressWarnings("unchecked")
public class RandomEmail extends AbstractFunction {@Overridepublic String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {return RandomString.getEmail();}@Overridepublic void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {checkParameterCount(collection, 0, 0);}/*** 提供jmeter函数助手显示的下来选项名称**/@Overridepublic String getReferenceKey() {return "__RandomEmail";}public List<String> getArgumentDesc() {return new LinkedList();}
}

其中电子邮箱随机生成的代码如下:

package org.smooth.jmeter.functions.core;/*** @author smooth00* @date 2019-12-02 11:21*/
public class RandomString {/** 普遍随机字符串来源 */private static final String[] SOURCE_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("|");/** 常用邮箱后缀 */private static final String EMAIL_SUFFIX = "@gmail.com, @yahoo.com, @msn.com, @hotmail.com, @aol.com, @ask.com, @live.com, @qq.com, @0355.net, @163.com, @163.net, @263.net, @3721.net, @yeah.net, @googlemail.com, @126.com, @sina.com, @sohu.com, @yahoo.com.cn";/*** 获取0到指定数值间的随机数,内部使用* @param max* @return*/private static int getRandomNum(int max) {if (max < 0) {throw new RuntimeException("最大值需要大于或等于0");}return (int) (Math.random() * max);}/*** 返回[0-9,a-z,A-Z]的随机字符串* @param len 字符串长度* @return*/public static String getFixed(int len) {StringBuilder resBuf = new StringBuilder();for (int i = 0; i < len; i++) {int randIndex = getRandomNum(SOURCE_STRING.length);resBuf.append(SOURCE_STRING[randIndex]);}return resBuf.toString();}/*** 生成随机指定范围的定长字符串** @param src 产生随机字符串来源,使用英文逗号分开* @param len 返回字符串长度* @return*/public static final String getRange(String src, int len) {if (src == null || src.length() == 0) {throw new RuntimeException("来源字符串为空");}if (len < 1) {throw new RuntimeException("返回字符串长度需要大于0");}String[] arr = src.split(",");StringBuffer buf = new StringBuffer();for (int i = 0; i < len; i++) {int index = getRandomNum(arr.length);buf.append(arr[index].trim());}return buf.toString();}/*** 生成随机电子邮箱* @return*/public static String getEmail() {// 生成用户名 6-16 位长度int len = getRandomNum(10) + 6;String userName = getFixed(len).toLowerCase();String email = getRange(EMAIL_SUFFIX, 1);return userName + email;}
}

(2)Maven Build生成jar包,

(3)将jar包拷贝至$JMETER__HOME/lib/ext目录下,重启Jmeter

3、在Jmeter的函数助手中看到新增的函数,并调试通过

4、具体代码我已发布,可以参考 https://gitee.com/smooth00/jmeter-ExtraFunc-plugins

代码结构:

jmeter-ExtraFunc-plugins
├─src
│  └─main
│     ├─java
│     └─resources
├─pom.xml

开发说明:

  • 1、Jmeter插件必须在包含.functions包下
  • 2、创建一个类,继承org.apache.jmeter.functions.AbstractFunction,重写下面方法:
/** 函数执行逻辑,并返回值 */
public String execute(SampleResult sampleResult, Sampler sampler);
/** 接受处理入参 */
public void setParameters(Collection<CompoundVariable> collection);
/** 定义返回函数名称 */
public String getReferenceKey();
/** 定义函数入参说明 */
public List<String> getArgumentDesc();

Jmeter函数分类及自定义开发相关推荐

  1. jmeter函数助手二次开发之加解密

    首先新建一个java工程,然后在scr下新建一个cn.com.functions 包,在eclipse中导入二次开发中需要的jar包 新建一个class :String1Encrypt.java 继承 ...

  2. JMeter函数自定义开发

    JMeter之所以强大,就是因为其开源性和可扩展性,大家开发了大量的插件,也开发了不少的函数,这些函数如果能巧妙应用就能减少我们的工作量,实现各种复杂的计算和逻辑应用场景.很多人会觉得开发JMeter ...

  3. 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)

    目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...

  4. [C语言] 函数:库函数--自定义函数--函数的调用--练习--详解<个人>------(1)

    文章目录 前言 一. 函数是什么? 二. C语言中函数的分类 三. 库函数 四. 自定义函数 五. 函数的调用 六. 练习 总结 前言 本节内容主要记录函数的相关内容,其中包括:库函数,自定义函数,函 ...

  5. C语言函数(函数分类,参数,调用,声名及定义)

    文章目录 @[TOC](文章目录) 一.C语言中函数的分类 二.函数的参数及调用 三.函数的嵌套调用和链式访问 四.函数的声名和定义 一.C语言中函数的分类 库函数 自定义函数 库函数:在开发的过程中 ...

  6. 详解JMeter函数和变量

    详解JMeter函数和变量(1) JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用.函数调用的语法如下: ${__functionName(var1,var2,var ...

  7. 性能测试之JMeter函数助手详解

    1.函数助手介绍 在性能测试过程中,为了模拟真实的用户,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化. JMeter中的配置元件与前置处理器都能帮助我们实现参数化,为了能够更好的帮助 ...

  8. Ueditor自定义开发地图功能

    Ueditor自定义开发地图功能 由于最近需要对地图功能进行修改,所以基于Uedior做了二次开发,根据百度地图官方提供的api和例子,完成了以下功能: 即:显示圆形区域内的定点范围的周边设施! 地图 ...

  9. 微信小程序网悦新闻开发--云函数以及云数据开发(七)

    目录 微信小程序网悦新闻开发--功能介绍(一) 微信小程序网悦新闻开发--小程序配置(二) 微信小程序网悦新闻开发--首页模块开发(三) 微信小程序网悦新闻开发--视频模块开发(四) 微信小程序网悦新 ...

最新文章

  1. 解读目标检测新范式:Segmentations is All You Need
  2. 全球 PC 应用程序有半数已过期未更新
  3. 不符合核销规则条件_对不起!您不符合2020年初级报考条件
  4. kettle使用数据库来生成序列_kettle专题5:数据转换
  5. 整理的几个常用的数据库维护的脚本
  6. inno setup读取XML文件
  7. CleanMyMac下载正版清理苹果mac系统电脑蓝奏云
  8. Ubuntu 挂载windows硬盘突然变成只读了???
  9. 开源 MQTT 服务器
  10. 2018腾讯秋招笔试题
  11. 自建网站教程!如何用云服务器搭建个人网站?
  12. 用blockly制作诗词学习游戏
  13. 《FFmpeg从入门到精通》读书笔记(五)
  14. 【原创】Mac电脑如何开启Aptx
  15. abp viewmodel的写法
  16. 系统调用是什么,你用过哪些系统调用
  17. 三井化学将扩大LUCANT™产能
  18. C语言-关键字及其作用
  19. 计算机毕业设计之 医院管理系统
  20. 修改伪造Flash版本号

热门文章

  1. 第十四届蓝桥杯C++ B组——冶炼金属
  2. 用JS刷剑指offer
  3. 安装npm及cnpm(Windows)
  4. java int 降序
  5. OPPO手机信号栏发现了HD标志,说明你打开了这个功能,望周知
  6. vs2017无法查找或打开 pdb 文件
  7. ENVI处理遥感教程及学习资料
  8. 在虚拟机上安装linux 宝塔,虚拟机安装宝塔Linux面板
  9. 人家这才叫员工培训,你那只是走过场
  10. word文档直接嵌入到jsp页面