将多个JSON响应与JMeter进行比较

时间:2015-02-26 19:04:31

标签: javascript json jmeter beanshell

我需要说服JMeter对JSON Web服务请求响应进行A / B比较。我面临的挑战是答案可能具有相同的内容,但仍然不一样。

示例response1:

[ { "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中没有的其他库。

首先,我想知道我是否采用这种方法走上正轨,还是有人想出更优雅的解决方案?

其次,如果这种方法没问题,是否有人在javascript / beanshell中有任何代码片段我可以在JMeter中使用?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

有几种选择:

  1. 使用JSONPath Extractor提取单个值,例如name,provinceNames等,将它们存储到JMeter变量并比较变量
  2. 使用JSON Path Assertion作为相同的
  3. 使用Beanshell PostProcessor将JSON响应转换为已排序的字符串并比较字符串。示例Beanshell代码将如下所示:

    String response = prev.getResponseDataAsString();
    char [] responseCharArray = response.toCharArray();
    Arrays.sort(responseCharArray);
    response = Arrays.toString(responseCharArray);
    prev.setResponseData(response.getBytes()); 
    
  4. 其中prev是保存父样本结果详细信息的SampleResult类的实例。

    以上代码将覆盖原始采样器响应,原始响应拆分为字符,使用Dual-Pivot Quicksort排序并再次放回。

    如果两种情况下的数据相同,则结果字符串实体也将相同。

    要了解有关使用脚本增强测试的详细信息,请参阅How to use BeanShell: JMeter's favorite built-in component指南。