【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: 填写
null
或NULL
或不填写值(空),不要填写""
(""
表示后端接收到双引号字符串并非空串),例如下图:
如果参数类型为复杂类型,例如Map
、List
、自定义JavaBean
- paramType: 必须填写,类完全名(含包名)
- paramValue: 必须是合法的json格式数据,需要掌握json知识,比如说集合、数组、map这些使用什么json格式体现,json格式在线验证可以使用工具bejson
- paramValue: 填写
null
或NULL
或不填写值(空),不要填写""
(""
表示后端接收到双引号字符串并非空串) - paramValue: 填写
{}
表示new一个空对象所有属性都为空 - 如果只想给对象中的某几个属性传值其余属性不传值,参考下面示例:
- 示例:对象中分别有三个属性
attr1
、attr2
、attr3
- paramValue: 填写
{"attr1":"val1"}
表示对象中attr1
属性值为val1
,其余两个属性attr2
和attr3
的值均为null
- paramValue: 填写
- 示例:对象中分别有三个属性
- 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"}
- paramType:
-
参数类型为:
io.github.ningyu.MyClassVo[]
- paramType:
io.github.ningyu.MyClassVo[]
- paramValue:
[{"name":"123456"}]
- paramType:
-
参数类型为:
io.github.ningyu.RequestVo<MyClassVo>
- paramType:
io.github.ningyu.RequestVo
- paramValue:
{"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}
- paramType:
-
参数类型为:
io.github.ningyu.RequestVo<MyClassVo>[]
- paramType:
io.github.ningyu.RequestVo[]
- paramValue:
[{"items": {"class": "io.github.ningyu.MyClassVo","name": "123456"}}]
- paramType:
-
参数类型为:
java.util.List<MyClassVo>
- paramType:
java.util.List
- paramValue:
[{"class": "io.github.ningyu.MyClassVo","name":"123456"}]
- paramType:
-
参数类型为:
java.util.List<MyClassVo>[]
- paramType:
java.util.List[]
- paramValue:
[[{"class": "io.github.ningyu.MyClassVo","name":"123456"}]]
- paramType:
-
参数类型为:
java.util.Map<String, MyClassVo>
- paramType:
java.util.Map
- paramValue:
{"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}
- paramType:
-
参数类型为:
java.util.Map<String, MyClassVo>[]
- paramType:
java.util.Map[]
- paramValue:
[{"key":{"class": "io.github.ningyu.MyClassVo","name":"123456"}}]
- paramType:
调用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