【本博客原创经验文章,转载请注明出处!】
前篇:用Jmeter的Dubbo sampler测试Dubbo接口的基础知识:https://blog.csdn.net/cyjs1988/article/details/84258046,这里不再赘述。
我们平时在用Jmeter的Dubbo Sampler取样器 测试Dubbo接口的时候,会遇到这样的情况,如果请求参数会遇到泛型,甚至是泛型里还有List集合,那么请求参数该怎么写呢?
先上被测的Dubbo接口的源代码:(用jd-gui.exe【java反编译工具Java Decompiler】查看)
【测试任务】
测试下图接口BalanceService中的抽象方法empBalanceBatch方法:
开发人员在开发dubbo接口的抽象方法之时,有这样的情况在里面:(如上图)请求参数paramBalanceRequestDTO 对应的请求参数类型是:BalanceRequestDTO>
那么,这个 请求参数类型 和 请求参数 怎么写?
首先,看源代码BalanceRequestDTO>的BalanceRequestDTO,如上图,点进去,我们可以看到:
BalanceRequestDTO有两个成员变量,一个是balanceAuthDTO,另一个是balanceData。
那么请求参数可以写成,初步大致的雏形如下:
{
"balanceData": xxxxxxxxxxx,
"balanceAuthDTO": xxxxxx
}
那再瞧一瞧,这两个成员变量balanceAuthDTO、balanceData,所对应的类型分别是:BalanceAuthDTO、S
对于这个S,我暂时不知道是什么鬼东西,这个时候我先看BalanceAuthDTO这个类型:
点击BalanceAuthDTO进去,一看,原来BalanceAuthDTO有两个成员变量,一个是sourID,另一个是sign ,如下图所示:
此时,大致的请求参数,可以写成这样,如下所示:
{
"balanceData": xxxxxxxxx,
"balanceAuthDTO": {
"sourId": "1060",
"sign": "3AiT7zwhRwUwoRnx"
}
}
那balanceAuthDTO的值写好了之后,balanceData这个怎么办,它的类型仅仅是个未知的S,懵逼中……
其实,不用这么懵逼,你看一看S上面是什么?!
原来这个S早就有恃无恐了,有家庭背景、有后台的S,原来这个S是BalanceRequestDTO的S,那再往上追溯,又回到刚开始的接口和抽象方法的代码界面,结果就是:S就是BalanceRequestDTO>当中的List
那么,这个时候,我们可以顺利的点击List
原来,曾经定义为private S balanceData 的 balanceData,就是直接调用的是 EmpBalanceRecordDTO 的所有成员变量,作为一个json参数形式,作为请求参数传过去,现在就可以写成下面这个样子:
{
"balanceData": {
"tradeMoney": 56.66,
"operaType": "NORMAL",
"balaTypeId": 3615,
"balanceCode": "DTJS_002",
"originalDate": 1552233600000,
"unicode": "1",
"remark": "备注",
"id": "DTJS_002",
"recSiteId": 1025270,
"paySiteId": 3005
},
"balanceAuthDTO": {
"sourId": "1060",
"sign": "3AiT7zwhRwUwoRnx"
}
}
那这样对吗?再仔细检查一下,如下图所示:
List
那就把上面那个雏形json改写成:
{
"balanceData": [{
"tradeMoney": 56.66,
"operaType": "NORMAL",
"balaTypeId": 3615,
"balanceCode": "DTJS_002",
"originalDate": 1552233600000,
"unicode": "1",
"remark": "备注",
"id": "DTJS_002",
"recSiteId": 1025270,
"paySiteId": 3005
}], → → → → → → //这里加个方括号[],表示是List集合(json上的数组)
"balanceAuthDTO": {
"sourId": "1060",
"sign": "3AiT7zwhRwUwoRnx"
}
}
那这个json请求参数的写法对吗?还是不对!jmeter请求参数需要对泛型参数还要做一次反射(不懂反射是啥?赶紧恶补java基础知识的“反射”一章节,其实就是对自己是谁,告知别人一下自己的身份)
那么,请求参数最终就可以写成:
{
"balanceData": [{
"tradeMoney": 56.66,
"operaType": "NORMAL",
"balaTypeId": 3615,
"balanceCode": "DTJS_002",
"originalDate": 1552233600000,
"unicode": "1",
"remark": "备注",
"id": "DTJS_002",
"recSiteId": 1025270,
"paySiteId": 3005,
"class": "com.xxx.financebalance.dto.request.SiteBalanceRecordDTO"
//注释:这个class的值,就是刚刚我们看到代码里balanceData的类型S,也就是BalanceRequestDTO的S,也就是接口抽象方法里的请求参数类型BalanceRequestDTO>的List的EmpBalanceRecordDTO,所以多加一行反射信息:"class": "com.xxx.financebalance.dto.request.SiteBalanceRecordDTO" 。
}],
"balanceAuthDTO": {
"sourId": "1060",
"sign": "3AiT7zwhRwUwoRnx",
"class": "com.xxx.financebalance.dto.request.BalanceAuthDTO",
//注释:这个class的值,就是刚刚我们看到代码里的balanceAuthDTO的类型BalanceAuthDTO,所以多加一行反射信息:"class": "com.xxx.financebalance.dto.request.BalanceAuthDTO" 。
}
}
最后,我们用jmeter的Dubbo Sampler插件,进行测试一下(我这里所用对应的dubbo sampler支持jar包版本,用的是:jmeter-plugins-dubbo-1.3.8-jar-with-dependencies.jar,下载地址:https://pan.baidu.com/s/1jjRskXCh7yOCR3uYAbNAyg 提取码: fcqt)
如上图所示,接口调通,可以正常介入dubbo接口测试,如果你在测公司的dubbo接口别的同事可以调通,你调不通,看如下解决办法:
【2019年7月15日更新:如果你的lib\ext目录下,有jmeter-plugins-dubbo-1.3.8-jar-with-dependencies.jar诸如此类带有-with-dependencies字样的,一定要保证你的lib目录下,不能有如下5个基础包文件:
dubbo-2.5.3.jar
javassist-3.15.0-GA.jar
zookeeper-3.4.6.jar
zkclient-0.1.jar
netty-3.7.0-Final.jar
如果有,请移出或删除,否则接口永远调不通!!!切记!!! 】