【jmeter】dubbo接口测试 ,规则类型和入参填写规范

 

 paramType和paramValue参数

 

 

 paramType:里面的参数类型,可以是对象,也可以是基本数据类型

1、如果是基本数据类型,paramValue里面是不需要填写class类名

2、如果参数类型是对象,那么paramValue里面需要填写对应的class类名:class": "com.midea.jr.shuffle.model.SupplyChainRuleInfoBO",

运行Jmeter时,响应数据中文乱码问题

修改jmeter.properties中的sampleresult.default.encoding,文件位置:JMETER_HOME\bin\

#sampleresult.default.encoding=ISO-8859-1
改为
sampleresult.default.encoding=UTF-8

When running Jmeter, the response data Chinese garbled problem

Modify sampleresult.default.encoding in jmeter.properties, file location: JMETER_HOME\bin\

#sampleresult.default.encoding=ISO-8859-1
Change to
sampleresult.default.encoding=UTF-8

空参使用案例

如果参数类型是基础类型或基础类型的包装类

  • paramType: 必须填写,基础类型名称 或 包装类完全名(含包名)
  • paramValue: 填写nullNULL或不填写值(空),不要填写 """"表示后端接收到双引号字符串并非空串),例如下图:

如果参数类型为复杂类型,例如MapList、自定义JavaBean

  • paramType: 必须填写,类完全名(含包名)
  • paramValue: 必须是合法的json格式数据,需要掌握json知识,比如说集合、数组、map这些使用什么json格式体现,json格式在线验证可以使用工具bejson
  • paramValue: 填写nullNULL或不填写值(空),不要填写 """"表示后端接收到双引号字符串并非空串)
  • paramValue: 填写{}表示new一个空对象所有属性都为空
  • 如果只想给对象中的某几个属性传值其余属性不传值,参考下面示例:
    • 示例:对象中分别有三个属性 attr1attr2attr3
      • paramValue: 填写{"attr1":"val1"} 表示对象中attr1属性值为val1,其余两个属性attr2attr3的值均为null
  • paramValue: 填写{"attr1":"null"}表示后端接收到非null参数对象,对象中attr1属性值是一个"null"字符串,并不是null引用
  • paramValue: 填写{"attr1":""}表示后端接收到非null参数对象,对象中attr1属性值是一个空字符串
  • paramValue: 填写{"attr1":}这是一个错误的json格式,表示后端接收到null引用
  • paramValue: 填写[]表示集合、数组类的参数

复杂参数使用案例

参数示例类

io.github.ningyu.MyClassVo

package io.github.ningyu;
import java.io.Serializable;
public class MyClassVo implements Serializable {
    private static final long serialVersionUID = 2833248590539596892L;
    private String name;
    public void setName(String name) {
        this.name= name;
    }
    public String getName() {
        return name;
    }
}

io.github.ningyu.RequestVo<T>

package io.github.ningyu;
import java.io.Serializable;
public class RequestVo<T> implements Serializable {
    private static final long serialVersionUID = -5111447619170259174L;
    private T items = null;
    public RequestVo(T items) {
        super();
        this.items = items;
    }
    public T getItems() {
        return items;
    }
    public void setItems(T items) {
        this.items = items;
    }
}

泛型参数示例

  • 参数类型为:io.github.ningyu.MyClassVo

    • paramType: io.github.ningyu.MyClassVo
    • paramValue: {"name":"123456"}
  • 参数类型为:io.github.ningyu.MyClassVo[]

    • paramType: io.github.ningyu.MyClassVo[]
    • paramValue: [{"name":"123456"}]
  • 参数类型为:io.github.ningyu.RequestVo<MyClassVo>

    • paramType: io.github.ningyu.RequestVo
    • paramValue: {"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}
  • 参数类型为:io.github.ningyu.RequestVo<MyClassVo>[]

    • paramType: io.github.ningyu.RequestVo[]
    • paramValue: [{"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}]
  • 参数类型为:java.util.List<MyClassVo>

    • paramType: java.util.List
    • paramValue: [{"class": "io.github.ningyu.MyClassVo","name":"123456"}]
  • 参数类型为:java.util.List<MyClassVo>[]

    • paramType: java.util.List[]
    • paramValue: [[{"class": "io.github.ningyu.MyClassVo","name":"123456"}]]
  • 参数类型为:java.util.Map<String, MyClassVo>

    • paramType: java.util.Map
    • paramValue: {"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}
  • 参数类型为:java.util.Map<String, MyClassVo>[]

    • paramType: java.util.Map[]
    • paramValue: [{"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}]

调用RPC报错:java.lang.RuntimeException: Failed to set pojo XXVO property timestamp value 2018-09-13 10:00:00(class java.lang.String), cause: argument type mismatch

问题描述

这个问题是我们反序列化的对象中使用了java.sql.timestamp类型,传入的json的值是“2018-09-13 10:32:00”,走泛化类型反序列化的时候出现错误。 而且还有个奇怪现象是使用jmeter-dubbo-plugin-1.2.x的版本是不会出现错误的,使用jmeter-dubbo-plugin-1.3.x的版本会出现错误。

问题分析

其实这个问题的原因是:1.2.x需要jmeter的classpath下引入业务api jar包,1.3.x走泛化类型不需要引用api jar包,所以在类型转换是不一样的处理逻辑。

解决方法

jmeter-dubbo-plugin在调用rpc之前会进行一次反序列化,反序列化的时候会优先找本地classpath下jar包中的类型,因此只需要将api-jar加入到jmeter的classpath即可,也就是说v1.3.x版本支持客户端无api-jar的调用,也支持客户端有api-jar的调用。 

调用RPC报错:No such extension com.alibaba.dubbo.common.serialize.Serialization by name kryo

请查看服务端使用的序列化类库是什么?插件只打包了默认序列化和fst,其余的序列化类库需要使用者手动将jar包放入JMETER_HOME/lib/ext

拿kryo举个例子,比如这个配置:

<dubbo:protocol name="dubbo" port="30001" serialization="kryo"/>

这个配置说明序列化用到了kryo,那么就要将kryo的jar包放入JMETER_HOME/lib/ext,jar包版本可以看服务端的依赖的版本

DUPLICATE_CONFIGCENTERCONFIG

重复的配置中心,这个问题是因为config center初始化后不允许修改并且只允许存在一个,我们在jmeter中反复修改config center中属性值后运行就会出现这个错误,由于目前ConfigCenterConfig对象无法销毁和重新刷新,因此只能重新打开jmeter,建议设置好配置中心的属性后试运行一下进行预热,如果要修改配置中心值需要重开jmeter后生效

MISS_INTERFACE

没有设置接口信息

RETRIES_ERROR

retries不是一个数字

TIMEOUT_ERROR

timeout不是一个数字

CONNECTIONS_ERROR

connections不是一个数字

GENERIC_SERVICE_IS_NULL

没有找到泛化接口,可能是group、version不匹配

MISS_METHOD

方法为空

MISS_ADDRESS

配置中心或注册中心地址为空

UNKNOWN_EXCEPTION

未知异常

RpcException

参考Dubbo的错误编码,http://dubbo.apache.org/docs/2.7.x/api/com/alibaba/dubbo/rpc/RpcException.html

引入地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/wiki/FAQ

posted on 2020-03-20 11:17  诚实的表达自己  阅读(4654)  评论(0编辑  收藏  举报