使用 JMeter 比较多个 JSON 响应
Posted
技术标签:
【中文标题】使用 JMeter 比较多个 JSON 响应【英文标题】:Compare multiple JSON responses with JMeter 【发布时间】:2015-02-26 19:04:31 【问题描述】:我需要说服 JMeter 对 JSON Web 服务请求响应进行 A/B 比较。我面临的挑战是响应可能具有相同的内容,但仍然不一样。
示例响应1:
[
"id": 1,
"name": "Canada",
"provinceNames": [
"Alberta",
"British Columbia"
]
,
"id": 2,
"name": "United States",
"provinceNames": [
"California",
"New York"
]
]
此响应是完全排序的“id”、“name”、“provinceNames”,在省内,“Alberta”、“British Columbia”和“California”、“New York”分别是也排序了。
示例响应2:
[
"name": "United States",
"provinceNames": [
"New York",
"California"
],
"id": 2
,
"name": "Canada",
"provinceNames": [
"British Columbia",
"Alberta"
],
"id": 1
]
此响应未排序。
这两个响应的内容相等,即使它们不一样。
以前有没有人遇到过这个问题并有解决方案?
我的方法是对响应进行后处理、对 JSON 对象进行排序并进行比较。到目前为止,我在 javascript 和 beanshell 中都想不出办法。我找到了一些类似问题的解决方案,但他们使用 JQuery 或 JMeter 中不可用的其他库。
首先,我想知道我是否在这种方法上走上了正确的道路,还是有人想出了一个更优雅的解决方案?
其次,如果这种方法没问题,是否有人在我可以在 JMeter 中使用的 javascript / beanshell 中有任何代码 sn-ps?
感谢您的所有帮助:)
【问题讨论】:
尝试在javascript deep compare data structures
上搜索
【参考方案1】:
有多种选择:
-
使用JSONPath Extractor 提取名称、省名等单个值,将它们存储到 JMeter 变量中并比较变量
同样使用JSON Path Assertion
使用Beanshell PostProcessor 将 JSON 响应转换为已排序的字符串并比较字符串。执行此操作的示例 Beanshell 代码如下所示:
String response = prev.getResponseDataAsString();
char [] responseCharArray = response.toCharArray();
Arrays.sort(responseCharArray);
response = Arrays.toString(responseCharArray);
prev.setResponseData(response.getBytes());
其中prev
是SampleResult 类的实例,其中包含父采样器结果详细信息。
以上代码将覆盖原始采样器响应,原始响应拆分为字符,使用Dual-Pivot Quicksort 排序并再次放回。
如果两种情况下的数据相同,则结果字符串实体也将相同。
要了解有关使用脚本增强测试的更多信息,请参阅How to use BeanShell: JMeter's favorite built-in component 指南。
【讨论】:
您好,感谢您的回复。我知道有很多关于这个问题的文章,但到目前为止还没有一篇能真正解决这个问题。如果您想比较特定值但不适合整个 JSON 响应比较,JSONPath Extractor 非常好。我不完全确定第三种解决方案,但看起来您将整个 JSON 作为一个巨大的字符串并对字符进行排序。这意味着"id":"hello"
将等于"hello":"id"
,而它们是非常不同的 JSON 响应。
responses might have the same contents but still not be the same.
。我的回答解决了你的问题。如果您还有其他问题 - 请随时在单独的线程中提问。以上是关于使用 JMeter 比较多个 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章
Jmeter入门13 后置处理器JSON Extractor提取json的多个值
Jmeter 后置处理器JSON Extractor 提取json的多个值
jmeter beanshell Typed variable declaration : Object constructor错误