2009-04-02 12 views
34

Mam test JMeter z 2 grupami wątków - pierwszy to pojedynczy wątek (który tworzy pewne zasoby), a drugi ma wiele wątków (które kupują wszystkie Inwentarz). Używam Asercji BeanShell i Eksploratorów XPath do analizowania zwróconej wartości (która jest XML) i przechowywania zmiennych (takich jak identyfikatory przedmiotów do nabycia).Jak przekazać zmienną z jednej grupy wątków do drugiej w JMeter

Jednak wartości tworzone w pierwszej grupie wątków, niezależnie od tego, czy zostały wyodrębnione w standardowe zmienne typu ${jmeter}, czy zmienne typu ${__BeanShell(vars.get("jmeter"))}, nie są dostępne w drugiej grupie wątków. Czy mimo to można utworzyć zmienną w pierwszej grupie wątków i uczynić ją widoczną dla drugiej?

Odpowiedz

48

Nie mogłem tego zrobić ze zmiennymi (ponieważ są to lokalne do poszczególnych wątków). Jednak udało mi się rozwiązać ten problem z właściwościami!

Ponownie, moja pierwsza grupa wątków wykonuje wszystkie ustawienia i potrzebuję informacji z tej pracy, aby były dostępne dla każdego wątku w drugiej grupie wątków. Mam twierdzenie BeanShell w pierwszym ThreadGroup z następujących:

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

$ {storeid} ekstrahowano z XPath ssący. BeanShell Twierdzenie robi inne rzeczy, takie jak sprawdzanie tego storeid został zwrócony z poprzedniej rozmowy, itd

W każdym razie, w drugim ThreadGroup, mogę użyć wartości „storeid” własności w Próbniki z następujących czynności:

${__property(storeid)} 

Działa jak urok!

+2

Zbyt złe właściwości nie mogą przechowywać obiektów ...faktycznie wydaje się, że 'get()' i 'put()' metody są nadal dostępne z HashTable. Czy byłoby bardzo źle, jeśli nadużywałam właściwości jmetera do przechowywania wartości obiektów? Mój problem polega na tym, że chcę, aby wszystkie wątki udostępniały ten sam obiekt, aby uniknąć tworzenia wielu obiektów, gdy uruchamiam wiele wątków. – akostadinov

+0

wielkie dzięki. Pracował dla mnie jak urok! –

+0

Połów tutaj. __setProperty jest wywoływane przed przekazaniem skryptu do BeanShell. Więc jeśli próbujesz przypisać wartość do zmiennej z fasoli, nie byłbyś w stanie uzyskać wartości –

4

Nie jest to możliwe w JMeter, ponieważ nie jest to normalne zachowanie klienta (udostępnianie parametrów między wątkami). Zamiast tego użyj jednej grupy wątków ze sterownikami:

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

Dla nietrywialnych przypadków testowych używanie kontrolerów logicznych może szybko stać się bardzo uciążliwe (do punktu, którego nie można użyć). – Pacerier

3

To jeden sposób, aby to zrobić; Wykonaj poniższe kroki i zadziała, później możesz dostosować je do swoich potrzeb! Zmienne nie są współużytkowane wśród wątków (JMeter nazywa to pewnie pewną funkcją :)). Ale właściwości są! Dlatego ustaw zmienną jako properenta:

1) Kliknij swój plan testowy i włącz "Uruchom kolejno grupy wątków" -> spowoduje to, że grupy wątków będą uporządkowane, a nie losowo. (możesz później to zmienić, ale na razie, aby to zadziałało).

2) stwórz na przykład grupę wątków o nazwie 'setup'; w tej grupie wątków dodaj próbnik BeanShell z następującym kodem:

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

Teraz obiekt został ustawiony! Jeśli wartość chcesz zapisać jako propery jest zmienną allready (Użytkownik definiowany zmiennej lub reqex zmienną na przykład) można zrobić:

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

3) dodać testgroup „teście” na przykład z szeregu wątki wyższe niż 1; dodać test i do tego testu dodać BeanShell preprocesor z następującego kodu:

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

Więc teraz utworzeniu zmiennej w tym wątku o nazwie theNameOfYourNewProperty który ma wartość swojego theNameOfYourNewProperty własności systemu.W swoim badaniu można uzyskać dostęp to lubią:

${theNameOfYourNewProperty} 

i będzie pracować dla każdego wątku, a nie dopiero pierwszy wątek ..

7

JMeter Wtyczki ma Inter-Thread Communication do tego celu.

Istnieją 2 sposoby użycia:

  • postprocesora/preprocesor
  • Funkcje __fifoPut i __fifoPop

Moim zdaniem postprocesora/preprocesor jest łatwiejszy w użyciu.

+0

Powodem, dla którego preferuję zaakceptowaną odpowiedź, okazało się, że jeśli używam metody komunikacji między wątkami, mogę tylko "popchnąć" kolejkę raz i użyć wartości w jednym samplerze. Być może robiłem to źle, ale musiałem umieścić PreProcessor w danym samplerze (żądanie HTTP) i gdyby ten sampler był w pętli, działałby tylko jeden raz przed upływem czasu próbując odczytać kolejkę. – Joe

+1

@Joe to oczekiwane zachowanie zgodnie z dokumentacją Inter-Thread Communication. Jeśli chcesz użyć zmiennej umieszczonej kilka razy w kolejce FIFO, myślę, że możesz przypisać '$ {__ fifoPop (nazwa_kolejki, nazwa_zmiennej)}' do zmiennej lokalnej wątku w [Parametry użytkownika] (http://jmeter.apache.org/usermanual /component_reference.html#User_Parameters) preprocesor –

+0

@AndreyBotalov, Czy to rozwiązanie jest niezawodne? Wątki mogą czasami robić dziwne rzeczy, na przykład jeden wątek może po prostu pozostawać w tyle przez kilka minut, podczas gdy inne są uruchomione. Czy wtyczka ITC ma jakieś problemy z takimi sytuacjami? – Pacerier

11

Według dokumentacji JMeter:

16.12 zmienne Współdzielenie pomiędzy wątkami i grup nici

zmienne są lokalne dla wątku zmienna zestaw w jednym wątku nie może być odczytany w innego. Jest to zgodne z projektem. W przypadku zmiennych, które można określić przed rozpoczęciem testu, patrz Parameterising Tests (powyżej). Jeśli wartość nie jest znana aż do rozpoczęcia testów, istnieją różne opcje:

  1. przechowywać zmienna jako własność - właściwości są globalne do instancji JMeter
  2. zmienne zapisać do pliku i ponownie przeczytać im.
  3. Użyj nazw bsh.shared - patrz 16.8.2 Sharing Variables
  4. Napisz własne klasy Java

Innym sposobem przekazać zmienną między wątków jest użycie jmeter-plugins jako mentioned by Andrey Botalov below.

Ale odkryłem, że używanie go po raz pierwszy jest nieco mylące, ale daje pełną kontrolę nad zmienną podczas przejścia z wątku na wątek. za moim przykładem z wykorzystaniem BeanShell i zobaczysz jak łatwo jest:

Project stucture Następnie odnosząc się do odcinków na zdjęciu poniżej:

(1,1) Oto stworzyłem zmienną niestandardową w Użytkownik zdefiniowanych zmiennych (lub można zrobić to z BSF proccessor - niepełnosprawnych w tym przykładzie (1.2))

(2,1) (2,4) z powodzeniem stosować zmienną w pierwszym wątku - nic specjalnego :)

(2,2) Dodany BeanShell postprocesora i dostosowane moja zmienna

(2.3) Dodano do kolejki

(3.1) W drugim wątku - zmienna jest pobierana z kolejki - z dowolną nazwą.Ale bądź ostrożny, używaj rozsądnie limitu czasu, ponieważ ten wątek będzie czekał aż do poprzedniego zakończenia, aby mógł uzyskać zmienną zmienną (eksperyment z długą odpowiedzią)

(3.2) (3.3) (3,4) Te powtarzające się kroki używania i zmodyfikowanie zmiennej

(3.5) zmienna jest przesyłana ponownie w nowej kolejki - tak stanowią nową nazwę do niego

(4,1) (4,2) (4,3) Wzięłam zmodyfikowana zmienna od nowej kolejki działa jak uroku

Ostrzeżenie:

  1. Jeśli dodasz więcej wątków, dodaj trochę licznika do grupy wątków ze zmienną i dodaj tę nazwę zmiennej do nazwy kolejki - zrób to samo w grupie wątków, w której próbujesz przechwycić kolejkę, aby kolejka miała unikalną nazwę dla każdego wątku (napisz komentarz, jeśli potrzebujesz wyraźniejszego wyjaśnienia)

  2. Jeśli masz więcej niż jedno żądanie HTTP w jednej grupie wątków, dodaj procesor wstępny komunikacji wątkowej jako dziecko ostatniego (lub innego, jeśli chcesz osiągnąć jakąś niestandardową rzecz).

Graj, modyfikuj, dostosowuj, aby uzyskać najlepszy rezultat :) Dodawanie kolejnych wątków może spowodować niepożądane zachowanie, więc możesz d być czujnym.

Information about project structure

1

Innym rozwiązaniem jest użycie prostego serwera tabel do zarządzania zestawem danych. Ta funkcja dodała wtyczki 1.2 JMeter.

„Głównym pomysłem jest użycie mały serwer HTTP w JMeter Plugins zarządzać plikami zestawu danych za pomocą prostych poleceń dostać/dodać wierszy danych w plikach”

Spójrz na dokumentacji: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Pozdrawiam.

+0

Hmm, zamiast używać HTTP jako serwera proxy, dlaczego nie połączyć się bezpośrednio z bazą danych? – Pacerier

5

Znalazłem, co uważam za najprostszy sposób na zrobienie tego.

Zastosowanie

Bean Shell PostProcessor 

ustawić zmienną (http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)

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

LUB jeśli czytasz ze zmienną

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

a następnie z drugiej grupy wątku, przeczytaj przez (http://jmeter.apache.org/usermanual/functions.html#__property)

${__property(PC_CREATED_PROMO_CODE)} 
Powiązane problemy