JMeter自定义Java Sample

2020-11-27  本文已影响0人  一飞冲不了天

自定义Java Sample需要实现AbstractJavaSamplerClient抽象类。AbstractJavaSamplerClient抽象类有几个主要的方法:

1、setupTest 用来做一些初始化的操作,每一线程只会调用该方法一次。
2、teardownTest 用来做一些清理的操作,每一线程只会调用该方法一次。
3、getDefaultParameters 设置sample的参数以及默认值,这个方法设置的参数会显示在Java request组件的界面上。
4、runTest 这个方法就是sample的核心方法,每次迭代都会调用,并且返回SampleResult对象。由于该方法是抽象方法,所以自定的sample一定要实现该方法,其他方法可根据情况选择是否重写。

一、用idea或其他IDE工具创建一个maven项目

二、在porm.xml文件中,引入以下几个依赖项

<dependencies>

        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>4.0</version>
        </dependency>

    </dependencies>

三、创建一个java类,并实现AbstractJavaSamplerClient类

四、实现runTest方法,并适当重写其他几个方法(以下是示例)

package lym.iflytek.mt_scylla;

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 IflytekSample extends AbstractJavaSamplerClient {
    private IatDemo iat;#业务类,具体代码不再贴出来

    public Arguments getDefaultParameters() {
        /*
        这个方法由JMeter调用,添加的Arguments参数会在界面上展示出来,可以设置默认值。
        * */
        Arguments arg = new Arguments();
        arg.addArgument("addr", "");
        arg.addArgument("appid", "");
        arg.addArgument("token", "");
        arg.addArgument("rate", "");
        arg.addArgument("filePath", "");
        arg.addArgument("printLog", "false");
        arg.addArgument("encoding", "utf-8");
        arg.addArgument("costTimeType", "3");
        return arg;
    }


    public void setupTest(JavaSamplerContext context) {
        /*进行初始化操作,每一个线程只执行一次*/
        String addr = context.getParameter("addr");
        String appid = context.getParameter("appid");
        String token = context.getParameter("token");
        String rate = context.getParameter("rate");
        String printLog = context.getParameter("printLog");
        String costTimeType = context.getParameter("costTimeType");
        iat = new IatDemo(addr, appid, token, rate, printLog, costTimeType);
        System.out.println(Thread.currentThread().getName()+":初始完成");

    }

    public void teardownTest(JavaSamplerContext context){
        /*做一些清理操作,每个线程只执行一次*/
        try {
            iat.UninitializeEx();
            System.out.println(Thread.currentThread().getName()+":逆初始化完成");
        } catch (IflytekException e) {
            getNewLogger().error(e.getMessage(), e);
        }
    }

    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        /*每次迭代都会调用,并且返回SampleResult对象,该对象保存了每次运行的执行结果*/
        String filePath = javaSamplerContext.getParameter("filePath");
        String encoding = javaSamplerContext.getParameter("encoding");
        String costTimeType = javaSamplerContext.getParameter("costTimeType");
        #SampleResult ,用来保存每次运行的结果,以便JMeter进行数据统计。
        SampleResult sampleResult = new SampleResult();
        #通过参数控制运行时间的统计范围,如果你的业务没那么复杂,
        #完全可以在runTest开始时设置开始时间,方法结束时设置结束时间。
        if (costTimeType.equals("1")) {
            sampleResult.sampleStart();#设置运行的开始时间
        }
        try {
            String allresult = iat.start(filePath, sampleResult);

            sampleResult.setSamplerData(filePath);#设置输入数据
            sampleResult.setDataType(SampleResult.TEXT);#设置数据类型
            sampleResult.setResponseData(allresult, encoding);#设置sample接收到的数据
            sampleResult.setSuccessful(true);#设置sample执行结果
            sampleResult.setResponseCodeOK();#设置sample执行状态码

        } catch (Exception e) {
            sampleResult.setSuccessful(false);
            sampleResult.setResponseCode("500");
            sampleResult.setResponseMessage(e.getMessage());
            getNewLogger().error(e.getMessage(), e);
        }
        if (costTimeType.equals("1")) {
            #设置运行的结束时间,结束时间-开始时间,就是整个sample的运行时间
            #(JMeter就是用这个时间来计算平均响应时间的)。可以根据实际情况,设置在不同的位置。
            sampleResult.sampleEnd();
        }

        if (sampleResult.getStartTime() == 0) {
            sampleResult.sampleStart();
        }

        if (sampleResult.getEndTime() == 0) {
            sampleResult.sampleEnd();
        }
        return sampleResult;
    }

    public static void main(String[] args) {
        IflytekSample sample = new IflytekSample();
        Arguments arg = new Arguments();
        arg.addArgument("addr", "192.168.0.1:1234");
        arg.addArgument("appid", "00000000");
        arg.addArgument("token", "11111111");
        arg.addArgument("rate", "41000");
        arg.addArgument("filePath", "1.wav");
        arg.addArgument("printLog", "true");
        arg.addArgument("costTimeType", "2");

        JavaSamplerContext javaSamplerContext = new JavaSamplerContext(arg);
        sample.setupTest(javaSamplerContext);
        SampleResult sampleResult = sample.runTest(javaSamplerContext);
        System.out.println(sampleResult.getResponseDataAsString());
        sample.teardownTest(javaSamplerContext);

    }

}

五、将项目打包成一个jar文件,放到JMeter_HOME/lib/ext目录下,并重启JMeter

六、新建一个测试计划,添加线程组,并在线程组下添加Java Request,在Java Request界面上选择刚刚自定义的java类,效果如下图

自定义Sample
上一篇 下一篇

猜你喜欢

热点阅读