测试开发必备技能:JMeter 二次开发函数

一、简介

1、概述

  • Apache JMeter 是 Apache 基于 Java 开发的开源压力测试工具

  • 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,像接口测试

  • 但,随着 IT 行业的快速发展,不同企业或组织需求更加丰富,JMeter 默认的功能往往不能满足所有的需求,在一些企业里,会对这款工具进行二次开发

2、使用前准备

  • JDK:Java 开发工具包,是所有 Java 开发或项目运行的基础

  • IntelliJ IDEA:一个进行 Java 项目开发的集成开发环境,也可以使用 Eclipse

如果你想学习测试开发,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的测试开发教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

阿里巴巴P8级Python测试开发大佬,手把手教你如何独立搭建测试平台开发实战!学会这个根本不担心找不到高薪工作_哔哩哔哩_bilibili阿里巴巴P8级Python测试开发大佬,手把手教你如何独立搭建测试平台开发实战!学会这个根本不担心找不到高薪工作共计12条视频,包括:1. 为么什‬要pytest高插阶‬件定开制‬发、2. 如何搞定pytest插的件‬开发线上‬与发布、3. pytest框高架‬阶用之法‬插件制机‬及定制思路等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1Lk4y1J7yq/?spm_id_from=333.337.search-card.all.click&vd_source=8b9b7a6bd9e1d50c8c5643945488eade

二、函数开发

1、概述

JMeter 自带函数库中,提供了丰富的函数,并被广泛使用,如__Random、__UUID 等

可以通过菜单工具-> 函数助手对话框进行测试,如下图

图片

 但,不同接口测试、性能测试项目或场景中,有着不同的特性,JMeter 自带的函数并不完全满足业务需要。

基于 JMeter 的自定义函数开发,就能满足各类特性业务的需求,在实际的测试中有着非常重要的应用

三、自定义函数

1、核心 API

自定义函数必须继承 AbstractFunction 类,并重写父类的 4 个方法

  • execute,函数执行逻辑,必需,自定义函数的核心逻辑,并返回经过处理后的内

  • getReferenceKey,函数名称,必需,返回一个字符串,表示在 JMeter 中使用自定义函数的函数名,一般以双下划线开头,如__Operate、__IDNumber

  • setParameters,设置函数接收参数值,如果自定义函数有参数,用于接收调用时传递过来的参数,注意使用时,字符串参数不要加双引号

  • getArgumentDesc,函数参数描述,如果自定义函数有参数,用于返回函数参数说明

四、开发步骤

  • 创建 Maven 项目:使用 IDEA 创建一个 Maven 项目

  • 添加依赖:在项目的 pom.xml 中依赖 ApacheJMeter_java、ApacheJMeter_core,注意与使用的 JMeter 版本保持一致,依赖见附件

  • 自定义函数:
    添加自定义函数,继承 AbstractFunction 类,并覆写其 4 个方法
    execute 方法:添加插件逻辑
    getReferenceKey 方法:返回自定义名称函数,用于在 JMeter 中调用
    setParameters 方法:获取传递的参数
    getArgumentDesc:返回参数描述
    注意,自定义函数必须在*.functions 包下

  • 打包:使用 Maven 工具将插件打包成。jar 文件,在项目下的 target 目录中

  • 发布:将打包的。jar 文件拷贝到 JMeter 安装目录的 lib/ext 目录中

  • 重启 JMeter:重新启动 JMeter,此时就可以 JMeter 中使用。jar 包中自定义的函数

五、示例一:开发一个简单的运算函数

  • 函数名:__Operate

  • 参数:分别为运算符、操作数 1、操作数 2

  • 代码:

package com.lemon.demo.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.apache.jmeter.util.JMeterUtils;import java.util.Collection;import java.util.LinkedList;import java.util.List;/** * @Project: jmeter-functional * @Site: http://www.lemonban.com * @Forum: http://testingpai.com * @Copyright: ©2022 版权所有 湖南省零檬信息技术有限公司 * @Author: sanbao * @Create: 2022-04-11 17:52 * @Desc:算术运算函数 **/public class Operate extends AbstractFunction {    //操作符    private String operate;    //操作数1    private Double first;    //操作数2    private Double second;    /**     * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容     * @param previousResult     * @param currentSampler     * @return     * @throws InvalidVariableException     */    @Override    public String execute(SampleResult previousResult, Sampler currentSampler) {        Double result = 0d;        //算术运算        if ("+".equals(this.operate)) {            result = this.first + this.second;        }else if ("-".equals(this.operate)) {            result = this.first - this.second;        }else if ("*".equals(this.operate)) {            result = this.first * this.second;        }else if ("/".equals(this.operate)) {            result = this.first / this.second;        }        return result.toString();    }    /**     * 设置函数接收参数值,接收JMeter界面用户传递过来的参数     * @param parameters     * @throws InvalidVariableException     */    @Override    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {        //检查参数个数        checkParameterCount(parameters,3,3);        //获取参数        Object[] params = parameters.toArray();        //获取运算符        CompoundVariable cvOperate = (CompoundVariable) params[0];        this.operate = cvOperate.execute();        //获取操作数1        CompoundVariable cvFirst = (CompoundVariable) params[1];        this.first = Double.parseDouble(cvFirst.execute());        //获取操作数2        CompoundVariable cvSecond = (CompoundVariable) params[2];        this.second = Double.parseDouble(cvSecond.execute());    }    /**     * 函数名称     * @return     */    @Override    public String getReferenceKey() {        return "__Operate";    }    /**     * 函数参数描述,JMeter界面显示的参数说明     * @return     */    @Override    public List<String> getArgumentDesc() {        List<String> desc = new LinkedList<String>();        desc.add("运算符");        desc.add("操作数1");        desc.add("操作数2");        return desc;    }}

六、示例二:动态生成身份证号码函数

需求:需要一个根据区域动态生成合格的身份证号码的公共函数
函数名:__IDNumber(区域名称),如__IDNumber(长沙市),将返回一个长沙的随机身份证号码
参数:区域
代码:

package com.lemon.demo.jmeter.functions;import com.lemon.demo.util.IdNumberGenerateUtil;import lombok.extern.slf4j.Slf4j;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 java.util.ArrayList;import java.util.Collection;import java.util.LinkedList;import java.util.List;/** * @Project: jmeter-plugin * @Site: http://www.lemonban.com * @Forum: http://testingpai.com * @Copyright: ©2022 版权所有 湖南省零檬信息技术有限公司 * @Author: sanbao * @Create: 2022-04-06 16:35 * @Desc:身份证号生成函数 **/@Slf4jpublic class IDNumber extends AbstractFunction {    //参数    private String area;    /**     * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容     * @param sampleResult     * @param sampler     * @return     * @throws InvalidVariableException     */    public String execute(SampleResult sampleResult, Sampler sampler) {        //调用身份证生成逻辑        String idNumber = IdNumberGenerateUtil.generate(area);        return idNumber;    }    /**     * 设置函数接收参数值,接收JMeter界面用户传递过来的参数     * @param parameters     * @throws InvalidVariableException     */    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {        //检查参数个数        checkParameterCount(parameters,0,1);        //获取参数        Object[] params = parameters.toArray();        //获取区域        if(params.length>0) {            CompoundVariable cvArea = (CompoundVariable) params[0];            this.area = cvArea.execute();        }    }    /**     * 函数名称,JMeter界面函数的名称     * @return     */    public String getReferenceKey() {        return "__IDNumber";    }    /**     * 函数参数描述,JMeter界面显示的参数说明     * @return     */    public List<String> getArgumentDesc() {        List<String> desc = new ArrayList<String>();        desc.add("Area");        return desc;    }}

七、JMeter 二次开发方向

  • 函数开发,丰富 JMeter 通用的函数库,加速用例设计中的通用功能开发,如加密/解密、签名生成、随机生成身份证号码等

  • 插件开发,丰富 JMeter 的测试应用场景,有效提升软件产品测试效能,一般主要做取样器开发,如接口自由协议、Java 服务请求等

  • 基于执行引擎开发,有效解决单独开发的测试平台或工具中,底层执行引擎开发相对复杂、周期长的问题,利用 JMeter 执行引擎的 API 进行基础的调用、监听、提取等操作,加速底层执行引擎开发效率;同时,又能弥补 JMeter 本身做为一个工具的一些缺点,如界面相对复杂、报表少且图形化效果差、不能对测试过程进行审计管理等

  • 完全基于 JMeter 源码开发,JMeter 本身产品结构、执行流程相对稳定,并且代码量大,逻辑也相对复杂,直接对源码进行二次开发投入时间长,收益低,一般不这么做;但参考其代码有利于插件开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值