2014-08-27 11 views
6

In JMeter voglio verificare il numero di oggetti in un array JSON, che ricevo dal server.JMeter: come contare gli oggetti JSON in una matrice utilizzando jsonpath

Ad esempio, su una determinata richiesta mi aspetto un array con 5 oggetti.

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

Dopo aver letto questo: count members with jsonpath?, Ho provato ad utilizzare il seguente JSON Percorso Asserzione:

  • JSON Percorso: $
  • valore atteso: hasSize (5)
  • Convalida contro valore atteso = controllata

Tuttavia, questo d non sembra funzionare correttamente Quando effettivamente ricevo 5 oggetti nell'array, l'asserzione di risposta dice che non corrisponde.

Cosa sto sbagliando? O in quale altro modo posso farlo?

+0

Controllare questa risposta: http://stackoverflow.com/a/40926919/1306012 si può guardare per quello. Usa "* _matchNr" della tua variabile. –

risposta

9

Sebbene JSONPath Extractor non fornisce hasSize funzione è ancora può essere fatto.

esempio dato JSON dalla risposta da PMD UBIK-INGENIERIE, è possibile ottenere il numero di partite su book gamma, almeno in 2 modi:

1. Easiser (ma fragile) modo - usando Regular Expression Extractor.

Come si può vedere, ci sono 4 voci per category come:

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

Se si aggiunge un estrattore Regular Expression configurato come segue:

JSON Regex

Sarà catturare tutti il category voci e tornare corrisponde numero come di seguito:

JSON Regex Matches

Quindi sarà possibile utilizzare questa variabile ${matches_matchNr} ovunque sia necessario.

Questo approccio è semplice e facile da implementare, ma è molto vulnerabile a eventuali modifiche di formato di risposta. Se si prevede che i dati JSON possano cambiare nel prossimo futuro, continuare con l'opzione successiva.

2. Più duro (ma più stabile) direzione - chiamando metodi JsonPath da Beanshell PostProcessor

JMeter trovi meccanismo di estensione di scripting Beanshell che ha accesso a tutte le variabili/proprietà a portata e l'accesso a JMeter sottostante e 3 ° API di dipendenze di terze parti. In questo caso è possibile chiamare la libreria JsonPath (che è sotto il cofano di JSONPath Extractor) direttamente da 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())); 

Il codice di cui sopra viene valutata JSONPath espressione di $.store.book[?] contro risposta genitore campionatore, conta partite il numero e lo memorizza in ${JSON_ARRAY_SIZE} JMeter variabile

JSON Beanshell Variable

che può essere successivamente riutilizzato in caso clausola o un'asserzione .

Riferimenti:

+0

Grazie per questi suggerimenti! Per ora userò la soluzione rapida con il Regular Expression Extractor, è sufficiente. Ma probabilmente userò il PostProcessor BeanShell più tardi.ottimo :-) – David

+0

Preferisci il JSR223 + Groovy al posto di Beanshell, molto meglio per le prestazioni di JMeter e molto meglio per la codifica dato che Groovy è molto più potente per JSON e XML e mantenuto –

+0

Il primo link di riferimento (alexandru-ersenie.com) è scaduto . –

-1

Questo non è possibile con il plug-in che si sta utilizzando (JMeter-plugins).

Ma può essere eseguito con Ubik Load Pack plugin for JSON e poiché JMeter 3.0 con Core JMeter come Ubik Load Pack plugin for JSON è stato donato a JMeter 3.0.

Esempio:

Diciamo che avete questo JSON che contiene una serie di libri:

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

di avere questo conteggio:

1/Aggiungi ULP_JSON PostProcessor:

ULP_JSON PostProcessor

Il conteggio sarà in variabl e chiamato $ {book_matchNr}

in corso questo piano di test sarebbero visualizzare questo:

enter image description here

Come si può vedere, Debug Sampler - $ {book_matchNr} mostra Debug Sampler-4

Questo è tutto .

Disclaimer: Questo plugin JMeter è distribuito dalla mia azienda

+0

Grazie per il suggerimento! Il tuo plugin sembra davvero utile, ma per ora andrò con la soluzione di Expression Expression che Dmitri ha menzionato. Grazie comunque! – David

+0

Nessun problema :-), come dice Dmitri, usare Regexp per JSON di solito non è una buona cosa, e Beanshell porta a molti codice personalizzato e manutenibilità + problemi di produttività, alla fine comprare il nostro plugin è meglio :-), ma se vai per la programmazione, preferisci il JSR223 + Groovy al posto di Beanshell, il modo migliore per le performance di JMeter e il modo migliore per programmare come Groovy è molto più potente e mantenuto –

+0

OK grazie mille per i suggerimenti! – David

Problemi correlati