Jmeter实现RPC接口测试简洁化需求

2644 篇文章 26 订阅
2330 篇文章 14 订阅

根据需求,产品部分功能采用thrift-RPC协议进行接口的增、删、改、查,前期采用Junit对其进行测试,为了提高RPC接口测试的简洁化和后期的性能测试需求,打算通过Jmeter的java类测试实现。

前期准备

开发提供了IDL描述的Thrift文件:dataService.thrift,其中定义了相关接口函数及数据类型,如下:

enum VStatus {
    ON,
    OFF
}

struct VData {
    1: required string tablename;
    2: required string time;
    3: required string jsons;
    4: optional VStatus status;
}

struct VCondition {
    1: required string tablename;
    2: required i64 starttime;
    3: required i64 endtime;
}

service DataService {
    string write(1: VData data);
    string read(1: VCondition condition);
}

在本地部署thrift.exe并设置环境变量,之后在dataService.thrift所在的目录下执行:

thrift -r -gen java dataService.thrift              //备注:我这里是用java语言;

执行成功后在该目录下产生gen-java文件夹,打开该文件夹至api目录下,生成4个文件:DataService.java、VCondition.java、VData.java和VStatus.java。

基于Jmeter的jar代码编写

创建Maven项目,编辑pom.xml添加依赖,如下所示:

<dependencies>
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.11.0</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>   
       <dependency>
           <groupId>org.apache.logging.log4j</groupId>
           <artifactId>log4j-api</artifactId>
           <version>2.8.2</version>
       </dependency>
       <dependency>
           <groupId>org.apache.logging.log4j</groupId>
           <artifactId>log4j-core</artifactId>
           <version>2.8.2</version>
       </dependency>           

   </dependencies>

之后手动加载本地Jmeter版本目录\Jmeter_Home\lib\ext中的ApacheJMeter_core.jar和ApacheJMeter_java.jar作为外部依赖包(注:直接maven加载相关版本的依赖包执行时存在冲突)。

将之前生成的4个java文件导入项目,设置包名为:com.test.thrift.api,在项目包名下创建ReadRPC.java类,根据Jmeter中java类要求需要继承 AbstractJavaSamplerClient,代码如下:

package com.test.RPCTest;

import com.test.thrift.api.DataService;
import com.test.thrift.api.VCondition;

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;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

public class ReadRPC extends AbstractJavaSamplerClient{
    private TTransport tTransport;
    private DataService.Client dataService;
    private TProtocol tProtocol;
    private VCondition vCondition;

    @Override      
    public Arguments getDefaultParameters(){  //默认参数值,包括服务ip、端口、目标表、起止时间等
        Arguments arguments=new Arguments();
        arguments.addArgument("IP", "127.0.0.1");
        arguments.addArgument("Port", "8888");
        arguments.addArgument("TableName", "vle::test.trpc");
        arguments.addArgument("StartTime", "1539752449");
        arguments.addArgument("EndTime", "1539752449");
        return arguments;
    }
    
    @Override
    public void setupTest(JavaSamplerContext context) { //初始化参数,并通过TTransport模式TBinaryProtocol二进制协议与服务端建立连接
        // TODO Auto-generated method stub
        String ip=context.getParameter("IP");
        int port=context.getIntParameter("Port");
        String tableName=context.getParameter("TableName");
        long startTime=context.getLongParameter("StartTime");
        long endTime=context.getLongParameter("EndTime");
        tTransport=new TSocket(ip,port,30000);
        vCondition=new VCondition();
        try {
            tTransport.open();
            tProtocol=new tBinaryProtocol(tTransport);
            dataService=new DataService.Client(tProtocol);
            vCondition.setTablename(tableName);
            vCondition.setStarttime(startTime);
            vCondition.setEndtime(endTime);
        } catch (Exception e) {
            // TODO: handle exception
        }
        super.setupTest(context);
    }
    
    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        // TODO Auto-generated method stub
        SampleResult sampleResult = new SampleResult();
        sampleResult.setDataEncoding("utf8");
        sampleResult.sampleStart();
        try {
            String msg=dataService.read(tCondition);//执行读操作,返回响应结果信息到msg
            
            if(null==msg){//为空判断
                sampleResult.setSuccessful(false);
                sampleResult.setResponseMessage("响应结果为空!");
                sampleResult.setSampleLabel("RPC读取");
                sampleResult.setResponseOK();
                sampleResult.setResponseData("响应结果为空!");
                sampleResult.setDataType(SampleResult.TEXT);
                return sampleResult;
            }
            else {
                sampleResult.setSuccessful(true);
                sampleResult.setSampleLabel("RPC读取");
                sampleResult.setResponseOK();
                sampleResult.setResponseData(msg);
                System.out.println("msg="+msg);
                sampleResult.setDataType(SampleResult.TEXT);
                return sampleResult;
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            sampleResult.setSuccessful(false);
            e.printStackTrace();
        }
        finally{
            sampleResult.sampleEnd();
        }
        return sampleResult;
    }
    
    public void teardownTest(JavaSamplerContext context){
        tTransport.close();//关闭连接
        super.teardownTest(context);
    }

}

在main函数中调用ReadRPC相关函数,代码如下:

public static void main( String[] args )
{
    JmeterRPC jrpc=new JmeterRPC();
    jrpc.read();

}

public void read(){
    Arguments arguments=new Arguments();
    arguments.addArgument("IP", "127.0.0.1");
    arguments.addArgument("Port", "8888");
    arguments.addArgument("TableName", "vle::test.trpc");
    arguments.addArgument("StartTime", "1539752449");
    arguments.addArgument("EndTime", "1539752449");
    JavaSamplerContext context=new JavaSamplerContext(arguments);
    ReadRPC rpc=new ReadRPC();
    rpc.setupTest(context);
    rpc.runTest(context);
    rpc.teardownTest(context);
}

运行程序输出msg=[{“…相关响应数据…”}]。调试成功后保存后,选中项目右键“Export”->“Java”->“Runnable JAR file”,点击“Next”,设置输出路径和依赖库,如下图所示:

图片

备注:选择第一种方式将依赖包打在里面。

将打好的RPC.jar包拷贝到JMeter_Home\lib\ext下,启动jmeter控制台打印该jar信息,如下图所示:

图片

启动完成后添加Java请求,显示读取类名,配置相关参数,如下图所示:

图片

执行结果如下:

在这里插入图片描述

之后便可以通过该jar进行RPC相关接口测试,而且保证其他测试人员无需写代码便可进行测试。


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JMeter是一个强大的压力测试工具,它可以用于测试各种目标,包括HTTP、FTP、SOAP/XML-RPC、JDBC等。您可以按照以下步骤来使用JMeter进行测试: 1. 首先,您需要下载并安装JMeter。您可以从Apache Jakarta项目的官方网站(http://jakarta.apache.org/jmeter/)上下载最新版本的JMeter。 2. 安装完成后,您可以启动JMeter。在启动界面中,您可以创建一个新的测试计划。测试计划是一个包含所有测试相关信息的容器。 3. 在测试计划中,您可以添加线程组。线程组用于模拟用户并发访问目标。您可以设置线程数、循环次数、启动延迟等参数。 4. 接下来,您可以添加Sampler。Sampler用于发送请求给目标,例如HTTP请求、FTP请求、JDBC请求等。您可以设置请求的URL、方法、参数等。 5. 您还可以添加配置元件,用于设置全局参数、Cookies、HTTP头等。 6. 如果需要进行断言或验证,您可以添加断言元件。断言元件用于验证响应结果是否符合预期。您可以添加各种类型的断言,例如响应代码、响应内容等。 7. 最后,您可以添加监听器来收集测试结果。监听器可以将结果输出到报告、图表或日志文件中。您可以选择适合您需求的监听器,并设置相应的输出格式。 JMeter还支持分布式测试,可以将负载分散到多个机器上进行测试。这样可以模拟更大规模的用户并发访问。您可以参考JMeter的官方文档或云社区中的相关文章,详细了解如何配置和使用分布式测试。 总结来说,使用JMeter进行测试的基本步骤包括:创建测试计划、添加线程组、添加Sampler、添加配置元件、添加断言元件、添加监听器,并根据需求进行配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值