通过值验证jm​​eter中的整个json响应或对Json进行排序

时间:2016-01-07 11:35:11

标签: json jmeter

我没有经常使用JMeter,而且我遇到了非常具体的问题。

我的REST响应总是"相同",但由于各种原因,节点的顺序不同。同样,由于敏感数据,我无法在此处完整响应,但让我们使用这些虚拟数据:

第一次回复可能是:

{
  "properties":{
  "prop1":false,
  "prop2":false,
  "prop3":165,
  "prop4":"Audi",
  "prop5":true,
  "prop6":true,
  "prop7":false,
  "prop8":"1",
  "prop9":"2.0",
  "prop10":0

  }
}

然后其他时间可能是这样的:

{
  "properties":{
  "prop2":false,
  "prop1":false,
  "prop10":0,
  "prop3":165,
  "prop7":false,
  "prop5":true,
  "prop6":true,
  "prop8":"1",
  "prop9":"2.0",
  "prop4":"Audi"

  }
}

正如您所看到的,它自己的内容是相同的,但它不是节点的顺序。我有160多个节点和数千个可能的响应命令。

是否有一种简单的方法来比较两个比较匹配键值的JSON响应,或者至少对响应进行排序,然后将其与断言模式中的排序值进行比较?

我没有使用任何插件,只是基本的Apache JMeter。

由于

3 个答案:

答案 0 :(得分:0)

你很可能必须使用JSR223 Assertion和Groovy来做到这一点。

请注意,如果您了解Python,则可以考虑使用Jython + JSR223。

答案 1 :(得分:0)

我已经使用Jython检查过,您需要下载Jython Library并保存到您的jmeter lib目录。

我已经使用Sampler1和Sampler2检查了2个JSON,在Sampler1上我添加了一个带有此代码的BeanShell PostProcessor:

vars.put("jsonSampler1",prev.getResponseDataAsString());

在Sampler2上我添加了一个BSF Assertion,指定jython作为语言并使用以下代码:

import json

jsonSampler1 = vars.get("jsonSampler1")
jsonSampler2 = prev.getResponseDataAsString()

objectSampler1 = json.loads(jsonSampler1)
objectSampler2 = json.loads(jsonSampler2)

if ( objectSampler1 != objectSampler2 ):
    AssertionResult.setFailure(True)
    AssertionResult.setFailureMessage("JSON data didn't match")

Yoy可以在this GistHub

中找到整个jmx

答案 2 :(得分:0)

我只想设置10个jp @ gc - JSON Path Assertions。用于计算JSON路径格式的文档是here,您可以测试它的工作方式here

对于你的例子你会断言(Add> Assertion> jp @ gc - JSON Path Assertions),然后测试prop 1 put:

$.properties.prop1 
在JSON路径字段中,单击“对预期值进行验证”复选框,然后单击

false 

在预期值字段中。对其他9重复这些步骤,将路径的最后部分更改为每个键,并将预期值返回到期望值字段中。

此提取器是jmeter add on found here