Jmeter使用之:怎么编写扩展函数(二)

news2024/11/25 8:09:39

目录

前言:

1、实现function的类的package声明必须包含".functions"

2、需要继承org.apache.jmeter.functions.AbstractFunction,并且实现相应的方法。

第一步:eclipse 导入jmeter目录:apache-jmeter-2.13libext下的 ApacheJMeter_core.jar(怎么导入jar包,不会就百度吧)

第二步:这里编写一个“获取当前时间前后的指定格式日期时间数据”的函数(__TimeConvert),自带的函数(__Time)不能满足要求。具体的编码为:

第三步:把该自定义函数导出为一个jar包(TimeConvertFunction.jar):

第四步:把导出的jar文件放到jmeter的 lib/ext目录,重启Jmeter,在函数助手框可以看到我们新加的自定义函数:__TimeConvert


前言:

在JMeter中,扩展函数是用于自定义功能和逻辑的强大工具。扩展函数允许你添加自定义的函数,以满足特定的测试需求。通过编写扩展函数,你可以执行复杂的数据处理、动态参数生成、自定义计算等操作。

前面,我已经在文章《Jmeter使用之:怎么编写扩展函数(一)》分享了怎么编写使用外部函数,但使用起来并不方便。我们要怎么像使用内置函数一样使用自定义函数呢?可以通过扩展JMeter函数来实现,在扩展JMeter函数之前主要有两点需要注意:

1、实现function的类的package声明必须包含".functions"

说明:JMeter设计让一些核心的类(非UI相关的,比如ApacheJMeter_core等)可以在非UI的方式下运行的时候能被加载进来,这些类会被优先加载。加载这些类的时候是通过命名规则来实现的。所有实现function的类必需包含".functions.",所以我们自定义实现的类里必须包含".functions",比如 "com.xmeter.customized.functions"。

2、需要继承org.apache.jmeter.functions.AbstractFunction,并且实现相应的方法。

下面来一个扩展函数的编写实例:

第一步:eclipse 导入jmeter目录:apache-jmeter-2.13libext下的 ApacheJMeter_core.jar(怎么导入jar包,不会就百度吧)

第二步:这里编写一个“获取当前时间前后的指定格式日期时间数据”的函数(__TimeConvert),自带的函数(__Time)不能满足要求。具体的编码为:

/**
 * 获取当前日期时间前后的指定格式日期时间数据
 */
package com.ste.ruink.time.functions;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
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;
/**
 * @author Ruink
 */
public class TimeConvertFunction extends AbstractFunction {
    //自定义function的描述
    private static final List desc = new LinkedList();
    static {
        desc.add("获取当前时间往前(后)多少秒的时间,使用格式${__TimeConvert(flag,sec,format)},flag为前后标识符(pre-前,later-后,其他值时默认为当前),"
                + "seconds为间隔时间多少秒,format为日期格式,默认为yyyy-MM-dd HH:mm:ss");
    }
    //确定function名称
    private static final String KEY = "__TimeConvert";
    //最多传入的参数个数
    private static final int MAX_PARA_COUNT = 3;
    //最少传入的参数个数
    private static final int MIN_PARA_COUNT = 3;
    //用于存入传入参数的值
    private Object[] values;
    /* 
     * 告诉JMeter关于你实现的function的描述
     */
    @Override
    public List getArgumentDesc() {
        return desc;
    }

    /* 
     *JMeter会将上次运行的SampleResult和当前的Sampler作为参数传入到该方法里,
     *返回值就是在运行该function后得到的值,以String类型返回。该方法如果操作了非线程安全的对象(比如文件),
     *则需要将对该方法进行线程同步保护。
     */
    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
        String flag = ((CompoundVariable) values[0]).execute().trim();
        long sec = new Integer(((CompoundVariable) values[1]).execute().trim());
        String format = ((CompoundVariable) values[2]).execute().trim();
        // 这里就是jmeter中执行函数后的返回结果
        return getTime(flag,sec,format);
    }

    /* 
     * 这个就是function的名字。JMeter的命名规则是在方法名前面加入双下划线"__"。比如"__GetEven",
     * function的名字跟实现该类的类名应该一致,而且该名字应该以static final的方式在实现类中定义好,
     * 避免在运行的时候更改它。
     */
    @Override
    public String getReferenceKey() {
        // 返回函数名称
        return KEY;
    }

    /* 
     * 这个方法在用于传递用户在执行过程当中传入的实际参数值。该方法在function没有参数情况下也会被调用。
     * 一般该方法传入的参数会被保存在类内全局变量里,并被后面调用的execute方法中使用到。
     */
    @Override
    public void setParameters(Collection args) throws InvalidVariableException {
    // 检查并获取传入变量值
        checkParameterCount(args, MIN_PARA_COUNT, MAX_PARA_COUNT); //检查传入的参数的个数是否正确
        values = args.toArray(); //将值存入类变量values中
    }
    
    /* 
     * 自定义函数。获取时间,当前时间往前(后)多少秒,flag为前后标识符(pre-前,later-后,其他值时默认为当前),
     * seconds为间隔时间多少秒,format为日期格式,默认为yyyy-MM-dd HH:mm:ss
     */  
    public static String getTime(String flag,long sec,String format){
        //获取当前时间戳
        long timestamp = System.currentTimeMillis();
        long finaltime;
        if(flag.equals("pre")){
            finaltime = timestamp - sec*1000;
        }else if(flag.equals("later")){
            finaltime = timestamp + sec*1000;
        }else{
            finaltime = timestamp;
        }
        //判断format是否有值
        if(format.equals(null)||format.equals("")){
            format="yyyy-MM-dd HH:mm:ss";
        }
        String timestr = String.valueOf(finaltime);
        String getdate = stampToDate(timestr,format);
        return getdate;
    }
    
    /* 
     * 自定义函数。将时间戳转换为时间
     */
    public static String stampToDate(String s,String format){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }
}


第三步:把该自定义函数导出为一个jar包(TimeConvertFunction.jar):

第四步:把导出的jar文件放到jmeter的 lib/ext目录,重启Jmeter,在函数助手框可以看到我们新加的自定义函数:__TimeConvert

1)最后,使用该函数,如在一个GET请求中使用:

2)执行并查看结果

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

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

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

相关文章

【SLAM学习】FAST-LIO配置

本文主要记录如何配置FAST-LIO Eigen库 Eigen库安装: sudo apt install libeigen3-dev 查看Eigen版本: $ pkg-config --modversion eigen3 PCL库 PCL库安装: sudo apt install libpcl-dev 也可以指定版本安装: sudo apt …

AVS3:角度加权预测AWP

在一般的视频编码标准中帧间预测有两种方式:单向预测和双向预测。一般是将图像划分为矩形(正方形)块然后到参考帧中去搜索和它最接近的块作为预测块,单向预测只有一个预测块,而双向搜索会有2个预测块,将2个…

基于Java医院住院综合服务管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

前端Vue自定义精美悬浮菜单按钮fab button 可设置按钮背景颜色 菜单按钮展开条目

前端Vue自定义精美悬浮菜单按钮fab button 可设置按钮背景颜色 菜单按钮展开条目,下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13321 效果图如下: # cc-suspensionMenu #### 使用方法 使用方法 <!-- scrollShow:是否显示滑动…

【Spark实战】Windows环境下编译Spark2 Linux上部署Spark On Yarn

Windows环境下编译Spark2 环境准备 git-2.14.1maven-3.9.2jdk-1.8scala-2.11.8zinc-0.3.15 主下载地址spark-2.3.4 github官方地址 编译准备 maven远程仓库使用的是阿里云的 解压源码包spark-2.3.4.zip,修改根模块的pom文件。主要目的是为了变更hadoop的版本号&#xff0c;…

飞控学习笔记-飞行器数学模型(2)

十字型模型 旋翼动力学 动力模型 电机模型 模型仿真 升力模型 力矩模型 反扭力 仿真

如何理解字符串不可变

字符串的不可变性: String类内部定义了 final char[ ] value ;数组用于存储字符串数据。 这里的value数组是通过final关键字修饰的,也就说字符串其实是一个常量,一旦在内存中申请出一个空间并且为其赋值之后这个空间中的字符串值就不可以修改了,将这个性质我们称之为不可变性。…

阿里云服务拆分部署

最近在工作中遇到需要将现网运行的服务拆分出一套&#xff0c;放置于本地机房&#xff0c;拆分服务运行有两种方案&#xff1a; 第一种是本地部署一个独立spring应用&#xff0c;业务上的要求是尽量隔离 第二种是采用阿里集群部署 采用第二种方案目前看是隔离度最高的

4.44ue4:相机抖动

1.创建相机抖动类 右键内容面板&#xff0c;点击创建蓝图类&#xff0c;搜索shake&#xff08;camera shake&#xff09; 2.使用相机抖动&#xff1a; 节点&#xff1a;play world .. api解释&#xff1a; epicenter&#xff1a;震源 inner Radius&#xff1a;内圈范围&a…

Git gui教程---第一篇 下载和安装

下载和安装 下载网址安装 下载网址 链接: 下载网址 有两种安装方式&#xff1a; 是用EXE的文件安装&#xff0c;我们用这个是便携版&#xff0c;好像是压缩包形式&#xff0c;没用过。 这是下载后的安装包文件&#xff0c;我的电脑是64位&#xff0c;所以下载的是64位。 安…

Unity2D横版游戏(深海潜水艇)

找到个挺有意思的小游戏Unity2D横版游戏&#xff08;深海潜水艇&#xff09; 这个也是曾经有段时间抖、音很火的一个小游戏。 鼠标左键点击让小艇上升 因为是unity开发的小游戏&#xff0c;可发布多个平台&#xff0c;有兴趣的拿去玩吧。 代码也是挺简单的 using UnityEngin…

【经典题目分析】数组分割问题

文章目录 698. 划分为k个相等的子集416. 分割等和数组 698. 划分为k个相等的子集 把一个数组&#xff0c;拆分成K个大小一样的子数组。方法可以是状态枚举&#xff0c;或者dfs class Solution { public:bool canPartitionKSubsets(vector<int>& nums, int k) {// 从…

C/C++图形库EasyX保姆级使用教程(三) 图形颜色的填充及相关应用

C/C图形库EasyX保姆级使用教程系列文章目录 第一章 Microsoft Visual Studio 2022和EasyX的下载及安装使用 第二章 图形化窗口设置以及简单图形的绘制 第三章 图形颜色的填充及相关应用 文章目录 C/C图形库EasyX保姆级使用教程系列文章目录前言一、如何填充颜色1.确定颜色1.1 …

TypeScript - 函数(下)

目录 1、在函数中声明this 2、其他需要知道的类型 2.1 void 2.2 object 2.3 unknow 2.4 never 2.5 Function 3、其余参数&#xff08;rest&#xff09;和参数 4、参数解构 5、函数的可分配性 1、在函数中声明this TypeScript 将通过代码流分析推断函数中应该是什么&…

jenkins_svn_maven持续集成

详解Jenkins &#xff0c;svn &#xff0c;maven 项目持续集成 第一步&#xff1a; 由于刚刚接触jenkins 并不知道他是个什么东西&#xff0c;首先百度一下&#xff0c;然后进入官网&#xff0c;下载安装包。 第二步 windows 安装&#xff1a; 下载完了&#xff0c;打开里面…

Spring Boot 中的 SAGA 事务

Spring Boot 中的 SAGA 事务 在分布式系统中&#xff0c;保证数据一致性是非常重要的问题。传统的 ACID 事务模型虽然能够保证单个数据库的数据一致性&#xff0c;但是在分布式系统中却很难实现。因此&#xff0c;近年来出现了一些新的事务模型&#xff0c;其中 SAGA 就是一种…

上海清晖管理咨询有限公司创始人傅永康受邀为第十二届中国PMO大会演讲嘉宾

上海清晖管理咨询有限公司创始人傅永康先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;PMBOK第七版对PMO的影响。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 项目管理协会&#xff08;P…

软件设计模式与体系结构-设计模式-结构型软件设计模式-桥接模式

四、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种软件设计模式&#xff0c;它用于将抽象部分与其具体实现部分解耦&#xff0c;使它们可以独立地变化。桥接模式的核心思想是将一个系统分为多个维度&#xff0c;并通过桥接连接这些维度&#xff0c;从而实现…

合理组织安卓活动

本文所有代码均存放于https://github.com/MADMAX110/Starbuzz 开始构建一个应用时&#xff0c;你会考虑这个应用要包含什么&#xff0c;会有各种各样的很多想法&#xff0c;如何组织这些想法来建立一个直观、清晰的应用。 一、活动归类 要组织各种各样的活动&#xff0c;有一种…

IMX6ULL移植篇-uboot网络配置工作

一. uboot 网络IP配置 1. 硬件连接 在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接&#xff0c; I.MX6U-ALPHA 开发板有两个网口&#xff1a; ENET1 和 ENET2 &#xff0c;一定要连接 ENET2 &#xff0c;ENET2 接口如下&#xff1a…