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 (翻译)的更多相关文章

  1. mysql创建自定义函数与存储过程

    mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...

  2. MySQL 创建自定义函数(2)

    说明:下面创建一个函数,调用自定义函数返回一个返回一个随机数. (1) 创建自定义函数

  3. 题目要求:传入数组 内容为[['lisi','男','27'],['wangwu','男',18],['zhaoliu','男','30']],将此二维数组转化为一维数组,创建自定义函数完成

    //自定义函数 function getOne($arr){ $str = ''; //定义空的字符串,用来接收值 foreach ($arr as $key=>$value){ //循环遍历数 ...

  4. MySQL 创建自定义函数

    语法:Create function function_name(参数列表)returns返回值类型 函数体 函数名,应合法的标识符,不应与系统关键字冲突. 一个函数应该属于某个数据库,可以使用db_ ...

  5. MySQL下创建序列及创建自定义函数方法介绍

    工作过程中需要将基于DB2数据库的应用以及数据迁移到MySQL中去,在原应用中,大量使用了SEQUENCE,考虑尽量减少代码的修改,决定在迁移后的应用中继续保留SEQUENCE的使用,这就要求在MyS ...

  6. MySQL 创建自定义函数(1)

    1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS ...

  7. PLSQL 创建自定义函数注意事项

    2017-6-8周四,今天遇到的需求是,从数据库中查找出某张表的某些数据,并将这些数据做简单的加减运算再得到结果集,没有思路,后来问辉哥,给我的建议是给这些运算封装成一个SQL函数,select选择字 ...

  8. MySQL基于实例sales创建自定义函数、视图、存储过程及触发器

    实例:数据库sales 1.客户表(Customer) 客户编号(CusNo) 姓名(CusName) 地址(Address) 电话(Tel) C001 杨婷 北京 010-5328953 C002 ...

  9. Lua 自定义函数string.split

    function string.split(str, delimiter)    if str==nil or str=='' or delimiter==nil then        return ...

随机推荐

  1. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  2. UVA12163 游戏

    题目大意 现在有两个人在一个n个结点的有向图上玩一个双人游戏,保证图中无环和自圈.游戏的规则如下:1.初始的时候$i$号点有一个正权值$value_i$2.两名玩家依次操作,每个玩家在当前回合可以选择 ...

  3. netsh wlan start hostednetwork

    常用的无线网命令: 一.开启系统承载网络模块和新建无线网络命令: netsh wlan set hostednetwork mode=allow ssid=wifi key=12345678说明:ss ...

  4. LOJ2722 「NOI2018」情报中心

    「NOI2018」情报中心 题目描述 C 国和D 国近年来战火纷飞. 最近,C 国成功地渗透进入了D 国的一个城市.这个城市可以抽象成一张有$n$ 个节点,节点之间由$n - 1$ 条双向的边连接的无 ...

  5. BZOJ1216:[HNOI2003]操作系统

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  6. 洛谷【P2201】数列编辑器

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P220 ...

  7. HDOJ1059(多重背包)

    1.解法一:多重背包 #include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a& ...

  8. 杂项:grunt-tmod

    ylbtech-杂项:grunt-tmod 前端模板预编译工具 tmodjs 的grunt自动化插件. 1.返回顶部 1. grunt-tmod 前端模板预编译工具 tmodjs 的grunt自动化插 ...

  9. Java父类构造器的讲解

    众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类. 对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造 ...

  10. 3 K8s安裝ELK+filebeat

    1 Filebeat: apiVersion: v1 kind: Service metadata: name: XX spec: ports: - name: http port: targetPo ...