0

我正在使用 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 断言(groovy 或 javascript)中使用它?如果是这种情况,您能否向我展示一个如何在 JSR223 插件中执行此操作的示例。

4

1 回答 1

1

我建议使用专用库,例如​​ JSONAssert,这样您就不必重新发明轮子,并且可以在一行代码中比较 2 个 JSON 对象

  1. 下载jsonassert-x.x.x.jar并将其放在JMeter Classpath的某个位置
  2. 在 Java 库中下载合适版本的JSON并将其放入 JMeter Classpath 中。如果您不确定什么是“JMeter Classpath”,只需将 .jars 放到 JMeter 安装的“lib”文件夹中
  3. 重新启动 JMeter,以便它能够加载新的库
  4. 添加JSR223 断言作为返回上述 JSON 的请求的子项
  5. 将以下代码放入“脚本”区域:

    def expected = vars.get('expected')
    def actual = prev.getResponseDataAsString()
    
    org.skyscreamer.jsonassert.JSONAssert.assertEquals(expected, actual, false)
    

    它将父采样器的响应与${expected}JMeter 变量的内容、元素的顺序、新行的存在、格式无关,它只比较键和值

    如果不匹配,您将收到错误消息,指出作为断言结果和完整的调试输出将在STDOUT中可用(您启动 JMeter 的控制台)

于 2018-11-14T08:08:33.177 回答