zoukankan      html  css  js  c++  java
  • jmeter伪二次开发1

    1.导入依赖的jar包,jar包的内容从自身所用的jmeter中获取

      1.1查看自身jmeter版本跟原有jar包

      

       1.2选择打开eclipse,创建自己的项目(可以直接file-->new-->java Project创建,也可以file-->new-->Project-->maven Project创建maven项目)

      

     2.把需要的jar包导入到eclipse中

      1.1目前是存在三种导入的方法,这里我们只说一种,其余两种可以网上找资料,选择自己创建的项目,点击Properties

     

      1.2在出现的页面上选择java build path

      

       1.3选择第一步需要的包

      

     3.确定自己选择的包是否已经导入,如果未导入成功则重复第一第二步骤

      

     4.创建一个包之后,在包下面创建一个类

     5.继承jmeter必须依赖的类AbstractJavaSamplerClient

     6.核对是否创建成功

    7.编写简单的hello脚本

    8.导出jar包

     

     

    1. Jmeter会读取用户传入的数据,把数据初始化到Jmeter中。

    2. 调用Java请求时,jmeter会运行内部的runTest函数,调用封装的JAVA接口,获取到返回数据

    3. 获取到返回数据后,Jmeter可以把返回数据写入到结果树中,这样就能使用查看结果树来观察返回的数据了。

    在这个过程中,JMeter内部是使用什么类来进行处理的呢?我们一起来看一下:

    • Arguments:

    位于:org.apache.jmeter.config.Arguments

    Jmeter初始化时,会把用户的参数数据通过Arguments类来加载到内存当中。

    • JavaSamplerContext:

    位于:org.apache.jmeter.protocol.java.sampler.JavaSamplerContext

    JavaSamplerContext用于向JavaSamplerClient实现提供上下文信息。比如加载Arguments中的用户数据

    • JavaSamplerClient:

    这个接口定义了JavaSampler和外部Java程序之间的交互,这些程序可以由JMeter执行。任何想要作为JMeter测试执行的Java类都必须实现这个接口(直接或间接地通过AbstractJavaSamplerClient)。 JMeter将为测试中的每个用户/线程创建一个JavaSamplerClient实现实例。可以创建额外的实例供JMeter内部使用(例如,了解客户机支持哪些参数)。

    当测试启动时,将在每个线程的JavaSamplerClient实例上调用setupTest()来初始化客户机。然后在测试的每次迭代中调用runTest()。最后,将调用teardownTest()来允许客户机进行任何必要的清理。

    JavaSamplerClient包括以下4个函数(必须实现这4个函数)

    ```python void setupTest(JavaSamplerContext var1);

    SampleResult runTest(JavaSamplerContext var1);

    void teardownTest(JavaSamplerContext var1);

    Arguments getDefaultParameters(); ```

    void setupTest(JavaSamplerContext var1):

    加载类时初始化调用的方法,一般获取参数,建立连接等功能写在这里。

    SampleResult runTest(JavaSamplerContext var1)

    实现接口调用的逻辑代码主要写在runTest函数下。一般在这里通过SampleResult类定义在Jmeter GUI界面中请求和返回结果数据。

    如下图中,View Results Tree中内容,就是通过SampleResult进行定义

    void teardownTest(JavaSamplerContext var1)

    类运行结束时,运行这个函数下面的语句,主要用来释放资源,关闭连接等请求后的操作。

    Arguments getDefaultParameters()

    提供测试时支持的参数列表。一般参数的初始化放在这里进行,避免在runTest中执行。可以提高执行效率。

    • SampleResult

    主要用于控制展示每次迭代的测试结果。

    综上,用户数据初始化时,会初始化到Config中,由config模块的Arguments管理参数,然后我们实现的java请求会通过runTest方法调用封装的API接口,并根据返回数据在JMeter设置要展示的返回结果。

    所以我们二次开发jmeter的JAVA接口请求,需要继承JavaSamplerClient接口,并实现其中的4个函数。具体怎么实现,我们接下来详细介绍。

    public Arguments getDefaultParameters();设置可用参数及的默认值;
    public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
    public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式;
    public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;

    package com.testing.jmeter;

    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;

    public class hashDemo extends AbstractJavaSamplerClient {
    private String hashDemo=null;
    private String platformId=null;
    @Override
    public Arguments getDefaultParameters(){
    //定义一个属性对象,用来从GUI页面来接收参数
    Arguments param=new Arguments();
    param.addArgument("hashDemo", "需要hashCode的值");
    param.addArgument("platformId", "请输入platformId");
    return param;
    }
    /* public void setupTest(JavaSamplerContext arg0) {
    //接收GUI页面传递的值,并赋值给全局变量
    username=arg0.getParameter("username");
    password=arg0.getParameter("password");
    host=arg0.getParameter("host");
    port=arg0.getParameter("port");
    dbName=arg0.getParameter("dbName");
    collectionName=arg0.getParameter("collectionName");
    queryString=arg0.getParameter("queryString");
    }
    public Arguments getDefaultParameters();设置可用参数及的默认值;
    public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
    public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,执行多次依赖于设置方式;
    public void teardownTest(JavaSamplerContext arg0):测试结束时调用,只执行一次;
    */
    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {

    hashDemo=arg0.getParameter("hashDemo");
    platformId=arg0.getParameter("platformId");
    SampleResult result=new SampleResult();
    try{
    result.sampleStart();

    String Str = hashDemo;
    result.setRequestHeaders(Str);
    String Str1=Str.hashCode()+"";
    int Str2=Integer.valueOf(Str1);
    int Str3=Math.abs(Str2);
    int platform=Integer.valueOf(platformId);
    //设置响应内容
    int add=(Str3+platform)%32;
    result.setResponseData("hash:"+add+"test",null);
    //设置响应代码为0
    result.setResponseCode("0000");
    //设置响应类型为text
    result.setContentType(SampleResult.TEXT);
    //设置响应状态为true
    result.setSuccessful(true);
    //设置响应信息
    result.setResponseMessage("方法执行成功!");
    }catch(Exception e){
    e.printStackTrace();
    result.setSuccessful(false);
    }finally{
    //表示请求结束计时
    result.sampleEnd();
    }
    return result;
    }
    }

    进行调试

    package com.mumu.functions;

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

    import redis.clients.jedis.Jedis;

    import org.apache.jmeter.config.Arguments;


    public class redisTest extends AbstractJavaSamplerClient {
    private String redisIp=null;
    private String redisPort=null;
    private String redisPwd=null;
    private String redisKey=null;
    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {
    redisIp=arg0.getParameter("redisIp");
    redisPort=arg0.getParameter("redisPort");
    redisPwd=arg0.getParameter("redisPwd");
    redisKey=arg0.getParameter("redisKey");
    SampleResult result=new SampleResult();
    result.sampleStart();
    try{
    Jedis jedis = new Jedis(redisIp,Integer.valueOf(redisPort));
    // 3. 获取数据
    jedis.auth(redisPwd);
    System.out.println("链接成功");
    String value = jedis.get(redisKey);
    System.out.println(value);
    result.setResponseData(value, SampleResult.TEXT);
    result.setSuccessful(true);
    // 4.释放资源
    jedis.close();
    }
    catch(Exception e){
    e.printStackTrace();
    result.setSuccessful(false);
    }
    finally{
    result.sampleEnd();
    }
    return result;
    }
    public Arguments getDefaultParameters(){
    Arguments param=new Arguments();
    param.addArgument("redisIp", "请输入redis的ip");
    param.addArgument("redisPort","请输入redis的端口");
    param.addArgument("redisPwd","请输入连接redis的密码");
    param.addArgument("redisKey","请输入需要返回的redisKey");
    return param;
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Arguments params = new Arguments();
    params.addArgument("redisIp", "123.157.23.35");//设置参数,并赋予默认值1
    params.addArgument("redisPort", "6379");//设置参数,并赋予默认值2
    params.addArgument("redisPwd", "yinchen11xi@9999");
    params.addArgument("redisKey", "d238a236f71b11cqadddbabb480cd");
    JavaSamplerContext arg0 = new JavaSamplerContext(params);
    redisTest test = new redisTest();
    test.setupTest(arg0);
    test.runTest(arg0);
    test.teardownTest(arg0);
    }
    }

  • 相关阅读:
    DNS解析过程和DNS挟持
    TCP的流量控制和拥塞控制
    tcp连接的建立与释放
    DRBD分布式块设备复制
    rsync+inotify实现数据的实时备份
    nginx+tomcat网页动静分离配置
    基于mysql数据库集群的360度水平切割
    基于主从复制的Mysql双机热备+amoeba实现读写分离、均衡负载
    hexo安装
    centos7-minimal升级内核
  • 原文地址:https://www.cnblogs.com/wendy-0901/p/13728370.html
Copyright © 2011-2022 走看看