Jmeter二次开发——自定义函数

这个是特别需要注意点,以.functions结尾,正常创建包即可。

二次开发时,新建的类,需要继承AbstractFunction,这个也是需要注意的。至于为什么需要继承AbstractFunction,看源码就能明白,源码如下所示:

public abstract class AbstractFunction implements Function { 

    public AbstractFunction() { 

    } 

    public abstract String execute(SampleResult var1, Sampler var2) throws InvalidVariableException;

    public String execute() throws InvalidVariableException {

        JMeterContext context = JMeterContextService.getContext();

        SampleResult previousResult = context.getPreviousResult();

        Sampler currentSampler = context.getCurrentSampler();

        return this.execute(previousResult, currentSampler);

    }

    public abstract void setParameters(Collection<CompoundVariable> var1) throws InvalidVariableException;

    public abstract String getReferenceKey();

    protected JMeterVariables getVariables() {

        return JMeterContextService.getContext().getVariables();

    }

    protected void checkParameterCount(Collection<CompoundVariable> parameters, int min, int max) throws InvalidVariableException {

        int num = parameters.size();

        if (num > max || num < min) {

            throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + (min == max ? ". Expected: " + min + "." : ". Expected: >= " + min + " and <= " + max));

        }

    }

    protected void checkParameterCount(Collection<CompoundVariable> parameters, int count) throws InvalidVariableException {

        int num = parameters.size();

        if (num != count) {

            throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + ". Expected: " + count + ".");

        }

    }

    protected void checkMinParameterCount(Collection<CompoundVariable> parameters, int minimum) throws InvalidVariableException {

        int num = parameters.size();

        if (num < minimum) {

            throw new InvalidVariableException(this.getReferenceKey() + " called with wrong number of parameters. Actual: " + num + ". Expected at least: " + minimum + ".");

        }

    }

    protected final void addVariableValue(String value, CompoundVariable[] values, int index) {

        if (values.length > index) {

            String variableName = values[index].execute().trim();

            if (StringUtils.isNotEmpty(variableName)) {

                JMeterVariables vars = this.getVariables();

                if (vars != null) {

                    vars.put(variableName, value);

                }

            }

        }

    }

获取界面所要显示的参数说明

函数的主体业务

获取函数的名称

设置参数,接收用户传递的参数

检测参数数量是否准确

名称自定义,如下所示:

private static final String key = "__XXX";

这里需要注意的是:函数开头是以2个下划线开头。

名称定义好了,那如何获取呢?就用我们刚才说的方法获取即可,如下所示:

@Override

public String getReferenceKey() {

    return key;

}

在Jmeter的函数助手中,对应函数都有对应的参数说明,如下所示:

那如何配置能实现呢?代码如下:

private final static List<String> args = new LinkedList<String>();

static{

      args.add("界面参数");

}

如果有多个参数怎么办?多个参数,多个args.add即可

获取参数名称,同样用刚才介绍的方法获取即可,如下所示:

@Override

public List<String> getArgumentDesc() {

    return args;

}

    @Override

    public void setParameters(Collection<CompoundVariable> args0) throws InvalidVariableException {

      //检测用户调用函数时,检查参数个数,个数不对则报错

      checkParameterCount(args0,3);

      Object[] params = args0.toArray();

      //转换只为string

      telNum = ((CompoundVariable)params[0]).execute();

      start = ((CompoundVariable)params[1]).execute();

      end = ((CompoundVariable)params[2]).execute();

  }

获取参数值中,可以检测函数的入参个数是否准确,不准确则会报错,报错信息如下所示:

介绍到这,就是函数的核心内容了,该函数要实现什么功能,就是在该方法中处理,示例代码如下所示:

    @Override

    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {

        SampleResult sampleResult1 = new SampleResult();

        try {

            sampleResult1.sampleStart();

            int index=getNum(0,telFirst.length-1);

            String telNum = telFirst[index];

            String two = String.valueOf(getNum(1, 888) + 10000).substring(1);

            String three = String.valueOf(getNum(1, 9100) + 10000).substring(1);

            tel = telNum + two + three;

            logger.info("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel);

            if (varName != null) {

                JMeterVariables vars = getVariables();

                final String varTrim = varName.execute().trim();

                if (vars != null && varTrim.length() > 0) {

                    vars.put(varTrim, telNum);

                }

            }

            sampleResult1.setResponseData("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel,"utf-8");

            sampleResult1.setSuccessful(true);

        }catch (Exception e){

            sampleResult.setSuccessful(false);

            e.printStackTrace();

        }finally {

            sampleResult1.sampleEnd();

        }

        return tel;

    }

写到这里,基本完成了,但还是得测试下,功能是否正常,如果先打jar包,丢到Jmeter中,发现有bug的话,来来回回处理,就折腾了,所以还是需要先测试下的。

在test下新建测试类,示例代码如下所示:

import org.junit.Test;

public class Function_Test {

    @Test

    public void phoneTest() throws Exception {

        RandomPhoneJmeterFunctions randomPhone= new RandomPhoneJmeterFunctions();

        String phoneString = randomPhone.execute();

        System.out.println("随机手机号:" + phoneString);

    }

}

测试代码很简单,运行测试类,没有报错并打印出手机号,则说明没有问题。运行后的结果如下所示:

生成jar包就不重复讲了,可以看以前的博文,IDEA的基本操作——导入导出jar包

代码写好后,自然是要在jmeter中验证下功能的,我们将生成的jar包放到jmeter的\lib\ext文件夹下,如果jmeter已启用,则需要重启哦,不然不会生效。

打开jmeter后,使用函数助手,看新开发的函数是否有展示,如下所示:

生成函数变量,操作如下所示:

新建线程组,并添加http请求,验证码生成的手机号是不是随机的,运行后,查看结果树,如下所示:

也可以通过日志查看,开发的时候,加了响应日志,如下所示:

到此,就说明功能没问题了。函数开发按上述步骤就可以完成,遇到不满足测试场景的时候,就可以自己diy一个了。

最后附上完整代码,如下所示:

private static Logger logger = LogManager.getLogger(RandomPhoneJmeterFunctions.class.getName());

    private String tel;

    //定义函数名称

    private static final String KEY = "__RandomPhone";

    //定义函数界面显示的参数名称

    private static final List<String> desc = new LinkedList<String>();

    static{

        desc.add("界面参数");

    }

    private static final String[] telFirst = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153 ".split(",");

    private CompoundVariable varName;

    //业务主逻辑

    @Override

    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {

        SampleResult sampleResult1 = new SampleResult();

        try {

            sampleResult1.sampleStart();

            int index=getNum(0,telFirst.length-1);

            String telNum = telFirst[index];

            String two = String.valueOf(getNum(1, 888) + 10000).substring(1);

            String three = String.valueOf(getNum(1, 9100) + 10000).substring(1);

            tel = telNum + two + three;

            logger.info("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel);

            if (varName != null) {

                JMeterVariables vars = getVariables();

                final String varTrim = varName.execute().trim();

                if (vars != null && varTrim.length() > 0) {

                    vars.put(varTrim, telNum);

                }

            }

            sampleResult1.setResponseData("手机号区段:"+ telNum +" 随机生成的手机号是:" + tel,"utf-8");

            sampleResult1.setSuccessful(true);

        }catch (Exception e){

            sampleResult.setSuccessful(false);

            e.printStackTrace();

        }finally {

            sampleResult1.sampleEnd();

        }

        return tel;

    }

    //获取参数值

    @Override

    public void setParameters(Collection<CompoundVariable> args0) throws InvalidVariableException {

        //检测用户调用函数时,检测参数个数

        checkParameterCount(args0,1);

        Object[] params = args0.toArray();

        if (params.length > 0) {

            varName = (CompoundVariable) params[0];

        } else {

            varName = null;

        }

    }

    //获取函数的名称

    @Override

    public String getReferenceKey() {

        return KEY;

    }

    //获取界面所要显示的参数说明

    @Override

    public List<String> getArgumentDesc() {

        return desc;

    }

    private static int getNum(int start,int end)

    {

        return (int)(Math.random()*(end-1));

    }

USB Microphone https://www.soft-voice.com/

Wooden Speakers  https://www.zeshuiplatform.com/

亚马逊测评 www.yisuping.cn

深圳网站建设www.sz886.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容