基於Jmeter的thrift-RPC接口測試


根據需求,產品部分功能采用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相關接口測試,而且保證其他測試人員無需寫代碼便可進行測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM