2016-03-07 10 views
10

Ho bisogno di creare un numero intero positivo casuale ogni volta e inviarlo al corpo Json in Gatling.Come aggiungere un valore casuale in Json Body in Gatling?

ho usato il codice qui per creare un ineger positiva casuale:

val r = new scala.util.Random; 
val OrderRef = r.nextInt(Integer.MAX_VALUE); 

ma, come posso nutrire il valore generato in modo casuale nel corpo JSON?

ho provato:

.exec(http("OrderCreation") 
.post("/abc/orders") 
.body(StringBody("""{ "orderReference": "${OrderRef}"}""").asJson) 

Ma, questo non sembra funzionare. Qualsiasi indizio, per favore.

Grazie!

risposta

20

Prima di tutto si desidera generare il numero casuale ogni volta, quindi OrderRef deve essere un metodo, come:

def orderRef() = Random.nextInt(Integer.MAX_VALUE) 

commento a margine: dalla Scala convenzione: nome camelCase,(), mentre genera nuovi valori , senza ; alla fine.

Per utilizzare il metodo preparato non è possibile utilizzare la stringa Gatling EL. La sintassi è molto limitata e fondamentalmente le ricerche "${OrderRef}" per la variabile con nome OrderRef in Gatling Session.

modo corretto è quello di utilizzare la funzione Espressione come:

.exec(
    http("OrderCreation") 
    .post("/abc/orders") 
    .body(StringBody(session => s"""{ "orderReference": "${orderRef()}" }""")).asJSON 
) 

Qui si sta creando funzione anonima prendere Gatling Session e tornando String come corpo. La stringa viene composta tramite il meccanismo di interpolazione della stringa standard e utilizza prima la funzione preparata orderRef().

Naturalmente è possibile omettere Scala di interpolazione di stringhe come: stile

.body(StringBody(session => "{ \"orderReference\": " + orderRef() +" }")).asJSON 

che non è molto preferito quando si utilizza Scala.

Vedere ulteriori dettagli nella documentazione di Gatling su Request Body e leggere ulteriori informazioni su Galting EL syntax.

Un modo alternativo è quello di definire un alimentatore:

// Define an infinite feeder which calculates random numbers 
val orderRefs = Iterator.continually(
    // Random number will be accessible in session under variable "OrderRef" 
    Map("OrderRef" -> Random.nextInt(Integer.MAX_VALUE)) 
) 

val scn = scenario("RandomJsonBody") 
    .feed(orderRefs) // attaching feeder to session 
    .exec(
    http("OrderCreation") 
    .post("/abc/orders") 
    // Accessing variable "OrderRef" from session 
    .body(StringBody("""{ "orderReference": "${OrderRef}" }""")).asJSON 
) 

Qui la situazione è diversa, in primo luogo definiamo l'alimentatore, poi collegarlo alla sessione e quindi utilizzare il suo valore nella richiesta corpo attraverso Gatling EL stringa. Funziona mentre il valore del feeder viene prelevato dall'alimentatore da Gatling prima di un allegato alla sessione per ogni utente virtuale. Vedi di più sugli alimentatori here.

Raccomandazione: se lo scenario è semplice, iniziare con la prima soluzione. Se ci vuole un pensiero più complesso sui feeder.

Divertiti

+0

Grazie mille ...Mi hai risparmiato un sacco di tempo :) –

+0

Prego :) – Teliatko

+1

Il primo modo "corretto" di farlo non ha funzionato per me. Il modo alternativo funzionava. Grazie. –