2012-03-22 10 views
13

Ho la seguente configurazione:condivisione di valori dei cookie tra i gruppi di thread in JMeter

Thread A 
    - Http Cookie Manager 
    - Login Page 
Thread B 
    - Http Cookie Manager 
    - Page to hit 
    - Another page to hit 

Ho cercato di ottenere il cookie che si trova nella pagina di accesso a una proprietà globale e quindi impostare al Http Cookie Manager nella discussione B. Tuttavia non sono riuscito a farlo bene. Ho provato BeanShell PostProcessors e così via, ma non sono riuscito a farlo funzionare correttamente.

=== Aggiungi chiarimenti ===

Il motivo per cui non posso avere il registro di pagina e Cookie Manager nella Discussione B è dovuto al comportamento desiderato. L'obiettivo è quello di accedere, ottenere il cookie, e quindi colpire un sacco di pagine più e più volte. Questo ci dà la possibilità di accedere una volta e quindi simulare molti colpi da quell'utente. Inserendo il gestore dei cookie e la pagina di accesso nello stesso thread in cui l'utente si collegava, ha colpito un gruppo di pagine una volta e poi ha effettuato l'accesso e lo ha fatto di nuovo.

risposta

21

Avrei dovuto essere un po 'più chiaro nella mia domanda, ma abbiamo risolto il problema. Qui è la nostra soluzione:

Http Cookie Manager 
Thread A - 1 Thread - 1 Loop Count 
    - Login Page 
     - BeanShell PostProcessor 
      - props.put("MyCookie","${COOKIE_<INSERT ACTUAL COOKIE NAME>}"); 
Thread B - 50 Threads - Infinite Loop Count 
    - BeanShell PreProcessor 
     - import org.apache.jmeter.protocol.http.control.CookieManager; 
     import org.apache.jmeter.protocol.http.control.Cookie; 
     CookieManager manager = sampler.getCookieManager(); 
     Cookie cookie = new Cookie("<INSERT ACTUAL COOKIE NAME>",props.get("MyCookie"),"<INSERT DOMAIN NAME>","<INSERT COOKIE PATH>",false,0); 
     manager.add(cookie); 
    - Page to hit 
    - Another page to hit, repeat as needed 

Poi c'è un cambiamento di configurazione per JMeter necessaria:

aprire il file di jmeter.properties e andare alla linea "CookieManager.save.cookies = false" e renderlo = vero

Ciò consentirà il cookie di accesso nel primo thread da utilizzare nel secondo thread.

+0

Come ottenere percorso cookie ??? – Esty

+0

È possibile utilizzare "/" come percorso ... –

+0

@Clarence Klopfstein, I ho usato il metodo che hai fatto e sono in grado di vedere i nomi e i valori dei cookie stessi, ma le richieste che uso ora dicono "[nessun cookie]". Qualche idea? –

1

Perché non aggiungere Http Cookie Manager al livello del piano di test invece del gruppo di thread uno e raggruppare tutti i campionatori in un gruppo di thread?

Test Plan 
    Http Cookie Manager 
    Thread Group 
     - Login Page 
     - Page to hit 
     - Another page to hit 

Questo dovrebbe risolvere il problema senza altri campionatori aggiuntivi.
O forse ci sono alcuni motivi oggettivi per implementare il modo in cui hai fatto?

... Si prega di guardare anche su this.

+1

Inserirò la nostra soluzione tra un po ', ma abbiamo funzionato. Per rispondere al tuo suggerimento, l'idea era di fare il login una volta e fare un sacco di cose e vedere come si comporta. Il tuo metodo richiederebbe un login per ogni iterazione. Non è un test di carico realistico. –

+0

L'impostazione del gestore di cookie HTTP a livello di piano di test non ha funzionato per me ... :( –

2

Ho lo stesso caso d'uso ma credo che ci sia una soluzione più semplice: all'interno del gruppo di thread è possibile utilizzare un controller di loop.

Quindi ...

Thread Group 
    Login 
    Loop Controller 
    - Page to hit 
    - Another page to hit 

Detto questo sto ancora intenzione di utilizzare il trucco che lei descrive, perché penso che vorremo accedere una volta, poi ha colpito diverse pagine diverse in Parrallel da diversi gruppi di thread . Per prima cosa effettueremo il login, quindi diversi gruppi di thread colpiranno il server contemporaneamente. Quindi il tuo trucco è sicuramente utile. Ma per casi semplici, un controller di loop può farlo credo.

+0

Gli Hits all'interno del controller Loop possono essere sequenziali o paralleli? –

+0

sequenziale: questo è esattamente il motivo * NON * per usare questo –

0

La risposta sopra mi ha davvero aiutato, ma il gestore cookie HTTP era senza i dettagli necessari per farlo funzionare. Impostando il manager dei cookie come sotto, ha funzionato per me

Http Cookie Manager 
NAME $<ACTUAL_COOKIE_NAME> 
VALUE ${COOKIE_<INSERT_ACTUAL_COOKIE_NAME>}  
DOMAIN ${SITE} 
PATH /
Thread A - 1 Thread - 1 Loop Count 
.... 
Thread B - 50 Threads - Infinite Loop Count 
.... 
0

CookieManager non condivide i cookies tra i thread. Per qualche ragione @ il metodo di ClarenceKlopfstein non ha funzionato per me (jmeter 3.0). Per qualche motivo non è sembrato valutare "${COOKIE_<INSERT ACTUAL COOKIE NAME>}" la stringa passata.

Quindi, ecco un'altra soluzione per fare un accesso e quindi passare il cookie .ASPXAUTH. Dovrebbe funzionare senza alcuna modifica di configurazione: In un setUp Thread Group (importante):

BeanShell PostProcessor: 
import org.apache.jmeter.protocol.http.control.CookieManager; 
import org.apache.jmeter.protocol.http.control.Cookie; 

CookieManager manager = ctx.getCurrentSampler().getCookieManager(); 
Cookie cookie = manager.get(3); //Find the '.ASPXAUTH' cookie 
log.info("Cookie:" + cookie); 
props.put("MyCookie",cookie.getValue()); 

Poi, in un normale gruppo di discussione:

BeanShell PreProcessor: 
import org.apache.jmeter.protocol.http.control.CookieManager; 
import org.apache.jmeter.protocol.http.control.Cookie; 
CookieManager manager = sampler.getCookieManager(); 
Cookie cookie = new Cookie(".ASPXAUTH",props.get("MyCookie"),"<DOMAIN>","/",false,0); 
manager.add(cookie); 
+0

Questa soluzione non ha funzionato per me :( –

+0

Hai ancora bisogno del CookieManager al livello del piano di test @ShaiAlon. Hai provato senza? –

2

Nessuno degli altri soluzioni qui ha funzionato per me, ma tutti avevano una parte della soluzione. Ecco cosa finalmente ha funzionato per passare il cookie (JSESSIONID, nel mio caso) da un gruppo di thread all'altro. Nota Non è stato necessario impostare CookieManager.save.cookies in alcun modo.

Http Cookie Manager 
Thread A - 1 Thread - 1 Loop Count 
    - Login Page 
     - BeanShell PostProcessor 
      - import org.apache.jmeter.protocol.http.control.CookieManager; 
       import org.apache.jmeter.protocol.http.control.Cookie; 
       import org.apache.jmeter.testelement.property.PropertyIterator; 
       import org.apache.jmeter.testelement.property.JMeterProperty; 
       CookieManager manager = ctx.getCurrentSampler().getCookieManager(); 
       PropertyIterator iter = manager.getCookies().iterator(); 
       while (iter.hasNext()) { 
        JMeterProperty prop = iter.next(); 
        Cookie cookie = prop.getObjectValue(); 
        if (cookie.getName().equals("JSESSIONID")) { 
         props.put("MySessionCookie", cookie); 
         break; 
        } 
       } 
Thread B - 50 Threads - Infinite Loop Count 
    - BeanShell PreProcessor 
     - import org.apache.jmeter.protocol.http.control.CookieManager; 
     import org.apache.jmeter.protocol.http.control.Cookie; 
     CookieManager manager = sampler.getCookieManager(); 
     manager.add(props.get("MySessionCookie")); 
    - Page to hit 
    - Another page to hit, repeat as needed 
+0

grazie. funziona come un fascino! –

-1

per più di un campo in biscotto Ho provato questo n sue opere

BeanShell Post Processor 
    props.put("MyCookie","${COOKIE_<FIRST FIELD>}"); 
    props.put("MyCookie1","${COOKIE_<SECOND FIELD>}"); 

    BeanShell Pre Processor 

    import org.apache.jmeter.protocol.http.control.CookieManager; 
    import org.apache.jmeter.protocol.http.control.Cookie; 
    CookieManager manager = sampler.getCookieManager(); 
    Cookie cookie = new Cookie("<FIRST FIELD>",props.get("MyCookie"),"DOMAIN","/",false,0); 
    manager.add(cookie); 
    Cookie cookie1 = new Cookie("<SECOND FIELD>",props.get("MyCookie1"),"DOMAIN NAME","/",false,0); 
    manager.add(cookie1); 
0

piuttosto che avere un gruppo di thread separato per accedere gli utenti, è possibile utilizzare un unico gruppo di thread con un Una volta solo controller. Aggiungi Samplers sotto il Una volta solo il controller per accedere e ottenere il cookie di sessione (che verrà eseguito solo una volta). Da quel momento in poi il gruppo di thread eseguirà semplicemente gli altri campionatori che passano il cookie di sessione ad ogni richiesta. Ho avuto il gestore di cookie HTTP allo Piano di prova.

Problemi correlati