如何为Apache JMeter开发插件(二)——第一个JMeter插件

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

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

什么是Function组件?

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

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

一个用于测试的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:

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配置,然后就可以看到该Sampler出现在Sampler列表中:

 


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

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

Function插件开发案例

重新创建工程,工程名为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函数组件的编写。 
将插件打包插入JMeter框架,可以在函数助手中查看到该函数组件内容如下: 
 
框架已经引入了我们所开发的函数组件,我们根据参数设置计算10的阶乘,设置如下: 
 
通过TestSampler对其进行测试,测试结果如下: 

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

时间: 2024-11-05 15:57:22

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

【转】JMeter学习(二十七)Jmeter常见问题

收集工作中JMeter遇到的各种问题 1.  JMeter的工作原理是什么? 向服务器提交请求:从服务器取回请求返回的结果. 2.  JMeter的作用? JMeter可以用于测试静态或者动态资源的性能(文件.Servlets.Perl脚本.java对象.数据库和查询.ftp服务器或者其他的资源).JMeter用于模拟在服务器.网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况.你可以用JMeter提供的图形化界面分析性能指标或者在高负载

【转】 JMeter学习(二十)JMeter处理Cookie与Session

有些网站保存信息是使用Cookie,有些则是使用Session.对于这两种方式,JMeter都给予一定的支持. 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: 2.Session 添加方式:线程组-前置处理器 -HTTP URL 重写修饰符,如下图: 有些tomcat的session实现不是通过cookie的,而是通过session id的,就是说,用户登录有了session之后,tomcat就会维护一个sessonid,然后每次request的时候,要求

js-jquery-插件开发(二)

二.通过$.fn 向jQuery添加新的方法 2.1.基本格式: $.fn.pluginName = function() { //your code goes here } 说明:在$.fn后面添加一个方法,名字是我们的插件名称.然后插件代码在这个方法里面展开. 示例一.将页面上所有链接颜色转成红色 <script type="text/javascript"> $.fn.myPlugin = function() { //在这里面,this指的是用jQuery选中的元素

【转】如何为Apache JMeter开发插件(一)

本文转载于http://blog.csdn.net/column/details/12925.html,作者:xreztento 作者写的很精华,我打算在此系列操作一遍后,加多点截图,便于更多人更快上手插件开发 为什么选择使用JMeter 当被问到这个问题的时候,也许你会在脑海里产生很多的理由,比如: Apache基金会下的开源项目,没有版权问题: 为数不多的还在持续更新的开源性能自动化测试工具: 支持协议丰富,是商用测试工具最佳替代品: 有专门的插件项目做支撑,使得你在实践中有更多的选择,比如

【转】JMeter学习(二十九)使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等

最近要做公司消息中间件的性能测试,第一个想到的工具就是Jmeter了,网上简单搜了一下,基本上都是WEB测试的居多,只好自己研究官方文档了. 其中涉及Jmeter基本的术语或者概念,请自行参考官方文档或者google,这里主要讲JMS PTP请求是如何建立的. 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmeter及相关插件:Jmeter下载地址点我,插件下载地址点我,ActiveMQ下载地址点我 Jmeter下载编译好的包解压就行了,为方便起见,解压目录我这

开发自己的One Page Scroll插件(二)

开发自己的One Page Scroll插件(一) 5. 在其他浏览器中的特性 我经常会不停地发布当前的版本,从而可以在GitHub上得到不断的反馈.我的开发模式是不断的迭代.在开始的时候,我不会太关注它在手机上的效 果,其实到目前我也没有关注这个问题.但其实我使用了一个简单的解决方案.通过检测和转换数据,从而在手机上同样能执行init_scroll方法.但是 这样做不总能达到效果,比如Android系统的浏览器中.所以我最终我最终实现了一个fallback来让插件回退到本地的scrolling

Apache Mina开发手册之二

Apache Mina开发手册之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 四.NIO概述 NIO API是Java 1.4版引入的,NIO的意思是非阻塞的I/O通信.要知道Mina的NIO是基于NIO-1开发的,而在JDK 7中引入了NIO-2的库,但Mina还没有从NIO-2中获得各方面的提升,因此Mina还是基于NIO-1的.虽然Oracle官方是把NIO的N作为New的解释,但业界普遍把这个N解释为Non-Blocking. Mina

C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了.      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可.但是公司不是所有人都搞C#,也不是所有的程序C#都能很好的完成,又或者其他公司提供的API不是C#的,这个时候,就需要这个框架能够支持多种语言了.      废话不多说,进入正题.     上网一搜,C#加载非托管的dll,无非就是使用 DllImportAttribut

关于Eclipse中开发插件(二)

原plugin.xml文件各个设置项的说明: 附上生成的文件代码: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <?eclipse version="3.4"?> 3 <plugin> 4 <extension 5 point="org.eclipse.ui.actionSets"> 6 <actionSet 7 label=&qu