前言

针对非http协议需要进行测试,对于这些协议,市场上可能没有现成的工具可以直接使用。这时候我们就可以通过编写相应的Java采样器来做自己的工作,高效的进行性能测试工作。

环境准备

          java环境已经搭建好了

     jmeter环境已经搭建好了

          idea开发环境已经配置

二次开发前提

  • 需要 lib/ext 中的 Apache JMeter_core.jar
  • 扩展 Java 请求也需要 Apache JMeter_ java.jar
  • 扩展 HTTP 请求需要 Apache JMeter_ http.jar
  • 导入jar包,自己导入

对应maven库用到的库有

<dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <!--scope>provided</scope-->
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <!--scope>provided</scope-->
            <version>4.0</version>
        </dependency>

 

Jmeter Java 采样器

public Arguments getDefaultParameters();                  可选,定义可用参数和默认值,获取接口参数;
public void setupTest(JavaSamplerContext arg0);可选, 初始化工作相当于setUp(); 
public SampleResult runTest(JavaSamplerContext arg0);必选, 相当于 Action; 
public void teardownTest(JavaSamplerContext arg0);可选, 相当于 tearDown();

方法执行顺序

getDefaultParameters() > setupTest(JavaSamplerContext arg0) > runTest(JavaSamplerContext arg0) > teardownTest(JavaSamplerContext arg0)

常用方法

  • addArgument("name", "value") 定义参数
  • sampleStart()定义了一个事务的开始,类似于lr_start_transaction的LR,就像LR一样,事务之间不要放不相关的代码
  • sampleEnd() 定义一个事务的结束,类似于lr_end_transaction的LR
  • setSuccessful(true, false) 设置运行结果的成功或失败。Jmeter统计成功和失败的次数,可以反映在聚合报告中。

类继承

做二次开发的时候,大家都知道自己定义的类需要继承AbstractJavaSamplerClient,但是大家要知道为什么要继承这个类而不是其他类。为了更清楚的理解代码,我们来看一下代码如下:

public abstract class AbstractJavaSamplerClient implements JavaSamplerClient {
    private static final Logger log = LoggerFactory.getLogger(AbstractJavaSamplerClient.class);
    private static final org.apache.log.Logger oldLogger = LoggingManager.getLoggerForClass();

    public AbstractJavaSamplerClient() {
    }

    public void setupTest(JavaSamplerContext context) {
        log.debug(this.getClass().getName() + ": setupTest");
    }

    public void teardownTest(JavaSamplerContext context) {
        log.debug(this.getClass().getName() + ": teardownTest");
    }

    public Arguments getDefaultParameters() {
        return null;
    }

    /** @deprecated */
    @Deprecated
    protected org.apache.log.Logger getLogger() {
        return oldLogger;
    }

    protected Logger getNewLogger() {
        return log;
    }
}

从上面的代码我们可以看出,有构造方法和三种常用方法。这三种方法熟悉吗?是的,前面已经提到过。但是,仍然缺少一个 runTest 方法,那么它在哪里呢?它必须在此类 JavaSamplerClient 中。让我们继续代码如下:

public interface JavaSamplerClient {
    void setupTest(JavaSamplerContext var1);

    SampleResult runTest(JavaSamplerContext var1);

    void teardownTest(JavaSamplerContext var1);

    Arguments getDefaultParameters();
}

好了,既然知道了这四种方法的来源,在自己的类中,来实现功能,其实就可以重写这四种方法来实现自己的功能了。有了思路,我们真的来写个demo。

输出两个参数,

package com.czq.com;

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;


/**
 * @author_router: jiapengchu
 * @date: 2021-10-17
 *
 */

public class PalindromeDemo extends AbstractJavaSamplerClient {
    private String name;
    private int age;

    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        return null;
    }

    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("name","tom");
        params.addArgument("age","18");
        return params;
    }
}

 

导出jar 包放到 lib/ext 目录下查看

java 整合zabbix 二次开发 java的二次开发_apache

 

完整代码

package com.czq.com;

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;


/**
 * @author_router: jiapengchu
 * @date: 2021-10-17
 *
 */

public class PalindromeDemo extends AbstractJavaSamplerClient {
//    声明变量
    private String name;
    private String age;



    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
//        设置参数
        params.addArgument("name","tom");
        params.addArgument("age","18");
        return params;
    }
    @Override
    public void setupTest(JavaSamplerContext arg0) {
//        获取变量值
        name = arg0.getParameter("name");
        age = arg0.getParameter("age");
    }
    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        SampleResult sr = new SampleResult();
//        逻辑处理
        sr.setSamplerData("Request parameters name The values of are:"+name);
        sr.setSamplerData("Request parameters age The values of are:"+age);
        try{
            // jmeter start statistics response time mark   \
            sr.sampleStart();
            int iage = Integer.parseInt(age);
            if(iage<0){
                sr.setResponseData("age can not be possive number","utf-8");
                sr.setSuccessful(false);
            }
            else if(iage==0) {
                sr.setResponseData("age must be >0","utf-8");
                sr.setSuccessful(false);
            }else {
                sr.setResponseData(name+"恭喜,注册成功","utf-8");
                sr.setSuccessful(true);
            }
        } catch(Throwable e) {
            sr.setSuccessful(false);
            e.printStackTrace();

        }finally {
            sr.sampleEnd();
        }
        return sr;

    }

}

导出jar包后,测试

java 整合zabbix 二次开发 java的二次开发_java 整合zabbix 二次开发_02

 

 

java 整合zabbix 二次开发 java的二次开发_apache_03

 

 

java 整合zabbix 二次开发 java的二次开发_apache_04

 

 

java 整合zabbix 二次开发 java的二次开发_apache_05

 

 

java 整合zabbix 二次开发 java的二次开发_java 整合zabbix 二次开发_06

 

 

java 整合zabbix 二次开发 java的二次开发_java 整合zabbix 二次开发_07

 

 

java 整合zabbix 二次开发 java的二次开发_java 整合zabbix 二次开发_08

 

 

java 整合zabbix 二次开发 java的二次开发_ide_09

 

 到此演练结束