如何在JMeter中每次断言具有随机顺序结果的JSON响应?

时间:2018-11-13 16:50:43

标签: jmeter functional-testing web-api-testing blazemeter

我正在使用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插件中进行操作的示例。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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