文章内容转载于:http://lib.csdn.net/article/softwaretest/25700,并且加上个人一些截图

本篇将开启为JMeter开发插件之旅,我们选择以Function(函数)组件作为插件开发的入手对象,在前面的章节我们将其划分为非GUI组件,选择它的理由不仅仅是因为Function插件在开发方面是极简的,而且在实际运用JMeter执行测试时,对于Function组件的应用会极大的为你的测试带来便利,有些甚至是必不可少的。

什么是Function组件?

我们还是有必要对Function组件的功能进行一下简单的回顾: 

通过打开函数助手,我们可以通过下拉菜单,查看JMeter为我们默认提供的一系列实用的函数功能,使用函数非常简单,比如”__UUID”函数,功能是生成一个uuid,在后面的输入框中只需输入”${__UUID}”便可以引入调用该函数方法所返回的uuid值,所有的组件都可以对函数组件进行引入。

插件开发方法有两种!

第一种:直接在jmeter官网下载 jmeter开源包,在源码里面新加函数,然后导出jar!

第二种:不需要下载源码,直接导入jmeter相应的jar包,即可立即开发!看官方文档,也是推荐使用第二种方法,下面都是以第二种方法为例。

一个用于测试的Sampler插件

在此处我们首先可以开发一个专门用于测试函数或自定义变量输出的Sampler(原来它才是我们所开发的第一个插件),我们叫它TestSampler,开发方式是分离法,分为逻辑控制部分TestSampler和GUI部分TestSamplerGUI:

1、首先创建Java工程,File>New>Project,选择未maven工程,next>命名为TestSampler>next

2、先在Java工程中引入主要的JMeter插件开发jar包,如何引入jar包可参考IntelliJ IDEA java项目导入jar包,打jar包:http://www.cnblogs.com/yulia/p/6824058.html:

对应包可以取jmeter安装目录:apache-jmeter-2.13\lib\ext

3. TestSampler类代码参考如下:

public class TestSampler extends AbstractSampler {

    public final static String FUNCTION = "function";
@Override
public SampleResult sample(Entry entry) {
// TODO Auto-generated method stub
SampleResult res = new SampleResult();
res.sampleStart();
System.out.println(this.getProperty(FUNCTION));//输出GUI界面所输入的函数方法返回结果
res.sampleEnd();
res.setSuccessful(true);
return res;
}
}

 

我们在之前的章节简单介绍了Sampler的主要实现方法,通过重写sample方法,实现执行一次抽样方法,我们在此处输出”function”属性所对应的值,即输出GUI界面所引入的函数方法返回结果。 
4. TestSamplerGUI类代码参考如下:

public class TestSamplerGUI extends AbstractSamplerGui{
private JTextField functionTextField = null;
public TestSamplerGUI(){
init();
} @Override
public void configure(TestElement element) { super.configure(element);
functionTextField.setText(element.getPropertyAsString(TestSampler.FUNCTION));
} private void init() { JPanel mainPanel = new JPanel(new GridBagLayout());
functionTextField = new JTextField(20);
mainPanel.add(functionTextField);
add(mainPanel);
} @Override
public TestElement createTestElement() {//创建所对应的Sampler
// TODO Auto-generated method stub TestElement sampler = new TestSampler();
modifyTestElement(sampler);
return sampler;
} @Override
public String getLabelResource() {
// TODO Auto-generated method stub
return this.getClass().getSimpleName();
} @Override
public void modifyTestElement(TestElement sampler) { // TODO Auto-generated method stub
super.configureTestElement(sampler);
if (sampler instanceof TestSampler) {
TestSampler testSmpler = (TestSampler) sampler;
testSmpler.setProperty(TestSampler.FUNCTION, functionTextField.getText()); } } @Override
public String getStaticLabel() {//设置显示名称
// TODO Auto-generated method stub
return "TestSampler";
} private void initFields(){
functionTextField.setText("");
} @Override
public void clearGui() {
super.clearGui();
initFields();
} }

我们主要的目的是通过modifyTestElement方法将functionTextField输入框中所输入的值赋给TestSampler对象的function属性。

5、通过上面的简单代码完成了测试用的Sampler,把java工程打包为jar包,如何打包可参考IntelliJ IDEA java项目导入jar包,打jar包:http://www.cnblogs.com/yulia/p/6824058.html

6、把上一个步骤打的包插入JMeter框架,即把TestSampler.jar放到jmeter包路径下,例D:\apache-jmeter-2.13\lib\ext下

7、若jmeter在上一个步骤时打开,重启jmeter,在测试计划下add directory or .jar to classpath把TestSampler.jar配置后,在jmeter操作,线程组>添加>Sampler,看到该TestSampler出现在Sampler列表中:

 


在线程组下添加该Sampler,并输入被测试函数,运行该测试计划,可以看到控制台输出: 

OK,和我们的意图一致,输出了__UUID函数运行后所返回的结果。 
有了测试用的Sampler后,就可以开发拥有自己功能的Function插件了。

Function插件开发案例

1、重新创建工程,工程名为Factorial。现在可以写一个计算阶乘的Function,将其命名为Factorial,主要代码参考如下(打包在如*.jmeter.functions下):

import java.util.Collection;
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;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger; public class Factorial extends AbstractFunction { private static final Logger log = LoggingManager.getLoggerForClass();
private static final List<String> desc = new LinkedList<String>();
private static final String KEY = "__factorial";
private Object[] values = null; static {
desc.add("factorial_value");
}
//描述参数
@Override
public List<String> getArgumentDesc() {
// TODO Auto-generated method stub
return desc;
}
//函数执行,返回结果
@Override
public String execute(SampleResult previousResult, Sampler currentSampler)
throws InvalidVariableException {
// TODO Auto-generated method stub
String numberString = ((CompoundVariable) values[0]).execute().trim();
int num;
try{
num = Integer.valueOf(numberString);
} catch (Exception e){
return null;
} return String.valueOf(factorial(num));
}
//获取函数引用关键字
@Override
public String getReferenceKey() {
// TODO Auto-generated method stub
return KEY;
}
//设置参数
@Override
public void setParameters(Collection<CompoundVariable> parameters)
throws InvalidVariableException {
// TODO Auto-generated method stub
//可以检查参数数量,主要包括以下两种方法
checkMinParameterCount(parameters, 1);
checkParameterCount(parameters, 1, 1);
values = parameters.toArray();
} private int factorial(int num){
int result = 1;
if(num < 0){
return -1;
}
if(num == 0){
result = 1;
} else {
for(int i = num; i > 0; i--){
result *= i;
}
} return result;
}
}

通过继承AbstractFunction抽象类,重写getArgumentDesc方法实现对函数参数的描述,重写setParameters方法来对函数的参数进行检查和设置,重写getReferenceKey方法告诉JMeter该函数在框架中的引用名称,重写execute方法,实现对该函数的执行并返回结果。通过上述代码我们完成了对Factorial函数组件的编写。

2、这里写的简洁了,如果觉得复杂,可再参考TestSampler类似步骤(5、6、7),将插件打包插入JMeter框架,可以在函数助手中查看到该函数组件内容如下: 
 
框架已经引入了我们所开发的函数组件,我们根据参数设置计算10的阶乘,设置如下: 
 
通过TestSampler对其进行测试,测试结果如下: 

控制台输出了10的阶乘返回结果。就此,便通过此章节基本掌握了Function(函数)插件式组件的主要开发过程。

如何为Apache JMeter开发插件(二)—第一个JMeter插件的更多相关文章

  1. js-jquery-插件开发(二)【最终插件是最后一个,中间是过程】

    二.通过$.fn 向jQuery添加新的方法 2.1.基本格式: $.fn.pluginName = function() { //your code goes here } 说明:在$.fn后面添加 ...

  2. JMeter开发插件——图片验证码识别

    我们在性能测试中总会时不时地遭遇到来自于应用系统的各种阻碍,图片验证码就是一类最常见的束缚,登录或交易时需要按照图片中的内容输入正确的验证信息后,数据才可以提交成功,这使得许多性能测试工具只能望而却步 ...

  3. 手把手教你实现一个支持插件化的 uTools 工具箱(一)

    前言 对于前端同学来说,我们会经常用到各种小工具,比如:图床.颜色拾取.二维码生成器.url 管理.文本比对.json 格式化.当然我们可以 chrome 收藏夹来管理各种在线的小工具,但作为一个有追 ...

  4. 如何为Apache JMeter开发插件(一)

    本文转载于http://blog.csdn.net/column/details/12925.html,作者:xreztento 作者写的很精华,我打算在此系列操作一遍后,加多点截图,便于更多人更快上 ...

  5. JMeter 源码二次开发函数示例

    JMeter 源码二次开发函数示例 一.JMeter 5.0 版本 实际测试中,依靠jmeter自带的函数已经无法满足我们需求,这个时候就需要二次开发.本次导入的是jmeter 5.0的源码进行实际的 ...

  6. Apache Jemeter 开发插件

    为什么选择使用JMeter 当被问到这个问题的时候,也许你会在脑海里产生很多的理由,比如: Apache基金会下的开源项目,没有版权问题: 为数不多的还在持续更新的开源性能自动化测试工具: 支持协议丰 ...

  7. Apache Cordova开发环境搭建(二)VS Code

    原文:Apache Cordova开发环境搭建(二)VS Code 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011127019/articl ...

  8. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  9. 金蝶K3 wise 插件二次开发与配置

    金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...

随机推荐

  1. UVA 763 Fibinary Numbers

    题意讲某个二进制按照规则每一位对应斐波那契数生成新的数字,然后2个数字求和.再求由该规则生成的二进制串.并且要求尽量用更大项的fib数(题目提示不能由连续的1就是2个连续的1(11)不如100更优) ...

  2. (十)stm32 GPIO口复用,重映射 RCC_APB2Periph_AFIO

    什么时候需要用到RCC_APB2Periph_AFIO--复用IO时钟的使用 需要用到外设的重映射功能时才需要使能AFIO的时钟 外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1 ...

  3. 13.OpenStack常用命令

    常用的命令 使用trove create创建数据库 trove create name --size= --databases DBNAME \ --users USER:PASSWORD --dat ...

  4. SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条

    SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...

  5. 解决:高版本jdk编译低版本代码时eclipse提示Access restriction:The type 'Unsafe' is not accessible due to restriction on required library

    在Eclipse中采用高版本jdk编译一些低版本的源码时,由于源码中使用了一些高版本中过时的API,可能就会报错,类似于: Access restriction:The type 'Unsafe' i ...

  6. ADO 右键问题,当dbgrideh非只读的时候,会遇到这个问题

    /// <summary> /// 再选中列上右键造成,选中这列的状态变化的情况的修复 /// </summary> procedure TfrmMain.XuanYouJia ...

  7. ZOJ 3940 Modulo Query (2016年浙江省赛E题,区间折叠 + map运用)

    题目链接  2016 ZJCPC Problem E 考虑一个开区间$[0, x)$对$a_{i}$取模的过程. $[0, x)$中小于$a_{i}$的部分不变,大于等于$a_{i}$的部分被切下来变 ...

  8. zclip笔记:解决zclip失效问题

    在一个子页面里想实现一键复制到剪贴版的功能,使用zclip插件,用jquery的方式实现时出现了诡异问题.复制功能平时正常,当页面中所列的内容过多时,一键复制的功能失效. 这个问题相当不好定位,先说结 ...

  9. 多模态检索之CCA算法

    多模态检索主要是实现不同模态下的数据能相互检索,例如文本模态数据,和图像模态数据.要能实现他们之间的相互检索,首先要是它们相互关联起来.CCA·算法用于多模态检索步骤:      1)首先提取文本,图 ...

  10. 【NOIP模拟赛】【乱搞AC】【奇技淫巧】【乘法原理】回文串计数

    回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他走向了以记忆量 ...