2009-04-02 9 views
34

Ho un test JMeter con 2 gruppi di thread: il primo è un thread singolo (che crea un inventario) e il secondo ha più thread (che acquistano tutti inventario). Uso BeanShell Assertions e XPath Extractors per analizzare il valore restituito (che è XML) e memorizzare le variabili (come gli id ​​degli articoli da acquistare).Come passare una variabile da un Thread Group a un altro in JMeter

Tuttavia, i valori creati nel primo gruppo di thread, sia estratti in variabili standard ${jmeter} o ${__BeanShell(vars.get("jmeter"))} di tipo vars, non sono disponibili nel secondo gruppo di thread. Esiste comunque la possibilità di creare una variabile nel primo gruppo di thread e renderla visibile al secondo?

risposta

48

non ero in grado di farlo con le variabili (dal momento che quelli sono locali rispetto a singoli thread). Tuttavia, sono stato in grado di risolvere questo problema con le proprietà!

Ancora una volta, il mio primo ThreadGroup fa tutto il set up e ho bisogno di alcune informazioni da quel lavoro per essere disponibili per ciascuno dei thread nel secondo ThreadGroup. Ho un Asserzione BeanShell nella prima ThreadGroup con il seguente:

${__setProperty(storeid, ${storeid})}; 

Il $ {} StoreID è stato estratto con un XPath estrattore. Il BeanShell Asserzione fa altre cose, come il controllo che StoreID è stato restituito dalla chiamata precedente, ecc

In ogni caso, nel secondo ThreadGroup, posso usare il valore della proprietà "StoreID" in Campionatori con il seguente:

${__property(storeid)} 

Funziona come un fascino!

+2

Le proprietà troppo brutte non possono memorizzare oggetti ...in realtà sembra che i metodi 'get()' e 'put()' siano ancora disponibili da HashTable. Sarebbe molto brutto se abusassi delle proprietà di jmeter per memorizzare i valori degli oggetti? Il mio problema è che voglio che tutti i thread condividano lo stesso oggetto per evitare la creazione di più oggetti quando corro con molti thread. – akostadinov

+0

grazie mille. Ha funzionato per me come un incantesimo! –

+0

Un fermo qui. __setProperty viene chiamato prima che lo script venga passato a BeanShell. Quindi, se stai cercando di assegnare un valore a una variabile da beanshell, non saresti in grado di ottenere il valore –

4

Questo non è possibile in JMeter, perché non è un comportamento normale del client (condivisione di parametri tra thread). Invece di questo uso un filo-Gruppo con i controller:

Thread Group 
+ Create inventory 
+ + XPath 
+ Loop 
+ + Purchase inventory 
+0

Per casi di test non banali, l'utilizzo di controller logici può diventare rapidamente molto noioso (fino al punto di non essere utilizzabile). – Pacerier

3

Bene, questo è un modo per farlo; segui questi passaggi e funzionerà, in seguito potrai adattarlo alle tue esigenze! Le variabili non sono condivise tra i thread (JMeter chiama questa funzione probabilmente :)). Ma le proprietà sono! Quindi imposta la tua variabile in modo appropriato:

1) Fai clic sul tuo piano di prova e attiva 'Esegui gruppi di thread in modo consecutivo' -> questo rende i gruppi di thread eseguiti ordinati e non in modo casuale. (puoi aggiustarlo in seguito, ma per ora per farlo funzionare ..)

2) creare un threadgroup chiamato "setup" per esempio; in quel gruppo di thread aggiungere un BeanShell Sampler con il seguente codice:

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery"); 

Quindi ora la proprietà è stata impostata! Se il valore che si desidera memorizzare come propery è una variabile giá (User definded variabile variabile o reqex per esempio) si può fare:

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable")); 

3) aggiungere una TestGroup 'test vero e proprio', per esempio con un numero di fili superiori a 1; aggiungere un test e per quella prova aggiungere un BeanShell preprocessore con il seguente codice:

import org.apache.jmeter.util.JMeterUtils; 
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty")); 

Quindi, ora che hai creato una variabile in quel filo chiamato theNameOfYourNewProperty che ha il valore della vostra theNameOfYourNewProperty proprietà di sistema.Nel test è ora possibile accedervi piace:

${theNameOfYourNewProperty} 

e funzionerà per ogni thread, non solo solo il primo filo ..

7

JMeter Plugin ha Inter-Thread Communication per questo scopo.

Ci sono 2 metodi per usarlo:

  • PostProcessor/preprocessore
  • Funzioni __fifoPut e __fifoPop

A mio parere PostProcessor/preprocessore è più facile da usare.

+0

Il motivo per cui preferisco la risposta accettata è che, se utilizzo il metodo di comunicazione tra thread, posso solo "inserire" la coda una volta e utilizzare il valore in un singolo campionatore. Forse stavo sbagliando ma dovevo mettere il PreProcessor in un dato campionatore (HTTP Request) e se quel campionatore fosse in un loop funzionerebbe solo una volta prima di cercare di leggere la coda. – Joe

+1

@Joe è il comportamento previsto secondo la documentazione della comunicazione Inter-Thread. Se si desidera utilizzare la variabile put nella coda FIFO più volte, penso che si possa assegnare '$ {__ fifoPop (queue_name, var_name)}' alla variabile locale del thread in [Parametri utente] (http://jmeter.apache.org/usermanual /component_reference.html#User_Parameters) preprocessore –

+0

@AndreyBotalov, questa soluzione è robusta? I thread possono a volte fare cose strane, ad esempio un thread può semplicemente rimanere in ritardo per alcuni minuti mentre gli altri sono in esecuzione. Il plugin ITC avrebbe problemi con situazioni del genere? – Pacerier

11

Secondo documentazione JMeter:

16.12 variabili condivisione tra filati e gruppi di thread

variabili sono locali a un thread una variabile impostata in un thread non può essere letto in altro. Questo è di design. Per le variabili che possono essere determinate prima dell'avvio di un test, vedere Test di parametrizzazione (sopra). Se il valore non è noto fino all'avvio del test, ci sono varie opzioni:

  1. Conservare la variabile come una proprietà - proprietà sono globali all'istanza JMeter
  2. variabili scrivere su un file e ri-leggere loro.
  3. utilizza lo spazio bsh.shared - vedere 16.8.2 Sharing Variables
  4. scrivere classi Java

Un altro modo per passare variabili tra i fili è quello di utilizzare JMeter-plugins come mentioned by Andrey Botalov below.

Ma ho scoperto che è un po 'di confusione usarlo la prima volta ma dà pieno controllo della variabile durante il passaggio da thread a thread. Seguite il mio esempio con l'uso BeanShell e si vede come è facile:

Project stucture successivo riferimento alle sezioni in foto sotto:

(1,1) Qui ho creato variabile personalizzata in Variabili definite dall'utente (o si può fare con BSF Proccessor - disabilitata in questo esempio (1,2))

(2,1) (2,4) ho utilizzato con successo variabile nel primo thread - niente di speciale :)

(2,2) Aggiunto BeanShell PostProcessor e personalizzato la mia variabile

(2,3) aggiunto alla coda

(3,1) In secondo filo - variabile è preso dalla coda - con qualsiasi nome che si desidera.Ma fai attenzione, usa saggiamente Timeout, perché questo thread attenderà fino alla fine precedente in modo che possa ottenere una variabile modificata (sperimentare una risposta lunga)

(3.2) (3.3) (3,4) Che ripetuti passaggi di utilizzo e modifica variabile

(3.5) variabile viene inviato una volta in nuova coda - in modo da fornire nuovo nome ad esso

(4,1) (4,2) (4,3) variabile modificata Afferrato dalla nuova coda funziona come fascino

Warning

  1. Se si aggiungono più thread, aggiungere un po 'Counter to Thread Group con variabile e aggiungere questo nome di variabile al nome della coda - fare lo stesso in Thread Group in cui si tenta di catturare la coda in modo che la coda abbia un nome univoco per ogni thread (scrivere un se hai bisogno di un'esplorazione più chiara)

  2. Se hai più di una richiesta http in un gruppo di thread, aggiungi il pre processore di comunicazione thread come ultimo figlio (o altro se vuoi ottenere qualche cosa personalizzata) http Request

Play, modificare, personalizzare per ottenere il miglior risultato :) L'aggiunta di più thread può causare un comportamento indesiderato in modo nee d essere vigile.

Information about project structure

1

Un'altra soluzione è utilizzare il Simple Table Server per gestire il set di dati. Questa funzione è stata aggiunta ai 1.2 plugin JMeter.

"L'idea principale è quella di utilizzare un piccolo server HTTP in JMeter Plugin per gestire i file del set di dati con semplici comandi per ottenere/aggiungere righe di dati nel file"

Guardate la documentazione: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Saluti.

+0

Hmm, invece di usare HTTP come proxy, perché non connettersi direttamente al database? – Pacerier

5

Ho trovato che credo sia il modo più semplice per ottenere questo risultato.

Usa

Bean Shell PostProcessor 

per impostare la variabile (http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value"); 

O se si sta leggendo da una variabile

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE")); 

E poi dall'altro gruppo di thread, leggere it via (http://jmeter.apache.org/usermanual/functions.html#__property)

${__property(PC_CREATED_PROMO_CODE)} 
Problemi correlati