扩展JMeter - 创建自定义函数 - String Joiner (翻译)
JMeter是测试自动化社区中最好的开源工具之一。它提供了所有可能的扩展,可以快速提供我们的测试脚本。为了让我们的生活更轻松,它还让我们通过实现几个接口来提出我们自己的插件。
在本文中,让我们看看如何创建自定义函数并使其出现在下面的JMeter 函数帮助器对话框中。

目标:
我的目标是创建一个简单的Join函数,它将使用给定的分隔符连接2个给定的字符串并将其存储在用户定义的变量中。
用法是 $ {__ join(string1,string2,delimiter,resultVariable)}
参考:
我们将参考JMeter的AbstractFunction ,它应该被扩展用于创建我们自己的函数和 __ strLen函数,以便了解我们自己的函数是如何实现的。
设置IDE:
让我们首先使用所有依赖项设置我们的IDE。
- 创建一个简单的Maven项目

- 添加以下依赖项以创建自定义函数 - 根据需要添加其他依赖项。
| < 依赖 > | |
| < groupId > org.apache.jmeter </ groupId > | |
| < artifactId > ApacheJMeter_core </ artifactId > | |
| < version > 3.1 </ version > | |
| </ dependency > |
创建自定义功能:
- 我通过扩展' AbstractFunction ' 创建一个StrJoin.java
- 我让IDE添加'未实现的方法'。它看起来像这样。

- getReferenceKey方法返回函数的名称。来源就在这里。
- 所以我创建了一个带有函数名的String常量,并使该方法返回变量。这将出现在Function Helper对话框中。
- getArgumentDesc方法返回一个字符串列表来描述我们的自定义函数的每个参数。来源就在这里。

- 所以我创建了一个LinkedList来为我们的自定义函数添加每个参数的描述,如下所示。
private static final List<String> desc = new LinkedList<String>(); static {
desc.add("String 1");
desc.add("String 2");
desc.add("Delimiter");
desc.add("Name of variable in which to store the result (optional)");
}- view rawjmeter-custom-function-getdesc.java hosted with ❤ by GitHub
- setParameters方法的参数参数将保存我们在JMeter中为自定义函数设置的所有参数。让我们将它们存储在一个阵列中供我们使用。
private Object[] values; @Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
values = parameters.toArray(); //returns an object array
}} - The logic for joining 2 Strings should be in the ‘execute‘ method.
@Override
public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException { JMeterVariables vars = getVariables(); String str1 = ((CompoundVariable) values[0]).execute().trim(); //parameter 1
String str2 = ((CompoundVariable) values[1]).execute().trim(); //parameter 2
String delimiter = ""; if(values.length>2){
delimiter = ((CompoundVariable) values[2]).execute(); //parameter 3 - delimiter could be a space - don't trim
} String result = str1 + delimiter + str2; //user might want the result in a variable
if( null!=vars && values.length>3){
String userVariable = ((CompoundVariable) values[3]).execute().trim();
vars.put(userVariable, result); //store the result in the user defined variable
} return result;
}- view rawjmeter-custom-function-execute.java hosted with ❤ by GitHub
StrJoin类看起来像这样。
package com.testautomationguru.plugins.functions; import java.util.Collection;
import java.util.LinkedList;
import java.util.List; 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.apache.jmeter.threads.JMeterVariables; public class StrJoin extends AbstractFunction { private static final List < String > desc = new LinkedList < String > ();
private static final String MyFunctionName = "__Join"; static {
desc.add("String 1");
desc.add("String 2");
desc.add("Delimiter");
desc.add("Name of variable in which to store the result (optional)");
} private Object[] values; public StrJoin() {} public List < String > getArgumentDesc() {
return desc;
} @Override
public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException { JMeterVariables vars = getVariables(); String str1 = ((CompoundVariable) values[0]).execute().trim(); //parameter 1
String str2 = ((CompoundVariable) values[1]).execute().trim(); //parameter 2
String delimiter = ""; if (values.length > 2) {
delimiter = ((CompoundVariable) values[2]).execute(); //parameter 3 - delimiter could be a space - don't trim
} String result = str1 + delimiter + str2; //user might want the result in a variable
if (null != vars && values.length > 3) {
String userVariable = ((CompoundVariable) values[3]).execute().trim();
vars.put(userVariable, result); //store the result in the user defined variable
} return result;
} @Override
public String getReferenceKey() {
return MyFunctionName;
} @Override
public void setParameters(Collection < CompoundVariable > parameters) throws InvalidVariableException {
values = parameters.toArray();
}
}Export:
- 将此类导出为Jar文件或mvn clean package命令将创建jar文件。
- 复制Jar文件并将其放在JMETER_HOME / lib / ext文件夹下。重启JMeter。
- 检查功能助手。我们的自定义功能应该出现在那 (如果没有出现,请检查JMeter日志文件是否有异常)

测试自定义功能:
- 我在JMeter中创建一个简单的测试来使用我们的自定义函数,如下所示。

- 执行并验证Debug Sampler的响应数据。

- JMeter按照我们的预期加入2个字符串,并将结果存储在用户定义的变量中。
摘要:
我希望这篇文章可以帮助您提出自己的函数实现。我们还将在未来的文章中看到更多我们如何扩展其他JMeter的测试元素。
扩展JMeter - 创建自定义函数 - String Joiner (翻译)的更多相关文章
- mysql创建自定义函数与存储过程
mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...
- MySQL 创建自定义函数(2)
说明:下面创建一个函数,调用自定义函数返回一个返回一个随机数. (1) 创建自定义函数
- 题目要求:传入数组 内容为[['lisi','男','27'],['wangwu','男',18],['zhaoliu','男','30']],将此二维数组转化为一维数组,创建自定义函数完成
//自定义函数 function getOne($arr){ $str = ''; //定义空的字符串,用来接收值 foreach ($arr as $key=>$value){ //循环遍历数 ...
- MySQL 创建自定义函数
语法:Create function function_name(参数列表)returns返回值类型 函数体 函数名,应合法的标识符,不应与系统关键字冲突. 一个函数应该属于某个数据库,可以使用db_ ...
- MySQL下创建序列及创建自定义函数方法介绍
工作过程中需要将基于DB2数据库的应用以及数据迁移到MySQL中去,在原应用中,大量使用了SEQUENCE,考虑尽量减少代码的修改,决定在迁移后的应用中继续保留SEQUENCE的使用,这就要求在MyS ...
- MySQL 创建自定义函数(1)
1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS ...
- PLSQL 创建自定义函数注意事项
2017-6-8周四,今天遇到的需求是,从数据库中查找出某张表的某些数据,并将这些数据做简单的加减运算再得到结果集,没有思路,后来问辉哥,给我的建议是给这些运算封装成一个SQL函数,select选择字 ...
- MySQL基于实例sales创建自定义函数、视图、存储过程及触发器
实例:数据库sales 1.客户表(Customer) 客户编号(CusNo) 姓名(CusName) 地址(Address) 电话(Tel) C001 杨婷 北京 010-5328953 C002 ...
- Lua 自定义函数string.split
function string.split(str, delimiter) if str==nil or str=='' or delimiter==nil then return ...
随机推荐
- 批量修改mysql的表前缀
如何批量修改mysql的表前缀名称教程中将涉及两种方法修改,一种是批量修改(使用php脚步完成)一种是精确修改(使用sql查询语句完成). 方法一:使用sql语句修改mysql数据库表前缀名 首先我们 ...
- BZOJ4317: Atm的树+2051+2117
BZOJ4317: Atm的树+2051+2117 https://lydsy.com/JudgeOnline/problem.php?id=4317 分析: 二分答案之后就变成震波那道题了. 冷静一 ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- bzoj 3165: [Heoi2013]Segment 线段树
题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...
- 问题11:如何进行反向迭代 & 如何实现反向迭代
# 有关列表问题,参考:Python:列表list 案例: 需求:实现一个连续浮点数发生器FloatRange(和range类似),根据给定范围(start,end)和步进值(step),产生一系列连 ...
- JVM插庄之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- jquery 中post 、get的同步问题,从外部获取返回数据
解决方法1: 在全局设置: $.ajaxSetup({ async : false }); $.ajaxSetup({ async : false }); 然后再使用post或get方法 $.get( ...
- arm-linux-3.4.2移植for2440
----------------------------2440 上内核3.4.2移植------------------------ PS:因wifi项目中无wifi驱动,需新内核. 1.首先在内核 ...
- XML解析代码课堂讲解实例
//获取所有的子元素,不包括回车 package com.dom4jDemo; import java.io.File; import java.util.List; import org.dom4j ...
- Java探索之旅(7)——对象的思考
1.知识要点 ❶不可变类:一旦创建,其内容不能改变的类称之为不可变类.满足:⑴所有数据域私有,⑵没有修改器,⑶没有访问器方法,其返回一个指向可变数据域的引用.(这样通过引用就能修改私有数据域).比如, ...