如何在JMeter中断言每次都有随机顺序结果的JSON响应?
我使用JSON断言来断言JSON路径是否存在。假设我有一个JSON响应,它是一个“房间”数组,其中“包含”一个文件柜数组,就像下面的示例一样如何在JMeter中断言每次都有随机顺序结果的JSON响应?,jmeter,functional-testing,web-api-testing,blazemeter,Jmeter,Functional Testing,Web Api Testing,Blazemeter,我使用JSON断言来断言JSON路径是否存在。假设我有一个JSON响应,它是一个“房间”数组,其中“包含”一个文件柜数组,就像下面的示例一样 "rooms": [ { "cabinets": [ { "id":"HFXXXX", "locationid":null, "name":"HFXXXX", "ty
"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[*].Cabines[*].id
,并期望值为[“HFXXXX”、“HFYYYY”、“HFZZZZ”、“HFBBBB”]
这一点非常有效,只是有时返回的值的顺序不同,而不是[“HFXXXX”,“HFYYYY”,“HFZZZZ”]
,因此断言将失败。问题在于返回数组的顺序,而不是值本身
有没有一种方法可以在断言之前对响应的顺序进行排序并继续使用JSON断言?或者唯一的方法是提取我想要断言的值并在JSR223断言(groovy或javascript)中使用它?
如果是这样的话,你能给我举个例子,说明我如何在JSR223插件中做到这一点。我建议使用一个专用的库,例如,这样你就不必重新发明轮子,可以在一行代码中比较两个JSON对象
${expected}
JMeter变量的内容、元素的顺序、新行的存在、格式不重要,它只比较键和值
在不匹配的情况下,您将收到错误消息,说明作为断言结果,完整的调试输出将在(启动JMeter的控制台)中可用json数组的顺序保持不变。如果您的测试因顺序更改而失败,则可能存在错误。订单将由您调用的后端定义。如果要对json数组进行排序,则会破坏响应,而测试不会真正进行测试anything@pandaadb-为True,顺序由我调用的后端定义。在上面的例子中,我试图使问题简单化。但在某些情况下,如果您有多个房间,例如有多个文件柜的房间,出于多种原因,它们可能会以不同的顺序返回。如果两个调用以不同的顺序返回相同的结果集,则您的后端肯定存在问题。数组中的Json应该始终保持后端给定的顺序。我的意思是,在我看来,你的失败就像后端的合法失败。为什么同一个调用会返回两个不同的房间顺序?我明白你的意思,但是,如果你执行编辑来更改一些值,我会得到不同的结果,那么返回的JSON结果可能会有不同的顺序。你是说即使在更新或更改某些值之后,JSON仍然应该保持其顺序吗?如果你进行的更新更改了顺序,那么这将反映在调用中,是的。但我认为,通过诉诸价值观来断言不是一个好的测试?因为你没有断言你的更新已经改变了顺序。因此,我认为如果您期望订单更改,那么您也需要声明订单更改?这里有一些关于json数组顺序的更多信息:非常感谢,我将尝试一下。
def expected = vars.get('expected')
def actual = prev.getResponseDataAsString()
org.skyscreamer.jsonassert.JSONAssert.assertEquals(expected, actual, false)