JMeter二次开发之gRPC插件开发(三)

背景:接上一篇JMeter二次开发之gRPC插件开发(二)

步骤:

1.JMeter取样器

package grpc.client.jmeter;


import com.java.grpc.stub.HelloReply;
import grpc.client.GrpcClient;
import io.grpc.StatusRuntimeException;

import org.apahce.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 HelloGrpcSampler extends AbstractJavaSamplerClient{

    GrpcClient grpcClient = null;
    String host = "127.0.0.1";
    String port = "50052";
    String name = "zhangsan";

    // 设置可用参数及默认值。这里设置的变量名和变量值会体现在Java Request元件的页面上
    @Override
    public Arguments getDefaultParameters(){
        Arguments defaultParameters = new Arguments();
        defaultParameters.addArgument("host", host);
        defaultParameters.addArgument("port", port);
        defaultParameters.addArgument("name", name);

        return defaultParameters;
    }

    // 每个线程测试前执行一次,做一些初始化工作
    @Override
    public void setupTest(JavaSamplerContext context){
        System.out.println("sample setup..");
        this.host = context.getParameter("host");    // 从JMeter中获取变量的值
        this.port = context.getParameter("port");
        this.name = context.getParameter("name");

        // 建立连接
        this.grpcClient = new GrpcClient(host, Integer.parseInt(port));
        super.setupTest(context);
    }

    @Override
    public SampleResult runTest(JavaSamplerContext context){
        SampleResult sampleResult = new SampleResult();
        sampleResult.sampleStart();    // JMeter开始统计响应时间标记

        try{
            // 调用被测对象
            HelloReply helloReply = this.grpcClient.sendReadRequestToService(grpcClient, name);
            
            sampleResult.sampleEnd();
            sampleResult.setSuccessful(true);
            sampleResult.setResponseData(helloReply.toString().getBytes());
            sampleResult.setResponseMessage("Success");
            sampleResult.setResponseCodeOK();    // 取样器结果的响应状态码:200
        }catch(StatusRuntimeException e){
            sampleResult.sampleEnd();    // JMeter结束统计响应时间标记
            sampleResult.setSuccessful(false);
            sampleResult.setResponseMessage("Exception: " + e);

            java.io.StringWriter stringWriter = new java.io.StringWriter();
            e.printStackTrace(new java.io.PrintWriter(stringWriter));
            sampleResult.setResponseData(stringWriter.toString().getBytes());
            sampleResult.setDataType(SampleResult.TEXT);
            sampleResult.setResponseCode("500");
        }

        return sampleResult;
    }

    // 测试结束时调用
    @Override
    public void teardownTest(JavaSamplerContext context){
        try{
            System.out.println("service shutdown...");
            grpcClient.shutdown();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        super.teardownTest(context);
    }

    // 自我调试
//    public static void main(String[] args){
//        HelloGrpcSampler helloGrpcSampler = new HelloGrpcSampler();
//        Arguments arguments = helloGrpcSampler.getDefaultParameters();
//        JavaSamplerContext context = new JavaSamplerContext(arguments);
//        helloGrpcSampler.setupTest(context);
//        helloGrpcSampler.runTest(context);
//        helloGrpcSampler.teardownTest(context);
//    }

}

2.打包

这里笔者直接用IDEA中的命令进行打包。选择工程右侧Maven-》Lifecycle-》package进行打包。

3.插件的使用

1)将打包好的jar包,放到JMeter安装目录的lib/ext下,重启JMeter;

2)创建线程组,添加Java Request,选择前面做好的类。(这里的图示为示意)

JMeter二次开发之gRPC插件开发(三)_第1张图片

遇到的问题:

1. 打好的jar包放到jmeter中,点击java request请求时报错,无法查看到界面,并且出现如下各种报错:

1)java.lang.NoSuchMethodError: io.grpc.netty.NettyChannelBuilder.usePlaintext

原因:pom.xml中缺少netty的包或者netty包的版本不对。这里删除了所有单独的netty包,引入了grpc-all包

2)java.lang.NoClassDefFoundError: org/apache/qpid/url/BindingURL

原因:a.尝试在pom.xml中引入qpid-client和qpid-common两个包,仍报错后采用b方法

b.缺少qpid-client和qpid-common的jar包,这两个包是JMeterPlugins_ExtrasLibs/lib中的包,将jar包放到lib/ext中

3)java.lang.NoClassDefFoundError: org/springwork/jms...

原因:缺少spring-core和spring-jms的jar包,这两个包是JMeterPlugins_ExtrasLibs/lib中的包,将jar包放到lib/ext中

2. 在maven工程中去掉不必要的jar包:参考 https://www.jianshu.com/p/ed14399bd3d7

3. maven工程出现警告,没有配置好slf4j:slf4j包引入问题,需要引入slf4j-api.jar和slf4j-log4j12.jar包;若还缺少包或日志包不对,考虑引入log4j-core和log4j-api包

 

参考资料:

1. https://blog.csdn.net/jielysong117/article/details/75200119

2. https://www.iteye.com/blog/shift-alt-ctrl-2292862

3. https://www.jianshu.com/p/39c9eedba2c2

4. https://www.cnblogs.com/resentment/p/6792029.html

你可能感兴趣的:(测试工具,Java,性能测试)