JMeter jest narzędziem służącym do testowania wydajności aplikacji. Poczętkowo został napisany do testowania aplikacji webowych, jednakże obecna wersja pozwala testować serwery ftp, http, serwlety, zapytania do baz danych oraz wiele innych. JMeter potrafi symulować duże obciązenie na serwerze, sieci lub bazie danych. Posiada narzędzia do graficznej reprezentacji wyników w postaci wykresów.
Obecna implementacja JMetera charakteryzuje się:
Możliwością testowania serwerów HTTP, FTP oraz zapytań do baz danych (przez JDBC).
Przenośnością, dzięki implementacji w javie.
Wielowątkowością dającą możliwość symulacji wielu użytkowników.
Listą przykładowych testów.
Możliwością generowania statystyk w postaci graficznych wykresów.
Możliwością parametryzacji danych wejściowych.
Dodatkową zaletą JMetera jest to iż binarna wersja po ściągnięciu nie potrzebuje żadnej instalacji. Można go uruchomić zaraz po rozpakowaniu archiwum.
Przegląd możliwości
Główne okno JMetera zaraz po uruchomieniu:
Po lewej stronie znajduje się drzewo elementów wchodzących w skład skryptu testowego, po prawej zaś szczegóły wybranego elementu.
Test Plan
Plan testów (test plan) reprezentuje kolejne kroki wykonywane przez skrypt JMeter'a podczas testowania wybranego źródła.
W skład planu testów może wejść:
thread group
logic conroller
sample generating controller
listener
timer
assertion
configuration element
Thread group
Grupa wątków jest elementem początkowym każdego planu testów. Każdy inny element musi być zawarty w jakiejś grupie, co pozwala nam na kontrolę współbieżności wykonywania się wątków. JMeter pozwala na kontrolę nad:
ilością wątków
czasem uruchamiania kolejnych wątków
liczbą uruchomień testu
Każdy wątek wykonuje testy niezależnie od innych, dzięki czemu można symulować współbieżność odwołań np do serwisu www. Możliwe jest ustalenie czasu jaki oddziela kolejne uruchomienia wątków w celu odzwierciedlenia jak najbardziej realnych warunków wykorzystania testowanego serwisu.
Logic controller
JMeter posiada dwa typy kontrolerów - logical controllers oraz samplers.
Samplers wysyłają żądanie do serwera, np HTTP. Logic controller daje kontrolę nad logiką testu w postaci decyzji o tym kiedy wysłać żądanie. Logic controller może posiadać "dzieci" w postaci elementów typu: sampler, logic controller lub configuration element. Dzięki takiej architekturze możliwa jest zmiana kolejności żądan przychodzących od potomnych elementów.
Poniżej przedstawiony jest przykładowy plan testów z wykorzystaniem logic controllera:
Test Plan
Thread Group
Once Only Controller
# Login Request (an HTTP Request )
Load Search Page (HTTP Sampler)
Interleave Controller
# Search "A" (HTTP Sampler)
# Search "B" (HTTP Sampler)
# HTTP default request (Configuration Element)
HTTP default request (Configuration Element)
Cookie Manager (Configuration Element)
Sample generating controller
Sample generating controlers lub inaczej samplers to gotowe mechanizmy wysyłania żądań do różnych serwerów. Aktualna implementacja JMetera posiada następujące mechanizmy:
FTP Request
HTTP Request
JDBC Request
Java object request
LDAP Request
SOAP/XML-RPC Request
WebService (SOAP) Request (Alpha Code)
Listener
Listener dostarcza informacji dotyczących wyników testów wykonywanych przez JMeter. Proste listenery np. Graph Result potrafią generować wyniki w postaci graficznej w czasie działania scryptów JMetera.
Dodatkowo listener posiada możliwość zbierania informacji do pliku w celu późniejszego ich wykorzystania.
Listener można dodać w każdym miejscu planu testów.
Timer
Domyślnie wątki JMetera wysyłają żądania w zadeklarowanej kolejności bez robienia przerw pomiędzy żądaniami. Czasami chcielibyśmy. wprowadzić opróźnienie pomiędzy kolejnymi żądaniami -- z pomocą przyjdzie nam Timer. Timer pozwala na ustalenie przerwy czasowej pomiędzy uruchamianymi testami.
Assertion
Asercje pozwalają na kontrolę zwracanych przez serwer wyników. Dzięki asercjom można przetestować aplikację pod kontem poprawności zwracanych danych.
JMeter pozwala na sprawdzanie wyniki zwróconego na konkretne żądanie. Wynik może być przeparsowany w poszukiwaniu wyrażenia regularnego.
HTTP Proxy
Ręczna budowa testów szczególnie skomplikowanych serwisów byłaby bardzo czasochłonna, dlatego JMeter posiada możliwość "nagrania" własnego scenariusza testowego. Jedynie co trzeba zrobić to ustawić w przeglądarce jak serwer proxy ip i port na których nasłuchuje JMeter.
Aby nie zaciemniać wyników testów możliwe jest pomijanie żądań do niektórych plików (np. pliki graficzne).
JMeter pozwala parametryzować wysyłane żądania. Np zamiast konkternego serwera XXX możemy mieć zmienną $(server) i później za pomoca odpowiedniej wbudowanej funkcji pobrać np. z pliku nazwę serwera. To samo dotyczy wartości wysyłanych za pomocą formularza.
Tryb serwera
Aby zbliżyć wyniki testow do rzeczywistych warunków istnieje możliwość podłączenia GUI JMetera do wielu JMeterów pracujących w trybie serwer. Uruchamiając wiele serwerów na różnych maszynach testujących zyskujemy:
Wyniki zbliżone do rzeczywistych warunków dzięki pominięciu wąskiego gardła jakim jest sieć i maszyna testująca
Szybki dostęp z GUI
Możliwość zapisywania planów testów na lokalnej maszynie
Możliwość zarządzania wieloma serwerami z lokalnej maszyny
Apache posiada wbudowane narzędzie ApacheBench. Pozwala ono na mierzenie wydajności serwera poprzez wysyłanie
do niego w krótkich okresach czasu żądań HTTP. Po przeprowadzeniu testu zwracana jest szczegółowa statystyka.
Program znajduje się w katalogu z Apache'm w folderze bin.
Program wywołujemy z linii poleceń, jego najważniejsze parametry to:
n - ilość zapytań
c - ilość zapytań w tym samym czasie
k - wymusza użycie stałego połączenia - HTTP KeepAlive
Spowoduje ono pobranie pliku ab_test.php z serwera www.example.org 100 razy, przy czym w jednym czasie będą przeprowadzane 3 połączenia..
Program ten jest często wykorzystywany do przeprowadzania benchmarków wielu skryptów napisanych np. w PHP.
Sprawdza się doskonale do szybkiego przetestowania wydajności jednego konkretnego adresu.
Ta prostota jest przydatna, kiedy chcemy coś szybko sprawdzić a nie chcemy tracić czasu na naukę korzystania z bardziej wyspecjalizowanych narzędzi.
WebInject jest darmowym narzędziem napisanym w Perlu (może być uruchomione na każdej maszynie z zainstalowanym interpreterem Perla).
Możliwe jest korzystanie z aplikacji zarówno przy pomocy GUI jak i z linii poleceń.
Narzędzie używa plików XML do definiowania swoich testów (config.xml definiujący gdzie znajduje się plik z testami oraz
właściwy plik z serią znaczników xml - jeden znacznik odpowiada jednemu testowi) co wiąże się z pracochłonną specyfikacją
kolejnych testów. Ponadto narzędzie umożliwia testowanie poprawności odpowiedzi serwera WWW poprzez wyszukiwanie wzorca w
zawartości otrzymanej strony oraz mierzenie czasów odpowiedzi.
Badboy prezentuje trochę inne podejście do tematyki testów. Zamiast pisać żmudne scenariusze testowe program umożliwia symulowanie
działania przeglądarki - zdarzenia wykonane przez użytkownika są "podsłuchiwane", zapamiętywane a następnie mogą być odtworzone.
Niestety do swojej pracy wykorzystuje przeglądarkę Internet Explorer tym samym jest to narzędzie praktycznie nieprzenośne.
Pobierz przykładową bazę danych oraz sterownik do niej,
który należy skopiować do katalogu lib JMetera.
Utwórz w swoim planie testów elementy JDBC Request oraz JDBC Connection Configuration.
Uzupełnij odpowiednio pola:
Database URL
jdbc:hsqldb:'sciezka_do_bazy' np. jdbc:hsqldb:/tmp/baza
JDBC Driver Class
org.hsqldb.jdbcDriver
Username
sa
i uruchom test (przykładowe zapytanie - SELECT * FROM ADDRESS WHERE FIRSTNAME='Bill')
Ćwiczenia
Przed rozpoczęciem wykonywania ćwiczeń należy:
- zainstalować na komputerze w laboratorium tomcata (http://tomcat.apache.org/download-55.cgi#5.5.17).
- pobrać plik z testem i rozpakować go w podkatalogu webapps.
- do CLASSPATH dodać plik (tomcat-root)/common/lib/servlet-api.jar
- plik serwletu Sservlet.java znajduje się w katalogu test/WEB-INF/classes (plik jest ten jedynie szkieletem do dalszych działań)
- po dokonaniu zmian w kodzie kompilujemy plik standardowym poleceniem javac Sservlet.java
poprawić kod serwletu tak aby odpowiedzią na co n-te żądanie był wysyłany błąd
spraw aby serwlet nie wysyłał od razu odpowiedzi na żadanie ale czekał kilka sekund. Sprawdz za pomoca Duration Assertion
działanie swojego serwletu
napisz serwlet wypisujący wszystkie ciasteczka, nagłówki i parametry które przyszły wraz z żądaniem a następnie dodaj odpowiednie
elementy JMetera, które będą przesyłać wraz z żądaniem dodatkowe nagłówki i ciasteczka.
Do wykonania zadania przydatne mogą się okazać metody z klas
HttpServletResponse
oraz HttpServletRequest
uruchom żądanie do dowolnej strony wewnątrz Once Only Controller, który będzie znajdował się wewnątrz Loop Controllera - każ Loop Controllerowi
wykonać kilka iteracji - zobacz ile iteracji się faktycznie wykonało
weż jeden z przykladów pokazujących działanie Interleave Controller i zbuduj identyczny Test Group zamieniając Interleave Controller na
Random Controller - porównaj rezultaty
napisz serwlet, który otrzymawszy w parametrze jakiś napis, zwróci jego odpowiednik gdzie wszystkie litery bedą duże, sprawdż jego dziaąanie za pomocą
Response Assertion
prześlij wraz z żądaniem dowolny mały plik i sprawdź w kodzie serwletu jego typ oraz rozmiar (w przypadku pliku tesktowego można go również wypisać)
wczoraj mieliśmy dzień dziecka więc zachęcamy do pobawienia się tym narzędziem i sprawdzenia co ono potrafi na własną rękę ;-)