Как подтвердить ответ JSON, который каждый раз дает результаты в случайном порядке в JMeter?

Я использую JSON Assertion, чтобы утверждать, существует ли путь 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"
    }
]

Я хочу убедиться, что идентификаторы всех шкафов верны, поэтому я определяю путь JSON как rooms[*].cabinets[*].id и ожидаю, что значение будет ["HFXXXX","HFYYYY","HFZZZZ","HFBBBB"]

Это работает отлично, за исключением того, что иногда значения возвращаются в другом порядке["HFBBBB", "HFXXX","HFYYYY","HFZZZZ"] вместо ["HFXXXX","HFYYYY","HFZZZZ","HFBBBB"], поэтому утверждение не будет выполнено. Проблема заключается в порядке возвращаемого массива, а не в самих значениях.

Есть ли способ отсортировать порядок ответа перед утверждением и продолжать использовать утверждение JSON? или единственный способ сделать это - извлечь значение, которое я хочу подтвердить, и использовать его в утверждении JSR223 (groovy или javascript)? если это так, не могли бы вы показать мне пример того, как я мог бы сделать это в плагине JSR223.


person Ali Mahdi    schedule 13.11.2018    source источник
comment
Порядок массивов json сохраняется. Если ваши тесты не пройдут из-за изменения порядка, скорее всего, это ошибка. Порядок будет определяться вызываемым сервером. Если бы вам пришлось отсортировать свой json-массив, вы бы сломали ответ, и ваш тест действительно ничего не проверил бы.   -  person pandaadb    schedule 13.11.2018
comment
@pandaadb - правда, порядок определяется вызываемым мной бэкендом. В приведенном выше примере я попытался упростить задачу. Но в некоторых случаях, если у вас есть несколько комнат, например, с несколькими шкафами, они могут возвращаться в другом порядке по многим причинам.   -  person Ali Mahdi    schedule 14.11.2018
comment
Если два вызова возвращают один и тот же набор результатов в разном порядке, значит, проблема в вашем бэкэнде. Json в массивах всегда должен поддерживать порядок, заданный вашим сервером. Я имею в виду, что ваши неудачи для меня выглядят как законные неудачи на сервере. Почему один и тот же вызов может возвращать номера двух разных порядков?   -  person pandaadb    schedule 14.11.2018
comment
Я понимаю вашу точку зрения, однако я получаю разные результаты, если вы выполняете редактирование, которое позволяет изменить некоторые значения, тогда возвращенные результаты JSON могут быть в другом порядке. Вы хотите сказать, что даже после обновления или изменения некоторых значений JSON должен сохранять свой порядок?   -  person Ali Mahdi    schedule 14.11.2018
comment
Если вы делаете обновление, которое изменяет порядок, это будет отражено в вызове, да. Но тогда, я думаю, утверждение, прибегая к значениям, не будет хорошей проверкой? Поскольку в этом случае вы не утверждаете, что ваше обновление вообще изменило порядок. ТАК, я думаю, если вы ожидаете изменения порядка, вам также нужно подтвердить изменение порядка? Здесь есть дополнительная информация о порядке массивов json: stackoverflow.com/questions/7214293/   -  person pandaadb    schedule 15.11.2018


Ответы (1)


Я бы порекомендовал использовать специальную библиотеку, например JSONAssert, так вам не придется изобретать велосипед и может сравнивать 2 объекта JSON в одной строке кода

  1. Загрузите jsonassert-x.x.x.jar и поместите его где-нибудь в Путь к классам JMeter
  2. Загрузите подходящую версию библиотеки JSON в Java и также поместите ее в путь к классам JMeter. Если вы не уверены в том, что такое «JMeter Classpath», просто перетащите .jars в папку «lib» вашей установки JMeter.
  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 Variable, порядок элементов, наличие новых строк, форматирование не имеет значения, он сравнивает только ключи и значения

    В случае несоответствия вы получите сообщение об ошибке, в котором будет указано, что результат утверждения и полный вывод отладки будут доступны в STDOUT (консоль, с которой вы запустили JMeter)

person Dmitri T    schedule 14.11.2018
comment
Большое спасибо, я попробую. - person Ali Mahdi; 14.11.2018