扩展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 >

查看GitHub用?托管的原始jmeter-core.xml

创建自定义功能:

  • 我通过扩展‘ 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
    }
  • }

    view rawjmeter-custom-function-setparameters.java hosted with ? by GitHub

    • 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();
        }
    }

  • view rawjmeter-custom-function-complete.java hosted with ? by GitHub

    Export:

    • 将此类导出为Jar文件或mvn clean package命令将创建jar文件。
    • 复制Jar文件并将其放在JMETER_HOME / lib / ext文件夹下。重启JMeter。
    • 检查功能助手。我们的自定义功能应该出现在那 (如果没有出现,请检查JMeter日志文件是否有异常)

    • 测试自定义功能:

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

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

      • JMeter按照我们的预期加入2个字符串,并将结果存储在用户定义的变量中。

      摘要:

      我希望这篇文章可以帮助您提出自己的函数实现。我们还将在未来的文章中看到更多我们如何扩展其他JMeter的测试元素。

原文地址:https://www.cnblogs.com/a00ium/p/10381256.html

时间: 2024-11-05 11:24:07

扩展JMeter - 创建自定义函数 - String Joiner (翻译)的相关文章

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

mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql表结构如下 DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pic` varchar(50) NOT NULL, `hashcode` varchar

mysql 报错之创建自定义函数

I experienced this error while trying to alter one of my stored procedures remotely on a master server. After some research, I ended up getting information from “Binary Logging of Stored Programs“. From MySQL Reference in verbatim:When you create a s

ORACLE创建自定义函数返回varchar类型

需求描述:两张表,如下,需要查询tmp1表中id_new在tmp2中的nameselect from tmp1; select from tmp2;方法一:好处:简单,直接sql展示劣处:如果主表数据量太大,十几亿的话,性能会大大下降,此时建议第二种方法select a.id_old,to_char(wm_concat(distinct a.id_new)) id_new,to_char(wm_concat(distinct b.name)) namefrom tmp2 b,(select a.

MySQL 创建自定义函数(1)

1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS varchar(255) CHARSET utf8BEGIN    DECLARE l_NEW_STR VARCHAR(255);  -- 定义变量    DECLARE l_NAYIBU_NUM1   INT;     SET l_NAYIBU_NUM1=101; IF (l_NAYIBU_NU

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

工作过程中需要将基于DB2数据库的应用以及数据迁移到MySQL中去,在原应用中,大量使用了SEQUENCE,考虑尽量减少代码的修改,决定在迁移后的应用中继续保留SEQUENCE的使用,这就要求在MySQL中寻找替代SEQUENCE的解决方案. 在DB2中创建一个SEQUENCE的方法如下: DROP SEQUENCE TRZ_MEMBER.SEQ_TRZ_MEMBER_NO; CREATE SEQUENCE TRZ_MEMBER.SEQ_TRZ_MEMBER_NO AS BIGINT INCRE

jquery 扩展方法,自定义函数等一些写法

// 传参数 var aa = function(x){ //弹出对象 x 里的 aa 变量和 bb 变量 alert(x.aa + " 我成功啦 " + x.bb); } $.windowbox = aa; $.windowbox({ aa: "哈哈", bb: "啦啦" }); //方法定义 $.windowbox = { //定义一个方法aa aa: function(){ alert("aa"); }, //定义一个方

Lua 自定义函数string.split

function string.split(str, delimiter)    if str==nil or str=='' or delimiter==nil then        return nil    end        local result = {}    for match in (str..delimiter):gmatch("(.-)"..delimiter) do        table.insert(result, match)    end    r

在ASP.NET中创建自定义配置节(翻译)

2017年,共享经济持续成为大众关注的焦点,从共享单车.共享雨伞.共享充电宝,到共享电动车.共享汽车.共享床位,甚至连女友都拿来共享了.戴上"共享"高帽的创业项目一茬接一茬地冒出来,正如收割的韭菜,最开始两茬是最嫩的,接下来生长出来的则会让人觉得食之无味又弃之可惜.对于投资人如此,对于用户们来说有何尝不是呢? 让我们盘点下近一年出现过的"共享"明星们,对于它们,死亡还是生存?这是个问题. 据统计,2016年中国的共享经济市场规模接近4万亿元:2017年,共享系宣告进

sqlserver创建删除自定义函数

use Test go if exists( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'gettime') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))-- 判断是否存在该自定义函数 drop function gettime -- 删除该自定义函数 go create function gettime(@t datetime) ---- 创建自定义函数带参数 returns