根据需求,产品部分功能采用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相关接口测试,而且保证其他测试人员无需写代码便可进行测试。

基于Jmeter的thrift-RPC接口测试的更多相关文章

  1. 性能工具之Jmeter压测Thrift RPC服务

    概述 Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...

  2. 基于jmeter,jenkins,ANT接口,性能测试框架

    背景 公司计划推接口和性能测试,搭建这个性能测试框架框架是希望能够让每个人(开发人员.测试人员)都能快速的进行性能,接口测试,而不需要关注性能测试环境搭建过程.因为,往往配置一个性能环境可能需要很长的 ...

  3. 基于Jmeter和Testlink的自动化测试框架研究与实施

    关于测试框架搭建的详细过程,会在另一篇文章中详细介绍:http://www.cnblogs.com/leeboke/p/6145977.html 摘 要 目前基于Jmeter的接口自动化测试框架,大多 ...

  4. RPC接口测试(三) RPC接口测试

    RPC接口测试 接口测试主要分HTTP和RPC两类,RPC类型里面以Dubbo较为知名.互联网微服务架构,两种接口都需要做接口测试的,不管是业务测试还是回归测试: Dubbo:Java栈的互联网公司比 ...

  5. 使用Jmeter测试thrift接口

    术语描述 jmeter:一款性能压力测试工具,支持多种协议,java .http 等,但是不支持thrift thrift:跨语言的RPC调用框架,提供编译器,可以将thrift接口生成不同语言的接口 ...

  6. 基于Jmeter+maven+Jenkins构建性能自动化测试平台

      一.目的: 为能够将相关系统性能测试做为常规化测试任务执行,且可自动无人值守定时执行并输出性能测试结果报告及统计数据,因此基于Jmeter+maven+Jenkins构建了一套性能自动化测试平台 ...

  7. 基于Rabbit实现的RPC

    最近在学习项目中的通用技术,其中一个是在项目中会经常使用的基于RabbitMQ实现的RPC.这里一共有三个点要学习,分别是:RPC是什么?RabbitMQ是什么?如何使用RabbitMQ实现RPC.奔 ...

  8. 基于jmeter的性能测试平台(二) 一个构想

    之前基于jmeter搭好了分布式测试平台,但是感觉还是很粗糙,打算给它穿点衣服. 整个架构差不多就像下面这个图. (1)基于python django做一个web页面,友好地管理测试过程 (2)con ...

  9. 转:基于Jmeter的MQTT测试插件

    基于Jmeter的MQTT测试插件-上 1. Jmeter插件简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.下载 用于对软件做压力测试,它最初被设计用于Web应用 ...

随机推荐

  1. proxy ubunta

    /etc/environment : Is the correct place to specify system-wide environment variables that should be ...

  2. .net core WebAPI 初探及连接MySQL

    1. 前言 笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 连接数据库.读取数据库方面讲得不够细致明了.写此文的目的,即实现 .net core WebAPI ...

  3. 以iphone作为热点时ios程序中的UDP广播地址

    iPhone 开启热点后,会启用一个 172.20.10.0/28 的子网, 也就是最多15个ip地址,自己的地址是172.20.10.1, 广播地址是 172.20.10.15 ,不是传统的255. ...

  4. 21 re正则模块 垃圾回收机制

    垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 引用计数 引用计数:用来记录值的内存地址被记录的次数的:当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收 每一次对值地址的引用都可以使该值 ...

  5. HTML5 移动端Meta设置

    1.   强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏幕放大浏览. <meta name="viewport" content= ...

  6. 马拉车算法——求回文串起点hdu3294

    #include<bits/stdc++.h> using namespace std; #define maxn 500005 int p[maxn]; ]; int start; in ...

  7. Eureka restTemplate访问超时

    错误代码 I/O error on GET request for "http://sushibase/v1/Publich/authorize": Connection time ...

  8. !!!css如何让img图片居中?css的display属性实现图片居中(代码实例)

    在我们开发前端页面的时候,为了让页面效果美观,会让图片呈现居中效果.那么css怎么让img图片居中显示呢?本篇文章给大家带来css如何让img图片居中?css的display属性实现图片居中(代码实例 ...

  9. dataGridView笔记

    最近用dataGridView比较多,先把代码备份在这里,有时间系统总结一下 using FindId.DAL; using FindId.Model; using System; using Sys ...

  10. RN和IOS原生端交互

    1.RCTBridgeModule #import <Foundation/Foundation.h> #import "RCTBridgeModule.h" #imp ...