【Jmeter测Dubbo接口(2)】用Jmeter的Dubbo Sampler测试时,请求参数类型含有泛型和List或HashMap集合数组 的解决办法【图解剖析】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/cyjs1988/article/details/95968182

【本博客原创经验文章,转载请注明出处!】

前篇:用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<List<EmpBalanceRecordDTO>>

那么,这个 请求参数类型 和 请求参数 怎么写?

首先,看源代码BalanceRequestDTO<List<EmpBalanceRecordDTO>>的BalanceRequestDTO,如上图,点进去,我们可以看到:

扫描二维码关注公众号,回复: 7652529 查看本文章

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,那再往上追溯,又回到刚开始的接口和抽象方法的代码界面,结果就是:S就是BalanceRequestDTO<List<EmpBalanceRecordDTO>>当中的List<EmpBalanceRecordDTO>,如下图所示:

那么,这个时候,我们可以顺利的点击List<EmpBalanceRecordDTO>的EmpBalanceRecordDTO进去看看,如下所示:

原来,曾经定义为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<EmpBalanceRecordDTO>是EmpBalanceRecordDTO的一个List集合,写成请求参数的json形式,必须是以数组形式存在。

那就把上面那个雏形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>的S,也就是接口抽象方法里的请求参数类型BalanceRequestDTO<List<EmpBalanceRecordDTO>>的List<EmpBalanceRecordDTO>的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

如果有,请移出或删除,否则接口永远调不通!!!切记!!!   】

 

对了,如果请求参数是HashMap<String, Object>(说明:Object如果是DTO实体类的话),那么请求参数就可以写成:

{"param1": {"key1":"value1"} }

如果对数据类型的引用,想知道更多,请查看:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/wiki/ParameterComparisonTable

猜你喜欢

转载自blog.csdn.net/cyjs1988/article/details/95968182