基于项目需求开发JMeter插件

原创 2015年11月18日 18:05:30

前言
由于项目的接口并非传统的HTTP或者socket请求,建立socket长连接以后,开发使用自己代码对包头和包体进行加密,并约定成协议号,而我们需要根据这个协议号,通过开发的源码把包头和包体进行加密,再传到服务器,才能得到我们想要的返回结果。我们可以通过开发脚本来对每个接口进行测试,测试接口工作是否正常,但是如何对这些接口进行压力测试。

工具引入
引入JMeter的原因是它是一个开源的纯Java桌面应用程序,也就是说,我们可以自己来开发插件,满足性能测试的需要,但是由于JMeter是一个纯Java的程序,所以插件只支持Java语言,所以必须在Java环境下面开发JMeter的插件。

插件开发
通过Eclipse新建一个Java项目,导入JMeter的两个包,ApacheJMeter_core.jar和ApacheJMeter_java.jar,src目录下面新建一个包,包名按需定义,包下面新建一个类,类的代码如下

package jmeter_socket;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

/**
***继承JMeter暴露出来的抽象类,并重写该抽象类中的以下方法,这是开发插件前提
**/
public class TestSocket extends AbstractJavaSamplerClient {

    private String protocol;
    private String host;
    SampleResult results;

   /**
    ***测试开始前的准备工作,比如设置测试需要多少参数
   */
    @Override
    public void setupTest(JavaSamplerContext arg0) {

        protocol = arg0.getParameter("protocol"); //JMeter需要调用的参数
        host = arg0.getParameter("host");

    }

   /**
    ***获取传入的参数,JMeter界面上显示的需要输入的参数值
   */
    @Override
    public Arguments getDefaultParameters() {

        Arguments params = new Arguments();
        params.addArgument("host", "");
        params.addArgument("protocol", "");
        return params;

    }

   /**
    ***测试的主要方法
   */
    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {

        Main cs = new Main();

        results = new SampleResult(); //实例化测试结果
        String SignInResult = "";
        results.sampleStart();  //测试开始

        //下面这个方法是建立服务器的Socket连接,并加密传入的包头和包体的方法
        SignInResult = cs.getSocketBody(host, Integer.parseInt(protocol));

        results.sampleEnd();  //测试结束

        System.out.println(results.getResponseCode());
        //下面是判断测试成功或者失败,我这里写的是从服务器得到的返回内容如果为空,则接口测试失败,返回不为空,则测试成功。
        if (SignInResult.isEmpty())
            results.setSuccessful(false);

        else
            results.setSuccessful(true);

        results.setResponseMessage(SignInResult);

        return results;

    }
    //测试结束需要运行的
    @Override
    public void teardownTest(JavaSamplerContext context) {

    }

}

下面是后台约定的协议号和加密的过程
每个协议都对应其加密包头和包体的过程,然后返回服务器的应答内容。

    public String getSocketBody(String host, int protocol) {

        this.host = host;
        String resBody = "";
        switch (protocol) {

        case 1802:
            resBody = Protocol1802();
            break;

        case 4200:
            resBody = Protocol4200();
            break;

        case 4201:
            resBody = Protocol4201();
            break;
        case 4202:
            resBody = Protocol4202();
            break;
        case 4203:
            resBody = Protocol4203();
            break;
        case 4205:
            resBody = Protocol4205();
            break;
        case 4206:
            resBody = Protocol4206();
            break;
        case 4207:
            resBody = Protocol4207();
            break;
        case 4212:
            resBody = Protocol4212();
            break;
        case 4213:
            resBody = Protocol4213();
            break;
        case 4220:
            resBody = Protocol4220();
            break;
        case 4223:
            resBody = Protocol4223();
            break;
        case 4225:
            resBody = Protocol4225();
            break;
        case 4226:
            resBody = Protocol4226();
            break;
        case 4400:
            resBody = Protolcol4400();
            break;
        case 4410:
            resBody = Protolcol4410();
            break;
        case 4411:
            resBody = Protolcol4411();
            break;
        case 4401:
            resBody = Protolcol4401();
            break;
        case 4402:
            resBody = Protolcol4402();
            break;
        case 4403:
            resBody = Protolcol4403();
            break;
        case 4404:
            resBody = Protolcol4404();
            break;
        case 4405:
            resBody = Protolcol4405();
            break;
        case 4406:
            resBody = Protolcol4406();
            break;
        case 4407:
            resBody = Protolcol4407();
            break;
        case 4408:
            resBody = Protolcol4408();
            break;
        case 4409:
            resBody = Protolcol4409();
            break;
        case 5003:
            resBody = Protocol5003();
            break;
        case 5033:
            resBody = Protocol5033();
            break;
        case 5067:
            resBody = Protocol5067();
            break;
        case 5071:
            resBody = Protocol5071();
            break;
        }

        return resBody;
    }

部署JMeter源码开发环境,调试开发的插件
在官网下载JMeter源码apache-jmeter-2.13_src.zip和发布版本apache-jmeter-2.13.rar,解压后保存在本地。
在Eclipse中新建一个项目,点击下一步,勾选”Allowoutput folders for source folders”,防止导入源码时把bin目录做为输出目录给清理掉。点击”Finish”,完成新项目的创建。点击”Import“选择General-FileSystem,从文件系统导入源码。在源码目录下把eclipse.classpath中的内容复制到新建的项目的.classpath文件中。在新项目的lib目录下,新建api目录,存储bcmail-jdk15on-1.49.jar、bcpkix-jdk15on-1.49.jar、bcprov-jdk15on-1.49.jar三个jar包。把发布版本的lib目录下所有jar包拷贝到新项目的lib目录下。在新项目下,用ant执行build.xml文件,生成相应jar包,若build失败,请用command命令在新项目下面执行”ant download_jars“,再用ant执行一次build.xml。
新项目的目录结构为
这里写图片描述
修改新项目的Run Configuration的Arguments配置中Working directory为${workspace_loc:%{新项目名}/bin}。
这里写图片描述

调试插件
将开发的插件项目导出成jar文件并放到新项目的”lib/ext“文件夹下面
这里写图片描述
右键点击新项目,Run As Java Application,选择NewDriver类,即可运行JMeter,在JMeter的界面中新建一个线程组,在线程组下面新建一个Java请求的Sampler,即可看到开发的插件
这里写图片描述
执行测试在查看结果树中可以看到取样器结果。
这里写图片描述
这里显示的Response Message正是我们所想要的返回内容,插件测试成功,当然,如果插件有问题,也可以通过调试的模式调试插件。

JMeter基于项目需求开发插件基本就完成了,这里有个问题,就是我的结果树中的请求和响应数据均为空,跟一般的HTTP请求的结果是不一样的,还望高手告知如何把请求内容放在请求界面,以及Response message放到响应数据界面中。

版权声明:本文为博主原创文章,未经博主允许不得转载,如有任何问题,请与本人联系。

用JAVA进行图像识别的小程序

我们来用JAVA制作一个进行图像识别的小程序.输入两个图像路径,就可以进行比对,然后输出相似度 接下来是制作过程 首先制作界面GUI 制作完成后效果如下 接下来开始实现功能 在点击对比按钮...

简单验证码识别的python脚本

最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。 我主要用的是Python中的PIL库。首先进行...

Jmeter自定义脚本实例(以项目中阿里云上传接口为例子的需求分析以及实现)

今天来介绍一下Jmeter的Java自定义脚本功能和在项目中的实际例子,因为是实际项目,所以有的接口不可避免的屏蔽掉,但是不影响整体阅读的 :) 背景知识: 在实际写之前,我们需要有jmet...

如何为Apache JMeter开发插件(五)——监听器之Report (报告)

JMeter监听器组件前文介绍过,我们可以从实际用途上将JMeter的Listener(监听器)组件分为两大类Report (报告)和Vizualizers(监视器)。Report (报告)主要用于收...

jmeter - 开发java插件,进行测试

1.准备工作 开发jmeter的java插件需要引入两个包"ApacheJMeter_core.jar"和"ApacheJMeter_java.jar",位于Jmeter的安装目录lib/ext 下 ...
  • kaku21
  • kaku21
  • 2015年10月29日 10:56
  • 1128

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

关键在于不要简单地把JMeter理解为一个单纯的性能测试工具,而应该意识到它还是一个优秀的框架,这甚至成为我选择它的一个最根本理由,在这里所有的组件都可以通过自由编写插件的方式进行添加和完善,对于一个...

JMeter二次开发(2)-编写 JSON Assertion 插件

本篇文章主要介绍如何对JMeter进行二次开发,添加自己所需的功能。这里以Json验证为例进行说明。在web接口测试过程中,JSON的应用已经非常普遍,但原声的JMeter并没有提供Json及Json...
  • buaawp
  • buaawp
  • 2016年03月18日 15:18
  • 579

如何为Apache JMeter开发插件(六)——监听器之Vizualizer(监视器)

如何对Apache Tomcat的性能计数进行监视上一章节我们对JMeter的监听器组件进行了一个概况介绍,并通过实现开发一个Report(报告)组件为大家展示了监听器组件的内部工作逻辑,本篇将为大家...

设计师和开发人员更快完成工作需求的35个惊人的jquery插件教程(下)

jQuery是一个快速,简洁的工具,它可以遍历HTML文档,处理事件,执行动画,并添加AJAX。jQuery赋予web开发更多的选择机会,使网站产生令人难以置信的元素效果不像之前需要写下几十行代码实现...
  • Tizian
  • Tizian
  • 2012年08月02日 09:30
  • 239

设计师和开发人员更快完成工作需求的20个惊人的jquery插件教程(上)

jquery的功能总是那么的强大,用他可以开发任何web和移动框架,在浏览器市场,他一直是占有重要的份额,今天,就给大家分享20惊人的jQuery插件为设计师和开发人员。比方说The-M-Projec...
  • Tizian
  • Tizian
  • 2012年08月02日 09:29
  • 530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于项目需求开发JMeter插件
举报原因:
原因补充:

(最多只允许输入30个字)