2009-09-07 19 views
46

Abbiamo un semplice flusso di test delle prestazioni in un'applicazione.Gestione sessione/cookie in Apache JMeter

  1. Abbiamo login
  2. Ricerca sulla base di alcuni criteri
  3. Ricerche di ripetizione per i diversi parametri.

Stiamo utilizzando Jmeter per eseguire un test delle prestazioni. Abbiamo bisogno di avere più thread in esecuzione per testare questo in modo scalabile.

Il modo in cui abbiamo attualmente questo è organizzato:

-Test Plan 
    - Thread Group 
     - Cookie Manager 
     - Login To application 
     - Search on param 1 
     - Search on param 2 
    - results summary table 
    - Summary report 

Quindi, in pratica abbiamo riassunto tavolo ritorno e riferire presente sul livello di piano, mentre Cookie Manager è presente a livello di gruppo di thread.

Quando corro per un thread, funziona bene e completa bene. Quando lo ridimensiono a più thread, non appena viene avviato il thread successivo, la sessione per l'ultimo thread viene invalidata. Ciò causa errori per tutti i thread già in esecuzione a causa del thread appena generato.

ho raggiunto questo risultato con l'osservazione: risposte valide
1. Se corro più thread, solo lo scorso thread è ottenuto in sintesi risultato albero
2. Se corro con 2 capi con rampa periodo di 10 secondi, il che significa che ogni thread ha il tempo di finire se stesso, quindi entrambi funzionano correttamente.

In base alla mia comprensione, ogni accesso al thread è nell'applicazione e poiché il gestore dei cookie è a livello di thread, i valori verranno mantenuti rispettivamente per l'ID di sessione per ciascun thread? Ma cosa sta causando l'override del valore dell'ID di sessione tra i thread?

Qualsiasi aiuto sarà molto apprezzato.

risposta

46

copiato da documentazione jmeter:

L'ultimo elemento è un cookie HTTP Manager. Un gestore dei cookie deve essere aggiunto a tutti i test Web - altrimenti JMeter ignorerà i cookie. Aggiungendo a livello di Thread Group, abbiamo assicurare che tutte le richieste HTTP corrispondano allo stesso cookie.

Dal capitolo "4.2.2 Logica" in http://jmeter.apache.org/usermanual/test_plan.html.

EDIT: Suppongo che dovresti usare http://jmeter.apache.org/usermanual/component_reference.html#Simple_Controller per raggruppare le tue richieste insieme a Cookie Manager.

1

Cercare di aumentare il tempo di accelerazione. Mi sono imbattuto nello stesso problema in cui il tempo di accelerazione era di circa 1 secondo, quindi l'ho aumentato a 3 secondi per thread e funzionava bene.

6

Penso che la risposta di Andrey non possa aiutare.Egli cita che ogni richiesta userà gli stessi cookie, ma secondo il manuale jmeter:

Ogni thread JMeter ha una propria "area di stoccaggio cookie".

Per quanto riguarda la domanda, si desidera che ogni thread condivida lo stesso cookie ID di sessione. Quindi mi sembra necessario avere due gruppi di thread ed eseguirli consecutivamente. Il primo gruppo di thread (con un singolo thread che viene eseguito una sola volta) deve accedere e salvare il valore del cookie di sessione su un parametro globale (forse è necessario utilizzare le funzionalità di scripting di jmeter). Quindi impostare quel cookie nel gestore di cookie del secondo gruppo di thread.

Spero che questo aiuti.

+2

+1 a questo. * È possibile "propagare" i cookie attraverso diversi gruppi di thread dello stesso piano di test? No. I thread JMeter sono destinati a rappresentare utenti indipendenti, quindi i cookie e le variabili sono locali a un thread. * Come per [questo] (http://jmeter.512774.n5.nabble.com/HTTP-cookie-manager -td544523.html). –

0

Prova questo:

Aprire le user.properties presenti nella cartella bin di JMeter

modificarlo e aggiungere la seguente riga:

CookieManager.check.cookies=false 

Salva esso ed eseguire lo script. Spero che risolva il tuo problema.

0

prima cambiare il codice per:

jmeter.properties 
CookieManager.save.cookies=true 
CookieManager.name.prefix=mycookie_ 

Quindi, aggiungere un manager dei cookie HTTP nello stesso gruppo filo come campionatore java.

Poi, nel tuo campionatore java aggiunge:

JMeterVariables jmv = JMeterContextService.getContext().getVariables(); 
Iterator<Map.Entry<String,Object>> it = jmv.getIterator(); 
while(it.hasNext()){ 
    Map.Entry<String,Object> v = it.next(); 
    System.out.println("name: " + v.getKey() + " value: " + v.getValue()); 
}