测试开发工具开发 -JMeter 函数二次开发

在JMeter中开发自定义函数是一个常见的需求,允许我们扩展JMeter的功能以适应特定的测试需求。自定义函数可以用来处理数据,生成输出,或者执行特定的运算。通过JMeter函数二次开发可以帮我们解决实际测试过程中造数难的问题

 

用过JMeter的同学对JMeter内置的函数助手不陌生,使用函数助手可以帮我们非常高效生成一些数据满足我们的接口测试的要求。比如我们想要生成随机的手机号码,可以使用RandomString函数,具体做法:设置手机号码前缀区段(比如189、138、177)这些,然后再使用RandomString函数帮我们生成后8位的随机数,然后拼接成手机号码:

图片

但是有时候测试需求中的手机号码区段并不是固定的,如果想要手机号码区段也能够满足随机的要求(并且符合运营商开放的区段),又或者是生成合法的随机身份证号码,这类需求该如何实现呢?JMeter的内置函数满足不了,此时我们可以对JMeter函数进行二次开发。

JMeter二次开发实现逻辑

自定义函数必须继承于JMeter的AbstractFunction类

并需要重写该类的4个方法:

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

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

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

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

JMeter二次开发具体步骤

1、创建Java Maven项目

选择从maven-archetype-quickstart模板创建

在pom.xml中添加依赖ApacheJMeter_java、ApacheJMeter_core,注意与使用的JMeter版本保持一致

<!--引入JMeter依赖--><dependency>    <groupId>org.apache.jmeter</groupId>    <artifactId>ApacheJMeter_java</artifactId>    <version>5.4.3</version></dependency><dependency>    <groupId>org.apache.jmeter</groupId>    <artifactId>ApacheJMeter_core</artifactId>    <version>5.4.3</version></dependency>
2、自定义函数类继承AbstractFunction

创建functions子包,在已有包中,添加一个名为functions子包

添加自定义函数, 在functions子包下,添加自定义函数类,并继承AbstractFunction类,并实现该类的4个抽象方法:

  • 在execute方法中添加插件逻辑

  • 在getReferenceKey方法中返回自定义名称函数

  • 如果函数有参数,在setParameters方法获取传递过来的参数

  • 如果函数有参数,在getArgumentDesc中描述接收的参数

public 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("城市名");        return desc;    }}
3、将代码打包成jar文件

方式一:项目没有第三方依赖,直接使用右侧Maven菜单的Lifecyle->package打包,直接使用jar包

图片

方式二:项目有第三方依赖,需要按照如下步骤操作:

  • 在pom.xml文件的build->plugins配置节下添加如下内容

<build>    <plugins>        <!--将依赖打包到jar包-->        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-assembly-plugin</artifactId>            <version>2.5.5</version>            <configuration>                <descriptorRefs>                    <descriptorRef>jar-with-dependencies</descriptorRef>                </descriptorRefs>            </configuration>        </plugin>        <plugin>            <artifactId>maven-compiler-plugin</artifactId>            <version>3.8.1</version>            <configuration>                <source>1.8</source>                <target>1.8</target>                <encoding>UTF-8</encoding>            </configuration>        </plugin>    </plugins></build>

  • 使用右侧Maven菜单的Plugins->assembly->assemble:assembly打包,会生成一个带-jar-with-dependencies后缀的jar包,直接使用此xxxx--jar-with-dependencies.jar包

图片

4、将jar文件部署到JMeter中

将上一步的xxx.jar文件拷贝到JMeter安装目录的lib/ext目录中

图片

重启JMeter,打开函数助手即可使用自定义的函数:

图片

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类&#xff0c;它继承了AbstractOwnableSynchronizer&#xff0c;实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

信号与线性系统 1绪论

信号 信号是随时间变化的某种物理量&#xff08;狭义&#xff09; 本课程中&#xff0c;信号用 函数&#xff08;而且是一维函数&#xff09;表示 连续 离散 信号分类 确定与随机&#xff1a;是否能以确定的时间函数表示离散与连续&#xff1a;是用全体实数还是特定整数来描述…

普乐蛙景区vr体验馆VR游乐场设备身历其境体验

小编给大家推荐一款gao坪效产品【暗黑战车】&#xff0c;一次6人同乘&#xff0c;炫酷外观、强大性能和丰富内容适合各个年龄层客群&#xff0c;紧张刺激的VR体验让玩家沉浸在元宇宙的魅力中&#xff0c;无论是节假日还是平日&#xff0c;景区商场助力门店提高客流量和营收~ ◆…

苹果和OpenAI再续前缘,iOS 18会是颠覆级的吗?|TodayAI

据彭博社最新报道&#xff0c;苹果公司已经与人工智能领域的先锋企业OpenAI重启了对话&#xff0c;双方目前正在讨论一项可能的合作&#xff0c;以将OpenAI的生成式人工智能技术整合到苹果即将推出的iOS 18操作系统中。这一举措表明&#xff0c;苹果正加速其在人工智能技术上的…

Acwing 818. 数组排序

给定一个长度为 n n n的数组 a a a以及两个整数 l l l和 r r r&#xff0c;请你编写一个函数&#xff0c;void sort(int a[], int l, int r)&#xff0c;将 a [ l ] ∼ a [ r ] a[l]∼a[r] a[l]∼a[r]从小到大排序。 输出排好序的数组 a。 输入格式 第一行包含三个整数 n &…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

小米消金持续发力,全面强化金融消费者权益保护措施

近年来&#xff0c;电信网络欺诈手段层出不穷&#xff0c;深度伪造等互联网技术被误用&#xff0c;导致欺诈行为更加隐蔽。重庆小米消费金融有限公司&#xff08;以下简称“小米消金”&#xff09;&#xff0c;作为一家持牌消费金融公司&#xff0c;深知保护消费者财产安全的重…

AI手机,走入小径分岔的花园

博尔赫斯在他的成名作《小径分岔的花园》里&#xff0c;描述了一种奇妙的世界观&#xff1a;一个可能性被选择之后&#xff0c;出现了许多不同的后世&#xff0c;许多不同的时间。 在现实世界中&#xff0c;选择不会如此神奇。但站在岔路口的抉择&#xff0c;也一定会带来结果的…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接&#xff1a; 角色&#xff1a;系统管理员 是否拥有权限&#xf…

实验七 SJK数据库定义与操纵

实验题目 实验七 SJK数据库定义与操纵 实验时间 2023.5.17 实验地点 软件工程基础实验室 实验课时 2 实验目的 ​了解并掌握数据库定义与操纵的知识并能熟练应用 实验要求 ​熟练掌握和使用PL-SQL建立数据库基本表&#xff0c;使用PL/SQL developer操作数据库&a…

C++:现代类型转换

C&#xff1a;现代类型转换 C/C的旧式类型转换C的现代类型转换静态类型转换 static_cast重新解释转换 reinterpret_cast常量类型转换 const_cast动态类型转换 dynamic_cast C/C的旧式类型转换 在C语言中&#xff0c;类型转换被分为显式和隐式&#xff0c;常见的类型转换如下&a…

移动应用开发:Android vs iOS平台的选择与挑战

在移动应用开发领域&#xff0c;选择开发平台是一个关键的决策&#xff0c;通常涉及考虑Android和iOS这两大主流平台。每个平台都有其特定的优势和挑战&#xff0c;开发者需要根据目标市场、预算、功能需求和技术能力来做出选择。 ### Android和iOS的主要差异 1. **市场份额*…

C语言-预处理

一、C语言编译过程 预处理、编译、汇编、链接 1&#xff1a;预编译 将.c 中的头文件展开、宏展开 生成的文件是.i文件 2&#xff1a;编译 将预处理之后的.i 文件生成 .s 汇编文件 3、汇编 将.s汇编文件生成.o 目标文件 4、链接 将.o 文件链接成目标文…

es优化实践(es升级带来的大坑)->问题与痛点->优化过程->原理分析->最佳实践

这里分享一个ES2.X升级到ES5.X带来的天坑问题 结论先行 先上结论(最佳实践) es5以后版本 对于某个字段 1.字段用于terms查询,则字段定义为keyword类型, 如果定义为数值类型(number,long,short等)会有严重的性能问题 ,查询耗时会很长2.字段用于range查询,则字段定义为数值类型…

网络协议安全:SYN Flood原理和防御措施,使用hping3实现SYN Flood

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

【Docker】docker部署lnmp和搭建wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

google chromeDriver 地址

#chrome driver 下载地址 https://getwebdriver.com/chromedriver #chrome brower下载地址 https://googlechromelabs.github.io/chrome-for-testing/ centos 安装的dockerFile的部分命令&#xff1a; #安装browser wget https://dl.google.com/linux/chrome/rpm/stable/x86_…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的&#xff0c;后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…