我正在使用JSON断言来断言是否存在JSON路径。假设我有一个“房间”数组的JSON响应,它“包含”一个橱柜数组,就像下面的示例
"rooms":
[
{
"cabinets":
[
{
"id":"HFXXXX",
"locationid":null,
"name":"HFXXXX",
"type":"Hosp"
},
{
"id":"HFYYYY",
"locationid":null,
"name":"HFYYYY",
"type":"Hosp"
},
{
"id":"HFZZZZ",
"locationid":null,
"name":"HFZZZZ",
"type":"Hosp"
}
],
"hasMap":false,
"id":"2",
"map":
{
"h":null,
"w":null,
"x":null,
"y":null
},
"name":"Fantastic Room#3"
}
],
[
{ "cabinets":
[
{
"id":"HFBBBB",
"locationid":null,
"name":"HFBBBB",
"type":"Hosp"
}
],
"hasMap":false,
"id":"3",
"map":
{
"h":null,
"w":null,
"x":null,
"y":null
},
"name":"BallRoom #4"
}
]
我想确保所有文件柜的'id'正确,因此我将JSON路径定义为rooms[*].cabinets[*].id
,并期望该值是["HFXXXX","HFYYYY","HFZZZZ","HFBBBB"]
这很好用,除了有时值以不同的顺序返回["HFBBBB", "HFXXX","HFYYYY","HFZZZZ"]
而不是["HFXXXX","HFYYYY","HFZZZZ","HFBBBB"]
,因此断言将失败。问题在于返回数组的顺序,而不是值本身。
是否有一种方法可以在声明之前对响应的顺序进行排序,并继续使用JSON断言?或做到这一点的唯一方法是提取我要声明的值,并在JSR223断言(常规或javascript)中使用它? 如果是这样,您可以向我展示一个如何在JSR223插件中进行操作的示例。
答案 0 :(得分:0)
我建议使用专用的库,例如JSONAssert,这样您就不必重新发明轮子了,并且可以在一行代码中比较2个JSON对象
jsonassert-x.x.x.jar
并将其放置到JMeter Classpath 将以下代码放入“脚本”区域:
def expected = vars.get('expected')
def actual = prev.getResponseDataAsString()
org.skyscreamer.jsonassert.JSONAssert.assertEquals(expected, actual, false)
它将比较父采样器的响应与${expected}
JMeter变量的内容,元素的顺序,新行的存在,格式无关紧要,它仅比较键和值
如果不匹配,您将收到一条错误消息,指出作为断言结果和完整的调试输出将在STDOUT(从中启动JMeter的控制台)中可用