Сравните несколько ответов JSON с JMeter

Мне нужно убедить JMeter провести A / B-сравнение ответов на запросы веб-службы JSON. Проблема, с которой я столкнулся, заключается в том, что ответы могут иметь одинаковое содержание, но все же не быть одинаковыми.

Пример response1:

[ { "id": 1, "name": "Canada", "provinceNames": [ "Alberta", "British Columbia" ] }, { "id": 2, "name": "United States", "provinceNames": [ "California", "New York" ] } ]

Этот ответ полностью отсортирован "id", "name", "ProvinceNames", а в пределах ProvinceNames также сортируются "Alberta", "British Columbia" и, соответственно, "California", "New York" .

Пример ответа2:

[ { "name": "United States", "provinceNames": [ "New York", "California" ], "id": 2 }, { "name": "Canada", "provinceNames": [ "British Columbia", "Alberta" ], "id": 1 } ]

Этот ответ не отсортирован.

Два ответа имеют одинаковое содержание, даже если они не совпадают.

У кого-нибудь раньше была эта проблема и есть решение?

Мой подход заключался в последующей обработке ответа, сортировке объектов JSON и их сравнении. До сих пор я не мог придумать способ ни в javascript, ни в beanshell. Я нашел несколько решений аналогичных проблем, но они используют JQuery или другие библиотеки, недоступные в JMeter.

Во-первых, я хотел бы знать, на правильном ли я пути с этим подходом, или кто-то придумал гораздо более элегантное решение?

Во-вторых, если этот подход в порядке, есть ли у кого-нибудь фрагменты кода в javascript / beanshell, которые я мог бы использовать в JMeter?

Спасибо за твою помощь :)


person gargi    schedule 26.02.2015    source источник
comment
Попробуйте поискать на javascript deep compare data structures   -  person Mike Brant    schedule 26.02.2015


Ответы (1)


Доступно несколько вариантов:

  1. Используйте JSONPath Extractor для извлечения отдельных значений, таких как имя, название провинции и т. Д., И сохранения их в переменных JMeter. и сравните переменные
  2. Используйте утверждение пути JSON для того же
  3. Используйте Beanshell PostProcessor, чтобы преобразовать ответ JSON в отсортированную строку и сравнить строки. Пример кода Beanshell для этого будет выглядеть так:

    String response = prev.getResponseDataAsString();
    char [] responseCharArray = response.toCharArray();
    Arrays.sort(responseCharArray);
    response = Arrays.toString(responseCharArray);
    prev.setResponseData(response.getBytes()); 
    

где prev - это экземпляр класса SampleResult, содержащего родительский сэмплер. детали результата.

Приведенный выше код переопределит исходный ответ сэмплера, и исходный ответ будет разделен на символы, отсортированные с помощью Dual-Pivot Quicksort и снова поставил обратно.

Если данные в обоих случаях совпадают, объекты строки результата также будут одинаковыми.

Чтобы узнать больше об улучшении ваших тестов с помощью сценариев, обратитесь к Как использовать BeanShell: JMeter's любимый встроенный компонент руководство.

person Dmitri T    schedule 28.02.2015
comment
Привет, спасибо за ответ. Я знаю, что есть много статей по этой проблеме, но ни одна из них до сих пор не решает проблему. JSONPath Extractor отлично подходит, если вы хотите сравнить определенные значения, но не подходит для всего ответа JSON. сравнение. Я не совсем уверен в третьем решении, но похоже, что вы берете весь JSON как одну массивную строку и сортируете символы. Это означало бы, что {"id":"hello"} будет равно {"hello":"id"}, тогда как это очень разные ответы JSON. - person gargi; 15.05.2015
comment
responses might have the same contents but still not be the same.. Мой ответ решает вашу проблему. Если есть еще вопрос - смело задавайте его в отдельной ветке. - person Dmitri T; 17.05.2015