2009-09-07 13 views
46

Mamy prosty test wydajności w aplikacji.Zarządzanie sesjami/plikami cookie w Apache JMeter

  1. Mamy zalogować
  2. Wyszukiwanie na podstawie pewnych kryteriów
  3. powtarzania wyszukuje różnych parametrów.

Używamy Jmetera do przeprowadzenia testu wydajności. Musimy uruchomić wiele wątków, aby przetestować to w skalowalny sposób.

Sposób mamy obecnie to usytuowane jest:

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

Więc zasadniczo mamy podsumowanie tabeli zwracanej i zgłosić obecny na poziomie planu, gdy menedżer plików cookie jest obecny na poziomie grupy wątków.

Po uruchomieniu na jeden wątek działa dobrze i kończy się dobrze. Kiedy skaluje go do wielu wątków, natychmiast po uruchomieniu następnego wątku sesja dla ostatniego wątku jest unieważniana. Powoduje to awarie wszystkich uruchomionych wątków z powodu nowo utworzonego wątku.

dotarłem ten wynik z obserwacji:
1. Jeżeli uruchomić wiele wątków, tylko ostatni wątek ma poprawnych odpowiedzi w wyniku podsumowania drzewa
2. Jeśli uruchomić z 2 wątków z ziemi się jako okres 10 sekund, co oznacza, że ​​każdy wątek dostaje czas na zakończenie, a następnie oba z nich działają pomyślnie.

Zgodnie z moim rozumieniem, każde zgłoszenie wątku do aplikacji, a ponieważ menedżer plików cookie znajduje się na poziomie wątku, wartości zostaną zachowane dla identyfikatora sesji dla każdego wątku, odpowiednio? Ale co powoduje przesłonięcie wartości identyfikatora sesji między wątkami?

Każda pomoc będzie doceniana.

Odpowiedz

46

Skopiowane z dokumentacji JMeter:

Ostatnim elementem jest Cookie HTTP Manager. Menedżer plików cookie powinien być dodany do wszystkich testów internetowych - w przeciwnym razie JMeter będzie ignorować pliki cookie. Dodając na poziomie Grupy wątków, my zapewniamy, że wszystkie żądania HTTP będą udostępniać te same pliki cookie.

Z rozdziału "4.2.2 Sterowniki logiczne" w pozycji http://jmeter.apache.org/usermanual/test_plan.html.

EDIT: Myślę, że należy użyć http://jmeter.apache.org/usermanual/component_reference.html#Simple_Controller do grupy swoich żądań wraz z Cookie Manager.

1

Spróbuj zwiększyć czas narastania. Wpadłem na ten sam problem, w którym czas narastania wynosił około 1 sekundy, a następnie zwiększyłem go do 3 sekund na wątek i wszystko przebiegło bez zarzutu.

6

Myślę, że odpowiedź Andreya nie może pomóc.Cytuje on, że każde żądanie będzie używać tych samych plików cookie, ALE zgodnie z instrukcją jmeter:

Każdy wątek JMeter ma własny "obszar przechowywania plików cookie".

O ile rozumiem pytanie, chcesz, aby każdy wątek udostępniał ten sam plik cookie z identyfikatorem sesji. Wydaje mi się więc, że musisz mieć dwie grupy wątków i wykonywać je kolejno. Pierwsza grupa wątków (z pojedynczym wątkiem, który wykonuje tylko raz) powinna zalogować się i zapisać wartość cookie sesji do globalnego parametru (być może trzeba użyć funkcji skryptowania jmetera). Następnie ustaw ten plik cookie w menedżerze plików cookie z drugiej grupy wątków.

Nadzieję, że pomaga.

+2

+1 do tego. * Czy można "rozpowszechniać" pliki cookie za pośrednictwem różnych grup wątków tego samego planu testów? Nie. Gwinty JMeter służą do reprezentowania niezależnych użytkowników, więc pliki cookie i zmienne są lokalne dla wątku. * Zgodnie z [to] (http://jmeter.512774.n5.nabble.com/HTTP-cookie-manager -td544523.html). –

0

Spróbuj tego:

Otwórz user.properties obecny w folderze bin JMeter

edytować i dodać następujący wiersz:

CookieManager.check.cookies=false 

zapisz go i uruchom skrypt. Mam nadzieję, że rozwiąże to twój problem.

0

Pierwszy zmienić swój kod do:

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

Następnie dodać menedżera plików cookie HTTP w tej samej grupie wątku jako java próbnika.

Następnie w java próbnika dodać:

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()); 
}