如何在JMeter中断言每次都有随机顺序结果的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

我使用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[*].Cabines[*].id
,并期望值为
[“HFXXXX”、“HFYYYY”、“HFZZZZ”、“HFBBBB”]

这一点非常有效,只是有时返回的值的顺序不同,而不是
[“HFXXXX”,“HFYYYY”,“HFZZZZ”]
,因此断言将失败。问题在于返回数组的顺序,而不是值本身

有没有一种方法可以在断言之前对响应的顺序进行排序并继续使用JSON断言?或者唯一的方法是提取我想要断言的值并在JSR223断言(groovy或javascript)中使用它?
如果是这样的话,你能给我举个例子,说明我如何在JSR223插件中做到这一点。

我建议使用一个专用的库,例如,这样你就不必重新发明轮子,可以在一行代码中比较两个JSON对象

  • 下载并把它放在某个地方
  • 下载合适版本的库,并将其放入JMeter类路径。如果您不确定什么是“JMeter类路径”,只需将.jars放到JMeter安装的“lib”文件夹中
  • 重新启动JMeter,以便它能够加载新库
  • 作为返回上述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)