Jmeter工具二次开发

一、JMeter 二次开发方向

1、函数开发,主要为JMeter 函数库

2、插件开发,一般主要做取样器开发

3、基于执行引擎开发,有效解决单独开发的测试平台或工具中,底层执行引擎开发相对复杂、周期长的问题,利用 JMeter 执行引擎的 API 进行基础的调用、监听、提取等操作,加速底层执行引擎开发效率。

二、环境准备

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

IntelliJ IDEA: Java 项目开发的集成开发工具,也可以用 Eclipse。

JMeter:性能测试工具。

三、Jmeter函数开发

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

可以通过菜单工具-> 函数助手对话框进行测试使用。

但是JMeter 自带的函数并一定能满足所有业务需要,因此需要基于 JMeter 进行二次开发新还是。

3.1、自定义函数基础

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

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

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

(3)getReferenceKey,函数名,必需,返回一个字符串,表示在 JMeter 中自定义函数的函数名,一般以双下划线开头,如__Operate

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

在这里插入图片描述

编码格式如下

package com.functions;   #com.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 java.util.Collection;
import java.util.List;


#test为新见的类名,继承AbstractFunction的方法

public class test extends AbstractFunction {

 
    @Override
    public List<String> getArgumentDesc() {
        //自定义函数参数列表
        return null;
    }
	
	@Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        //用来接收、处理用户调用函数时所输入的参数值
    }
	
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        //函数的执行主体,函数逻辑处理,最终的处理返回结果
        return null;
    }
 
    @Override
    public String getReferenceKey() {
        //函数的名称,及引用时调用的函数名
        return null;
    }

}

3.2、IDEA 新建project

3.3、添加依赖包

两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里创建一个lib目录,把jar粘贴到里面,然后再按下图顺序添加依赖

ApacheJMeter_components.jar

ApacheJMeter_core.jar

在这里插入图片描述

3.4、在src文件下新建一个包package,创建的包命名以functions结尾,如命名为“org.apache.jmeter.functions”,该创建的类继承AbstractFunction类的方法

3.5、在创建的package “org.apache.jmeter.functions”下面新增class 如命名为“IsJoinFunction”,并继承jmeter自带的AbstractFunction。

在这里插入图片描述

3.6、按照模版格式:

a.添加导入模块

b.让新增的类继承AbstractFunction

c.添加4种方法,并且实现具体的业务逻辑

3.7、代码编写完成之后,编译、导出jar包

a.配置Artifacts

在这里插入图片描述

在这里插入图片描述

b.编译Artifacts,生成jar包

上一步只是设置了生成jar包的环境,接下来还需要编译代码,生成jar包

生成的jar默认放在工程目录的out/artifacts下,可直接复制~

另:若更新了代码,也只需直接“编译Artifacts”就行了,但若更新jar包,则需要重新配置环境!!

在这里插入图片描述

3.8、把jar包放在JMeter的lib\ext目录下,然后重启JMeter即OK。

四、自定义函数demo

功能:通过输入3个数字,拼接为一个三位数

package org.apache.jmeter.functions;


import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class IsJoinFunction extends AbstractFunction {
    public String numberOne = "";
    public String numbertwo = "";
    public String numberThree = "";

    //定义函数参数列表
    @Override
    public List<String> getArgumentDesc() {
        List<String> parms = new LinkedList<String>();
        parms.add("请输入数字(示例:1)");
        parms.add("请输入数字(示例:2)");
        parms.add("请输入数字(示例:3)");

        return parms;
    }

    //用来接收、处理用户调用函数时所传入的参数值
    @Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        //collection为getArgumentDesc函数接收到的用户输入的值
        //检查用户输入的参数值是否等于3个
        checkParameterCount(collection,3);
        //把Collection<CompoundVariable>转换为数组,固定写法
        Object[] parmsData = collection.toArray();

        //把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
        numberOne = ((CompoundVariable)parmsData[0]).execute();
        numbertwo = ((CompoundVariable)parmsData[1]).execute();
        numberThree = ((CompoundVariable)parmsData[2]).execute();
    }

    //函数的执行主体,执行具体的业务逻辑、功能
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        String isJoin = numberOne + numbertwo + numberThree;
        return isJoin; //把执行结构返回给用户
    }

    //要调用的函数名称
    @Override
    public String getReferenceKey() {
        String key = "__isJoin";
        return key ;
    }
}

继承AbstractFunction 类的四个方法分别如下:

4.1、getArgumentDesc函数:参数描述

    public List<String> getArgumentDesc() {
        List<String> parms = new LinkedList<String>();
        parms.add("请输入数字(示例:1)");
        parms.add("请输入数字(示例:2)");
        parms.add("请输入数字(示例:3)");

        return parms;
    }

在这里插入图片描述

4.2、setParameters:把用户输入的参数值进行处理

 public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        //collection为getArgumentDesc函数接收到的用户输入的值
        //检查用户输入的参数值是否等于3个
        checkParameterCount(collection,3);
        //把Collection<CompoundVariable>转换为数组,固定写法
        Object[] parmsData = collection.toArray();

        //把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
        numberOne = ((CompoundVariable)parmsData[0]).execute();
        numbertwo = ((CompoundVariable)parmsData[1]).execute();
        numberThree = ((CompoundVariable)parmsData[2]).execute();
    }

在这里插入图片描述

4.3、execute方法:具体的逻辑实现,结果通过return返回

public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        String isJoin = numberOne + numbertwo + numberThree;
        return isJoin; //把执行结果返回给用户
    }

在这里插入图片描述

4.4、getReferenceKey函数:比较简单,就是定义函数的名称,主要注意的是需要是两个下划线开头,这是JMmter规范要求的。

public String getReferenceKey() {
        String key = "__isJoin";
        return key ;
    }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis为什么要使用SDS作为基本数据结构

Redis为什么要使用SDS作为基本数据结构 Redis SDS与C语言中字符串的对比二进制安全兼容部分C字符串函数 Redis SDS与C语言中字符串的对比 SDS中保存了字符串的长度属性&#xff0c;我们在获取字符串长度是的时间复杂度为O(1)&#xff0c;而C中字符串则需要对字符串进行遍历时间…

linux 不同用户不同jdk

0、 解压一个新版本的jdk 1、 检查root用户下的环境变量&#xff0c;是否配置了JAVA_HOME&#xff0c;基于这个变量再配置的PATH变量是实现切换的前提。 2、 创建新用户 adduser jdk11 passwd jfjfjfjfjfjfj123 3、 编辑改用下的 .bashrc 文件 执行命令进行编辑&#xff0…

倍福CX9020 Windows CE6.0安装中文字库方法(附字库文件)

应用背景介绍 倍福的EPC产品有些是附带Windows CE系统的&#xff0c;例如CX9020&#xff0c;而且多数系统都是英文的&#xff0c;而且没有附带中文的字库&#xff0c;如果想要在PLC HMI中使用中文进行显示就无法实现&#xff0c;经常有工程师在电脑上编好程序和界面以后测试没…

使用Navicat导出ER图详细教程

文章目录 打开Navicat&#xff0c;点击模型点击新建模型选择物理模型点击文件&#xff0c;选择从数据库导入选择要导入的数据库点击文件&#xff0c;选择导出的格式成品 打开Navicat&#xff0c;点击模型 点击新建模型 选择物理模型 点击文件&#xff0c;选择从数据库导入 选择…

C++动态库

C动态库 动态库文件&#xff08;Dynamic Link Library&#xff0c;DLL&#xff09;是程序在运行时所需要调用的库。静态库文件是程序在编译时所需要调用的库。 1 环境介绍 VS版本&#xff1a;VS2017 编程语言&#xff1a;C 2 功能介绍 使用VS2017项目模板创建C动态库生成…

Java程序设计实验5 | Java API应用

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 &#xff08;解…

CSS3 2D、3D转换

一、CSS3 2D转换&#xff1a; CSS3转换可以对元素进行移动、缩放、转动、拉长或拉伸。 2D变换的方法&#xff1a;translate()、rolate()、scale()、skew()、matrix()。 <style> div { width:200px; height:100px; background-color:red; /* Rotate div */ tran…

混淆矩阵和相应参数详解

如果一个模型在能够尽量捕获少数类的情况下&#xff0c;还能够尽量对多数类判断正确&#xff0c;则这个模型就非常优秀了。为了评估这样的能力&#xff0c;我们将引入新的模型评估指标&#xff1a;混淆矩阵和ROC曲线。 上面是混淆矩阵。接下来我们结合图像解释一下准确率&#…

AMESim 2021安装教程

主要是AMESim的安装 写在前面&#xff0c;由于项目需要&#xff0c;需要自学AMESim&#xff0c;因此需要安装这个软件&#xff0c;目前仅仅安装使用&#xff0c;还不涉及到与MATLAB的联合仿真&#xff0c;老板说用 RT LAB半实物仿真平台&#xff0c;但是简单搜了一下&#xff0…

阻塞队列和定时器的使用

阻塞队列 谈到队列,大家就能想到队列的先进先出原则,但有些特殊的队列,虽然也是先进先出的,但是带有阻塞功能,我们把这种队列叫做阻塞队列. ★如果队列为空,执行出队操作就会阻塞,阻塞到另外一个线程往队列里添加元素(队列不为空)为止. ★如果队列满了,执行入队操作时,也会阻…

“GUI图形化界面的魅力、SSH协议的安全通信与IDEA集成Git的高效开发“

文章目录 引言一、GUI图形化界面的实际应用二、SSH协议的安全通信什么是SSH?git/github生成密钥并通过远程github仓库配置 三、IDEA集成Git的快速上手指南总结 引言 在计算机科学领域&#xff0c;图形用户界面&#xff08;GUI&#xff09;是一种以图形方式呈现信息和交互的用…

Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用

Flutter笔记 绘图示例 - 一个简单的&#xff08;Canvas &#xff09;时钟应用 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_2855…

大数据毕业设计选题推荐-污水处理大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【数据结构】Lambda

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; Lambda表达式 1. 背景1.1 语法1.2 函…

【C++优先队列使用】问题总结

说明&#xff1a; 文章内容为关于priority_queue的使用总结&#xff0c;在C中要包含头文件<queue>文章内容为个人的学习整理&#xff0c;如有错误&#xff0c;欢迎指正。 文章目录 1. 优先队列默认是大根堆2. 关于优先队列和sort的比较逻辑2.1 sort的比较逻辑2.2 优先队…

python操作链接数据库和Mysql中的事务在python的处理

python操作数据库 pymysql模块: pip install pymysql作用:可以实现使用python程序链接mysql数据库&#xff0c;且可以直接在python中执行sql语句 添加操作 import pymysql #1.创建链接对象c conn pymysql.Connect(host127.0.0.1,#数据库服务器主机地址port3306, #mysql的端口…

一篇文章让你了解Java中的继承

目录 继承一.什么是继承二.为什么要使用继承三.继承的语法四.继承中有重复怎么办&#xff1f;1.**访问原则** 五.super和this1.**this**2.**super**3.**super注意事项**4.**super和this异同点**六.构造方法的引入1.父类不带参数的构造方法2.父类带有参数的构造方法 七.继承中的…

【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例

【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例 前言一、案例准备二、自动生成随机二叉树工具类&#xff08;TreegenerateUtils&#xff09;三、如何调用随机二叉树工具类&#xff08;TreegenerateUtils&#xff09;&#xff1f; 前言 今天笔者在测试有关二叉树的…

Leetcode-206 反转链表

迭代法&#xff1a;将指针方向依次改变&#xff0c;定义两个指针pre和cur /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, Lis…

Bengio担任一作,联手一众图灵奖得主,预防AI失控,扛起AI监管大旗

图灵奖得主最近都在关心些什么呢&#xff1f;Yoshua Bengio&#xff0c;深度学习的奠基人之一&#xff0c;前几天他担任一作&#xff0c;联合多位大佬&#xff0c;发文探讨了如何在人工智能&#xff08;AI&#xff09;快速发展的时代管控相关风险&#xff0c;共同寻求当下生成式…