2014-08-27 3 views
6

В JMeter Я хочу проверить количество объектов в массиве JSON, которое я получаю с сервера.JMeter: Как подсчитать объекты JSON в массиве с помощью jsonpath

Например, по определенному запросу я ожидаю массив с 5 объектами.

[{...}, {...}, {...}, {...}, {...}]

После прочтения этого: count members with jsonpath?, я попытался с помощью следующих JSON Путь Assertion:

  • JSON Путь: $
  • Ожидаемое значение: hasSize (5)
  • Validate против ожидаемого значения = проверено

Однако, это д похоже, не работает должным образом. Когда я действительно получаю 5 объектов в массиве, утверждение ответа говорит, что оно не совпадает.

Что я делаю неправильно? Или как еще я могу это сделать?

+0

Проверить этот ответ: http://stackoverflow.com/a/40926919/1306012 вы можете посмотреть для этого. Используйте переменную «* _matchNr». –

ответ

9

Хотя JSONPath Extractor не обеспечивает hasSize функцию, которую он все еще может быть сделано.

Данный пример JSON из ответа ЛПР Ubik-INGENIERIE, вы можете получить несколько матчей на book массив по крайней мере, 2-мя способами:

1. Easiser (но хрупкий) способ - с помощью Regular Expression Extractor.

Как вы можете видеть, есть 4 входа для category как:

{ "category": "reference", 
{ \"category\": \"fiction\" 
... 

Если добавить Regular Expression Extractor настроен следующим образом:

JSON Regex

Это будет захватывать все category и номера возвратных совпадений, как указано ниже:

JSON Regex Matches

Таким образом, вы сможете использовать эту переменную ${matches_matchNr} там, где это необходимо.

Этот подход прост и прост в применении, но он очень уязвим для любых изменений в формате отклика. Если вы ожидаете, что данные JSON могут измениться в обозримом будущем, переходите к следующему варианту.

2. Труднее (но более стабильный) способ - вызов метода JsonPath из Beanshell PostProcessor

JMeter имеет BeanShell механизм расширения сценариев, который имеет доступ ко всем переменным/свойства в объеме, а также доступ к нижележащей JMeter и 3 API-интерфейсы зависимостей. В этом случае вы можете позвонить в библиотеку JsonPath (которая находится под капотом JsonPath Extractor) непосредственно из Beanshell PostProcessor.

import com.jayway.jsonpath.Criteria; 
import com.jayway.jsonpath.Filter; 
import com.jayway.jsonpath.JsonPath; 

Object json = new String(data); 
List categories = new ArrayList(); 
categories.add("fiction"); 
categories.add("reference"); 
Filter filter = Filter.filter(Criteria.where("category").in(categories)); 
List books = JsonPath.read(json, "$.store.book[?]", new Filter[] {filter}); 

vars.put("JSON_ARRAY_SIZE", String.valueOf(books.size())); 

Код выше оценивает JSONPath экспрессию $.store.book[?] против ответа родительского пробоотборника, подсчитывает соответствует число и сохраняет его в ${JSON_ARRAY_SIZE} JMeter Variable

JSON Beanshell Variable

, который впоследствии может быть повторно использован в случае, если пункт или утверждение ,

Ссылки:

+0

Спасибо за эти предложения! На данный момент я использую быстрое решение с помощью Extractor Extractor, этого достаточно. Но позже я, вероятно, буду использовать BeanShell PostProcessor.Отлично :-) – David

+0

Предпочитаете JSR223 + Groovy вместо Beanshell, лучше для JMeter-исполнения и лучше для кодирования, поскольку Groovy намного более эффективен для JSON и XML и поддерживается –

+0

Истекает первая ссылка ссылки (alexandru-ersenie.com) , –

-1

Это невозможно с помощью плагина, который вы используете (JMeter-плагины).

Но это может быть сделано с Ubik Load Pack plugin for JSON, и поскольку JMeter 3.0 с Core JMeter как Ubik Load Pack plugin for JSON был пожертвован JMeter 3.0.

Пример:

Скажем у вас есть этот JSON, содержащий массив книг:

{ "store": {"book": [ 
     { "category": "reference","author": "Nigel Rees","title":  "Sayings of the Century","price": 8.95}, 
     { "category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99}, 
     { "category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99}, 
     { "category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99} 
    ], 
    "bicycle": {"color": "red","price": 19.95}} } 

Чтобы иметь этот счет:

1/Добавить ULP_JSON постпроцессор:

ULP_JSON PostProcessor

Счет будет в variabl е называется $ {book_matchNr}

Запуск этого плана тестирования будет отображаться следующее:

enter image description here

Как вы можете видеть, Debug Sampler - $ {book_matchNr} показывает Debug Sampler-4

Вот это ,

Отказ от ответственности: Этот плагин JMeter распространяется моей компанией

+0

Спасибо за предложение! Ваш плагин кажется действительно полезным, но пока я пойду с решением экстренного выражения Expression, которое сказал Дмитрий. Спасибо, в любом случае! – David

+0

Без проблем :-), как говорит Дмитрий, использование Regexp для JSON обычно не очень хорошо, и Beanshell приводит к большому количеству пользовательского кода и ремонтопригодности + проблем с производительностью, в итоге покупка нашего плагина лучше :-), но если вы идете на кодирование, предпочитаете JSR223 + Groovy вместо Beanshell, лучше для JMeter и лучше для кодирования, так как Groovy намного мощнее и поддерживается –

+0

OK спасибо за советы! – David

Смежные вопросы