Как утверждать ответ JSON, который приводит к случайному порядку каждый раз в JMeter? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую утверждение 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.

1 Ответ

0 голосов
/ 14 ноября 2018

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

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

...