JMeter定制功能实现

JMeter提供了可在采样器中使用的功能。 在编写复杂的测试计划时,您会感到JMeter缺少某些方法。 您使用Beanshell脚本定义自己的自定义方法。 JMeter调用Beanshell解释器来运行脚本。 只要您不产生高负载(大量线程),此方法就可以正常工作。 但是,一旦JMeter尝试产生高负载,它就会耗尽资源并大大降低速度。 如果改用JMeter自定义函数,则JMeter可以轻松生成高负载。 唯一的问题是弄清楚实现要求以及如何与JMeter集成。 JMeter几乎没有提供任何有关自定义函数实现的文档。 但是在浏览了JMeter源代码和Googling之后,我找到了实现JMeter自定义功能的方法。

定制方法实施

让我们深入了解实现的细节。 有一些必须满足的要求。 这些如下。

  • 函数类包名称必须包含“ .functions”。
  • 函数类必须扩展AbstractFunction并实现execute(),setParameters(),getReferenceKey()和getArgumentDesc()方法
  • 制作jar文件并放入<JMETER_HOME> / lib / ext目录,然后重新启动JMeter

包裹名字

JMeter的设计使其无需GUI(通用用户界面)即可运行。 它加载核心类并执行测试计划。 它为核心类提供了高优先级,并且更喜欢先加载这些类。 为了确保GUI和核心/后端不混合,它根据程序包名称隔离类。 它尝试遵循约定,即函数实现类应存在于应在其中包含“函数”字样的包中,例如com.code4reference.jmeter.functions 。 它在后台查找jmeter.properties文件,并尝试找到以下属性值。

classfinder.functions.contain=.functions.

如您所见,提供的默认值是".functions." 。 您可以将其更改为其他名称,但必须确保自定义函数类包名称中应存在相同的词。 最好保留默认值。 一旦定义了包,就可以编写Function实现类了。

函数实现类

在编写此类时,您必须实现以下方法。

  1. String getReferenceKey():可以从采样器调用的函数的名称。 惯例是在函数名称前加上两个“ __”(下划线),例如__TimeInMillis ,函数名称应与实现此函数的类名称相同。 此函数名称应存储在某个静态的最终String变量中,以便在执行期间不能更改。
  2. List getArgumentDesc():此方法基本上以字符串列表形式返回参数描述。 此描述出现在功能助手中(如下图所示)
  3. setParameters(Collection parameters):此方法由JMeter调用,它传递在函数调用中传递的值。 变量作为CompoundVariable的集合传递。 即使未提供任何参数,也会调用此方法。 在此方法中,可以在execute()方法中设置和访问全局变量。
  4. 字符串execute(SampleResult previousResult,Sampler currentSampler): JMeter传递先前的SampleResult和当前的SampleResult。 此方法返回一个字符串,该字符串将用作函数调用的替换值。 该方法被多个线程调用,因此它必须是线程安全的。 这种方法的奇怪之处在于,在处理完参数之后,必须将结果转换为字符串并返回

JMeter功能助手

源代码

在下面的示例源代码中,我实现了一个名为__TimeInMillis函数。 在使用提供的偏移量调整当前时间后,此方法以毫秒为单位返回时间。 例如,当当前时间为1371413877000时,此$ {__ TimeInMillis(2000)}方法调用将返回1371413879000。

package com.code4reference.jmeter.functions;import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Calendar;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.jorphan.logging.LoggingManager;
import org.apache.log.Logger;public class TimeInMillis extends AbstractFunction {private static final List<String> desc = new LinkedList<String>();private static final String KEY = "__TimeInMillis";private static final int MAX_PARAM_COUNT = 1;private static final int MIN_PARAM_COUNT = 0;private static final Logger log = LoggingManager.getLoggerForClass();private Object[] values;static {desc.add("(Optional)Pass the milliseconds that should be added/subtracted from current time.");}/*** No-arg constructor.*/public TimeInMillis() {super();}/** {@inheritDoc} */@Overridepublic synchronized String execute(SampleResult previousResult, Sampler currentSampler)throws InvalidVariableException {//JMeterVariables vars = getVariables();Calendar cal = Calendar.getInstance();if (values.length == 1 ) { //If user has provided offset value then adjust the time.log.info("Got one paramenter");try {Integer offsetTime =  new Integer(((CompoundVariable) values[0]).execute().trim());cal.add(Calendar.MILLISECOND, offsetTime);} catch (Exception e) { //In case user pass invalid parameter.throw new InvalidVariableException(e);}           }return String.valueOf(cal.getTimeInMillis());}/** {@inheritDoc} */@Overridepublic synchronized void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {checkParameterCount(parameters, MIN_PARAM_COUNT, MAX_PARAM_COUNT);values = parameters.toArray();}/** {@inheritDoc} */@Overridepublic String getReferenceKey() {return KEY;}/** {@inheritDoc} */@Overridepublic List<String> getArgumentDesc() {return desc;}
}

我重点介绍了代码的一些关键部分。 在第19行,设置功能名称,如在第26行提供功能描述。 在第60行,检查参数数量,并确保提供了正确数量的参数。 代码的主要部分在44到51之间突出显示,其中当前时间被调整并作为字符串对象返回。 如果您有兴趣检查其他函数的实现,请检出github / Code4Reference上的整个源代码。 编写代码后,将其编译并制作jar文件并将其放置在<JMETER_HOME> / lib / ext目录中。 你可以得到一个样本摇篮脚本构建jar文件这篇文章 。 如果您不了解Gradle,则可以使用命令生成jar文件 。 通过在Eclipse中导出包并选择导出目标作为Jar文件,是创建jar文件的最简单方法。

参考:来自Code4Reference博客上的JCG合作伙伴 Rakesh Cusat的JMeter自定义函数实现 。

翻译自: https://www.javacodegeeks.com/2013/06/jmeter-custom-function-implementation.html

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

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

相关文章

vue安装

1、查看版本 npm -v cnpm -v 升级 npm cnpm install npm -g 2、cnpm install vue 3、全局安装 vue-cli cnpm install --global vue-cli 4、创建一个基于webpack模板的新项目 vue init webpack my-project 5、运行项目 cd my-project cnpm install cnpm run dev 6、报错 解决办…

母函数

首先是4个重要的泰勒展开式 1. 2. 3.(e(-x)e(x))/21x^2/2!x^4/4!x^6/6!...... 4.(e(x)-e(-x))/2xx^3/3!x^5/5!x^7/7!...... 之后是两类母函数的应用 总体思路&#xff1a;利用&#xff08;x^ax^bx^c&#xff09;指数表示对某一物品取用的数量&#xff0c;系数表示方案数 1.普通…

如何在本地运行查看github上的开源项目

看中了一款很多星星的github的项目&#xff0c;想把这个项目拉到自己的电脑上运行查看项目效果&#xff0c;该怎么做&#xff1f;示例&#xff1a;我们今天要看的 github项目地址&#xff1a;https://github.com/lzxb/vue-cnode1.克隆项目&#xff1a; git clone [https://gith…

Spring JPA数据+休眠+ MySQL + Maven

在Spring MVC的帮助下开发Web应用程序意味着要创建几个逻辑架构层。 层之一是DAO&#xff08;存储库&#xff09;层。 它负责与数据库进行通信。 如果您至少开发了DAO层一次&#xff0c;则应该知道它涉及许多样板代码。 Spring Data本身就是与DAO相关的日常工作的一部分。 在帖…

关于DJANGO MODELS的个人理解和RELATED_NAME的使用

转自&#xff1a;http://www.cnblogs.com/blogofwyl/p/4283513.html作为一个新人(刚刚大学还没有毕业就出来实习&#xff0c;可以说是真的什么都不知到&#xff0c;什么都要重新学&#xff0c;但是这样真的可以锻炼自己的意志力和能力)。现在在公司是前端和后端一起坐&#xff…

015迭代器

注意迭代器和可迭代对象不同#迭代器&#xff1a;1、有iter方法&#xff0c;2、有next方法li[1,2,3,4,5]diter(li) # 等于li.__iter__()print(d) # <list_iteratorobjectat0x00000174316CC3C8>可以通过next方法取出元素。for循环就是这样的。for循环内部做的三件事1、调用…

CSS属性之attr()

attr()准确的说&#xff0c;不应该是一个属性&#xff0c;而是一个CSS的函数&#xff0c;我们先看看MDN上的介绍吧&#xff1a; Summary The attr() CSS function is used to retrieve the value of an attribute of the selected element and use it in the style sheet. It c…

MySQL大小写敏感的解决方案

前言&#xff1a;对于MySQL的大小写敏感的影响&#xff0c;笔者在一个小项目中深刻的体会到&#xff1a;当想要查询一条数据时&#xff0c;总是出来两条或多条&#xff0c;后来发现是大小写敏感造成的原因&#xff0c;本文就该问题提出解决方案。 1.MySQL大小写敏感的控制 mysq…

利用border制作三角形原理

网站前端页面中&#xff0c;有时候会使用一些三角形&#xff0c;除了使用图片的方式之外&#xff0c;利用css的border属性也可以做出相对应的三角形。那么&#xff0c;利用border是如何实现三角形的制作的呢&#xff1f; 先看下面一个例子&#xff1a; CSS代码&#xff1a; w…

java weblogic 配置_java----weblogic部署应用

安装略创建域在部署过程中&#xff0c;不能用回退按钮&#xff0c;如果输入有误的话只能在该步设置完后重复进行设置。Linux命令和文件(夹)名是区分大小写的。1、进入weblogic的bin目录&#xff1a;#以具体安装目录为准cd /weblogic/Oracle/Middleware/Oracle_Home/wlserver/co…

sass 基础——回顾

1.webstorm 自动编译SASS  下载安装包 http://rubyinstaller.org/downloads/  然后点击安装&#xff0c;路径为默认路径就行&#xff0c; 勾选以下两项    add Ruby executables to your PATH    Associate .rb and rbw files with this Ruby information  安装完…

这么多年第一次自己去用游标和临时表

汗颜&#xff0c;做了这么多年开发自己第一次用游标和临时表 还是借助度娘才写出来的&#xff0c;请大家给指点下。。。 1 CREATE PROCEDURE [dbo].[sp_LaodDefaultFM]2 (3 ExhID int ,4 DefaultExhID INT,5 Result INT6 )7 AS 8 BEGIN 9 --判断当前会话中临时表是…

设置MongoDB副本集分为4个步骤

介绍 在详细介绍配置MongoDB副本集之前&#xff0c;让我简要介绍一下它们&#xff1a; 副本集是Mongodb数据库提供的功能&#xff0c;可实现高可用性和自动故障转移。 它是一种传统的主从配置&#xff0c;但具有自动故障转移功能。 基本上&#xff0c;它是mongod实例的组/集…

一篇文章搞定css3 3d效果

css3 3d学习心得 卡片反转魔方banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了。 首先先给大家看一个小例子&#xff1a; 卡片反转 这个例子只是简单的纯css3 3d 关于y轴旋转 下面是代码&#xff1a; 这是HT…

5个编码技巧以减少GC开销

在本文中&#xff0c;我们将介绍五种方法&#xff0c;这些方法可以使用有效的编码来帮助垃圾回收器减少分配和释放内存的CPU时间&#xff0c;并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时被停止&#xff08;也称为“停止世界”&#xff09;。 一些背景 GC的建立…

java usb 无驱打印_Windows Usb 无驱动打印

\?\USB#VID_8866&PID_0100#0001B0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}USB小票打印解决办法一、需要驱动&#xff0c;无需更改程序安装USB打印驱动&#xff0c;然后共享打印机&#xff0c;通过 “\\计算机\打印机名”的形式&#xff0c;按端口方式写。1二、直接…

需要学习的东西列表

1.Python2.webservice3.requirejs4.idea5.webService6.redis7.doubble8.mongDB9.zookper 大数据学习曲线&#xff1a;课程一、大数据运维之Linux基础课程二、大数据开发核心技术-Hadoop 2.x从入门到精通课程三、大数据开发核心技术-大数据仓库Hive精讲课程四、大数据协作框架-S…

微信小程序 引用其他js里的方法

微信小程序中&#xff0c;在微信官方开发文档我们可以知道 小程序的目录结构 。 一个小程序页面由四个文件组成&#xff0c;一个小程序页面的四个文件具有相同路径与文件名&#xff0c;由此我们可知一个小程序页面对应着一个跟页面同名的js文件。可是当有些公共方法&#xff0…

C++内存模型

C内存模型 一文了解所有C内存的问题 AlexCool 目录 一 C内存模型 二 C对象内存模型 三 C程序运行内存空间模型 四 C栈内存空间模型 五 C堆内存空间模型 六 C内存问题及常用的解决方法 七 C程序内存性能测试 环境&#xff1a; uname -a Linux alexfeng 3.19.0-15-generic #…

css之absolute

一、absolute和float有相同的特性&#xff0c;包裹性和破坏性 1、absolute和float的相似(看下面的demo&#xff0c;如果图片在左上角&#xff0c;那么用float和absolute都一样) 1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5…