1. Czym jest JMeter

W przypadku każdego projektu dużą rolę odgrywają testy. Niekiedy nawet kluczową, jak np. w modelu Extreme Programming.

Testy obejmują:

JMeter zapewnia kompleksową obsługę tych drugich, pozwalając symulować realny ruch użytkowników na wiele sposobów.

JMeter jest napisany w całości w Javie.

2. Istniejące rozwiązania

2.1. Rzeźbienie ręczne

Tego nigdy za wiele. Prawdopodobnie zawsze znajdzie się na tyle skomplikowany system, że skorzystanie z gotowej platformy do testowania będzie niewygodne. W tym celu korzysta się ze skryptów w:

C

Perl

Java

Python

2.2. Rozwiązania dedykowane

Po pierwsze, jest trochę rozwiązań komercyjnych, które są duże, fajne i drogie. Z tego ostatniego powodu nie będę ich opisywał, tu Google jest przyjacielem.

Z pozostałych warte wspomnienia:

Apache ab

tester serwerów HTTP. Dość prosty, z command line, dostarczany z serwerem Apache. Do zastosowań, które nie wymagają wiele więcej poza kilkoma zapytaniami GET i POST.

HTTPUnit

biblioteka stworzona do współpracy z JUnit, zastępująca przeglądarkę (pozwala tym samym na pracę bez GUI). Ponieważ jest to biblioteka, a nie gotowy soft, jest najbardziej użyteczna jako komponent do testowania

Microsoft WAS

wygodny interfejs użytkownika. Główna wada to fakt, że projekt się dalej nie rozwija.

JMeter

o tym dalej.

3. Dlaczego JMeter i skąd go wziąć

JMeter to środowisko do tworzenia testów, które:

Wady:

Pierwszy problem można ograniczyć przez stosowanie testowania wsadowego i zdalnego.

Strona domowa projektu:

http://jakarta.apache.org/jmeter/

Podręcznik:

http://jakarta.apache.org/jmeter/usermanual/

Download:

http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi

4. Instalacja i uruchamianie

Binarka przychodzi pod postacią pliku .tar.gz. Należy go rozpakować w wybranym katalogu. W podkatalogu bin/ są skrypty uruchamiające JMeter pod różnymi systemami: jmeter.bat i jmeter-server.bat pod Windows, jmeter i jmeter-server pod Linuksem.

4. Tworzenie planu testów

Plan testu zawiera listę kroków, które będą wykonane podczas testu. Pozwala równiez na przechowywanie zmiennych statycznych do których będą zapisywane wartości wyekstrahowane z odpowiedzi na zapytania.

Jest on hierarchiczny i do jego budowania są dostępne następujące składniki:

4.1. ThreadGroup

Każdy plan testu musi zawierać przynajmniej jedną grupę wątków. Grupy wątków są punktami startowymi testu - składniki wykonują się w ramach grupy wątków. Pozwala ona ustalić ilość wątków, czas tworzenia wątków (ramp-up period), ilość powtórzeń części testu.

4.2. Kontrolery

W Jmeter są dwa rodzaje kontrolerów:

Wszystkie one są szczegółowo opisane na stronie http://jakarta.apache.org/jmeter/usermanual/component_reference.html.

4.2.1. Samplers

Samplery wykonują żądania łącząc się z serverem WWW czy FTP. W Jmeter dostępne są m.in.:

4.2.2. Logic controllers

Pozwalają sterować przepływem wykonania składników potomnych planu (wykonanie warunkowe, pętle, wykonanie w przypadkowej kolejności). Kontrolery logiki można zagnieżdżać. Kilka przykładowych:

Once Only Controller

zawartość tego kontrolera będzie wykonana tylko w pierwszej iteracji testu. Przydatne np. do obsługi logowania.

IfController

zawartośc kontrolera będzie wykonana tylko gdy warunek jest spełniony. Warunki są fragmentami kodu w Javascript.

4.3. Assertions

Asercje pozwalają zweryfikować czy odpowiedź na zapytanie zawiera określone wyrażenie regularne. Można też zastosować asercje XPath, które pozwalają zwalidować odpowiedź na zapytanie przy użyciu DTD, lub wpisać zapytanie XPath i jeśli wynik jest niepusty przyjąć, że asercja jest prawdziwa.

4.4. Timers

Składniki pozwalające opóżnić lub zsynchronizować poszczególne operacje. Domyślnie JMeter wysyła zapytania bez przerwy, co może prowadzić do jego przeładowania. W JMeter dostępne są m.in:

Constant Timer

timer powodujący odczekanie stałą ilość czasu pomięcy zapytaniami.

Constant Throughput Timer

timer powodujący odczekanie zmienna ilość czasu obliczoną tak, żeby throughput byl stały.

4.5. Configuration elements

Składniki pozwalające uprościć tworzenie planu poprzez zgrupowanie ustawień konfiguracyjnych. Np. adres ip dla wszystkich zapytań servera HTTP może być taki sam. Wtedy zamiast każdemu elementowi HTTPRequest konfigurować adres ip servera wystarczy dodać do kontenera nadrzędnego HTTPRequestDefaults, gdzie będzie skonfigurowany adres ip serwera. Pozwala również na obsługe ciasteczek czy autentykacje przy użyciu HTTP Basic .

4.6. Listeners.

Składniki pozwalające zbierać wyniki np wyświetlić wykres (Graph Results) czy sprawdzić czy asercje są spełnione (Assertion Results). Może równiez być użyty w celu zapisania odpowiedzi na zapytania.

4.7. Pre-Processor Elements.

Składniki pozwalające wykonać jakąś akcję przed wykonaniem zapytania. Użyteczne np. w przypadku gdy sesja jest zawarta w URL.

4.8. Post-Processor Elements.

Analogicznie jak Pre-Processor Elements - pozwalają wykonać akcję po wykonaniu zapytania. Użyteczne do esktrahowania wartości z tekstu odpowiedzi.

5. Przykłady planów testowania.

5.1. Prosty plan HTTP: ustawienie języka i wyszukiwanie

5.2. HTTP Serwer i nagrywanie

6. Zadania

6.1. Testowanie zdalne - zadanie interaktywne

My wykonamy:

6.2. Kolejki JMS

  1. Otwórz plan JMS-Point-to-Point.jmx.

  2. W planie zdefiniowana jest asercja. Dodaj element, który pozwoli śledzić czy jest ona spełniona.

  3. Dodaj wykres obrazujący throughput testu.

  4. Dodaj raport agregujący i ustawiając ilość wątków na dość dużą ilośc (np. 100) oraz ilość powtórzeń na 10. Poeksperymentuj z wartościami timera oraz czasu oczekiwania na odpowiedź tak aby nie było błędów.

Uwaga. Najpierw należy ustawić brokerURL na swoj adres ip, odpalić activeQueue oraz odpalić programik JMSEcho, który będzie odpowiadał na wiadomości. Odpala się go poprzez run tcp://host:port example.Q.REQ example.Q.RPL. Kolejki są zdefiniowane w JNDI (dla JMetera).

6.3. Testowanie obciążeń FTP

Przeprowadź test porównawczy obciążenia kilku serwerów FTP: ftp.{$kraj}.debian.org, dla wartości {$kraj}: pl, us, de, cz, se, przez zalogowanie się na nie anonimowo po FTP i ściągnięcie jednego pliku. Wykorzystaj kontroler ForEach oraz zmienne do iteracji po kolejnych serwerach. Wykorzystaj AggregateGraph Listener do obserwacji wyników.