2014-08-27 17 views
6

W JMeter Chcę sprawdzić liczbę obiektów w tablicy JSON, które otrzymuję z serwera.JMeter: Jak liczyć obiekty JSON w tablicy za pomocą jsonpath

Na przykład na pewne żądanie oczekuję tablicy z 5 obiektami.

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

Po przeczytaniu: count members with jsonpath?, że próbował użyciu następujących JSON Ścieżka Twierdzenie:

  • JSON Ścieżka: $
  • Oczekiwana wartość: hasSize (5)
  • Waliduj wobec oczekiwanego value = sprawdzane

jednak ten d wydaje się, że nie działa prawidłowo. Kiedy faktycznie otrzymuję 5 obiektów w tablicy, asercja odpowiedzi mówi, że się nie zgadza.

Co robię źle? Lub jak inaczej mogę to zrobić?

+0

Sprawdź tę odpowiedź: http://stackoverflow.com/a/40926919/1306012 może wyglądać za to. Użyj "* _matchNr" swojej zmiennej. –

Odpowiedz

9

Chociaż JSONPath Extractor nie przewiduje hasSize funkcji jest jeszcze można zrobić.

Biorąc przykład z odpowiedzi JSON przez PMD UBIK-INGENIERIE, można uzyskać numer mecze na book tablicy przynajmniej na 2 sposoby:

1. Easiser (ale kruchy) sposób - za pomocą Regular Expression Extractor.

Jak widać, istnieją 4 wpisy dla category jak:

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

Jeśli dodać do wyrażenia regularnego Extractor skonfigurowane następująco:

JSON Regex

To będzie przechwytywać wszystkie category wpisy i wyniki zwracanych numerów są następujące:

JSON Regex Matches

Dzięki temu będziesz mógł użyć tej zmiennej ${matches_matchNr} wszędzie tam, gdzie jest to wymagane.

To podejście jest proste i łatwe do wdrożenia, ale jest bardzo podatne na wszelkie zmiany w formacie odpowiedzi. Jeśli spodziewasz się, że dane JSON mogą ulec zmianie w przewidywalnej przyszłości, przejdź do następnej opcji.

2. Harder (ale bardziej stabilny) way - wywołanie metody JsonPath od Beanshell PostProcessor

JMeter ma BeanShell mechanizm wewnętrzny skryptowy, który ma dostęp do wszystkich zmiennych/właściwości w zakresie, jak również dostęp do podstawowej i 3 JMeter -zależności API od stron. W tym przypadku możesz zadzwonić pod bibliotekę JsonPath (która znajduje się pod wyciągiem JsonPath Extractor) bezpośrednio z 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())); 

Powyższy kod ocenia JSONPath ekspresji $.store.book[?] przed odpowiedzią rodzic sampler, zlicza mecze numer i zapisuje go do ${JSON_ARRAY_SIZE} JMeter Variable

JSON Beanshell Variable

które później mogą być ponownie wykorzystane w przypadku klauzula lub twierdzenie .

Referencje:

+0

Dzięki za te sugestie! Na razie skorzystam z szybkiego rozwiązania z Ekspresorem Wyrażeń Regularnych, to wystarczy. Ale prawdopodobnie użyję BeanShell PostProcessor później.super :-) – David

+0

Preferuj JSR223 + Groovy zamiast Beanshell, znacznie lepiej dla wydajności JMeter i znacznie lepiej dla kodowania, ponieważ Groovy jest znacznie bardziej wydajny dla JSON i XML i utrzymywał –

+0

Pierwszy odnośnik (alexandru-ersenie.com) wygasł . –

-1

Nie jest to możliwe z używaną wtyczką (JMeter-plugins).

Ale można to zrobić za pomocą Ubik Load Pack plugin for JSON, a ponieważ JMeter 3.0 z Core JMeter jako Ubik Load Pack plugin for JSON został przekazany do JMeter 3.0.

Przykład:

Powiedzmy, że masz ten JSON, który zawiera szereg książek:

{ "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}} } 

mieć to Count:

1/Dodaj ULP_JSON postprocesora:

ULP_JSON PostProcessor

Liczba będzie w variabl e zwane $ {book_matchNr}

przebiegu ten plan testów wyświetli to:

enter image description here

Jak widać, Debug Sampler - $ {book_matchNr} pokazuje Debug Sampler-4

To wszystko .

Zastrzeżenie: Ta wtyczka JMeter jest rozprowadzany przez moją firmę

+0

Dzięki za sugestię! Twoja wtyczka wydaje się naprawdę przydatna, ale na razie pójdę z rozwiązaniem Expressex Extractor, o którym wspomniał Dmitri. Dzięki i tak! – David

+0

Nie ma problemu :-), jak mówi Dmitri, używanie Regexp dla JSON nie jest zwykle dobrą rzeczą, a Beanshell prowadzi do wielu niestandardowych problemów z kodem i konserwacją + produktywnością, w końcu kupowanie naszej wtyczki jest lepsze :-), ale jeśli idziesz do kodowania, wolisz JSR223 + Groovy zamiast Beanshell, o wiele lepiej dla wydajności JMeter i o wiele lepiej dla kodowania, ponieważ Groovy jest o wiele mocniejszy i lepiej utrzymany –

+0

OK, dziękuję za porady! – David