使用 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中用json提取器提取响应数据中的多个值

Jmeter入门13 后置处理器JSON Extractor提取json的多个值

Jmeter 后置处理器JSON Extractor 提取json的多个值

JMeter之检查点(JSON断言)

jmeter 响应断言 不等于怎么写

jmeter beanshell Typed variable declaration : Object constructor错误