TarsJMeterJMeter 测试插件

联合创作 · 2023-10-01 16:45

TarsJMeter是一款针对Tars协议进行私有化定制的JMeter测试插件,其目的是为了帮助用户解决Tars服务的性能评估与测试。以下场景可能使用到TarsJMeter:

  1. 开发了一组Tars服务,需要对这组RPC服务,进行简单自测时,可以使用JMeter搭载该插件,基于Tup 收发进行无需编码的接口单测;
  2. 需要对Tars接口进行性能评估、压力测试、稳定性测试时,可以使用JMeter搭载该插件。

TarsJMeter特点如下:

  1. 易用性强,只需对JMeter有一定的了解,即可采用TarsJMeter简洁的UI实现测试用例开发。
  2. 支持分布式,通过JMeter的集群模式,可实现Tars服务的负载测试。目前我们有使用集群模式轻松触顶测试过吞吐量达50000TPS的Tars单服务。
  3. 可测复杂场景,TarsJMeter结合JMeter丰富的 Logic Controller, Pre Processors, Post Processors,Timer,Config Element等组件,可丰富测试场景,使得测试用例不再是单一的接口测试。
  4. 数据可监控,JMeter可把Tars服务的测试数据上报至InfluxDB(时序数据库),InfluxDB可与第三方监控平台对接,实现对数据流量的实时监控。

插件使用json来定义目标Tars方法的入参或返回值数据,这样可以做到Tars结构化数据能够更好的可视化。插件集成的Tars2JsonMojo工具,提供从Tars Struct到 Json数据的快速转换能力。json可视化数据支持类型列表如下:

tars //tars结构化数据 map //map数据 vector //复杂数据数组 boolean // 8种基本类型数据 byte int short long float double string boolean[] // 8种基本类型数据的数组 byte[] int[] short[] long[] float[] double[] string[]

数据定义举例

基础类型及基础类型数组的定义:

  • string

    {
      "type" : "string",
      "value" : "this is a primitive type"
    }
  • int

    {
      "type" : "int",
      "value" : 100
    }
  • int[]

    {
      "type" : "int[]",
      "value" : [100 , 200 ]
    }

map<string,string>类型的定义:

{
  "type": "map",
  "value": [
    {
      "key": {
        "type": "string",
        "value": "map key",
        "tag": 0
      },
      "value": {
        "type": "string",
        "value": "map value",
        "tag": 1
      }
    }
  ],
  "tag": 0
}

vector类型的定义,除8大基本类型的数组以外,区分基本类型的vector和tars struct的vector是为了,在使用较常使用的基本类型vector时,json结构更为清晰简洁:

{
  "type": "vector",
  "value": [
    {
      "type": "tars",
      "value": "more detail tars struct {}",
      "tag": 0
    },
    {
      "type": "tars",
      "value": "more detail tars struct {}",
      "tag": 0
    }
  ],
  "tag": 0
}

tars混合结构示意,对于如下Tars Sturct和tars Interface的IDL定义文件:

module Tars2JsonExample
{
  enum EOpType
  {
    EOpType_None = 0,
    EOpType_SmsAuth = 1,
  };
  
  struct SubStruct
  {
    0 optional string sub;
  };
  
  struct TarsStructExample
  {
    0 optional vector<string> stringVec;
    1 optional long tryLoginTime = 0;
    2 optional EOpType enumTest;
    3 optional vector<map<string,SubStruct>> vectorMap;
    4 optional map<int, vector<byte> > mapCheck;
  };
  
  interface Tars2JsonExampleServant
  {
    int getTarsStruct(TarsStructExample resp);
  };
}; 

可以通过tars2json自动转化为:

{
  "stringVec": {
    "type": "string[]",
    "value": [ "" ],
    "tag": 0
  },
  "tryLoginTime": {
    "type": "long",
    "value": 0,
    "tag": 1
  },
  "enumTest": {
    "type": "int",
    "value": 0,
    "tag": 2
  },
  "vectorMap": {
    "type": "vector",
    "value": [
      {
        "type": "map",
        "value": [
          {
            "key": {
              "type": "string",
              "value": "",
              "tag": 0
            },
            "value": {
              "type": "tars",
              "value": {
                "sub": {
                  "type": "string",
                  "value": "",
                  "tag": 0
                }
              },
              "tag": 1
            }
          }
        ],
        "tag": 0
      }
    ],
    "tag": 3
  },
  "mapCheck": {
    "type": "map",
    "value": [
      {
        "key": {
          "type": "int",
          "value": 0,
          "tag": 0
        },
        "value": {
          "type": "byte[]",
          "value": [ 0 ],
          "tag": 1
        }
      }
    ],
    "tag": 4
  }
}

Tars2Json使用

在使用插件时,并不需要手工地编写json格式的tars数据,插件中集成的tars2json工具会自动识别您定义的tars接口文件,完成转换,只需:

  1. 选择接口参数或返回值类型;
  2. 如为tars,点击插件界面底部的tars2json button;
  3. 指定"目标Tars接口名称",如TarsStructExample
  4. 选择"目标Tars所在路径",可以是Tars文件所在的目录路径,也可以是Tars文件的文件路径;
  5. 点击button tars2json,即可获得对应Tars Struct 的json数据描述。
浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报