Poniższy artykuł rozpoczyna serię wpisów poświęconych Apache JMeter, jednemu z najpopularniejszych narzędzi do testowania wydajności aplikacji webowych. Na wstępie przybliżę, czym jest to narzędzie oraz omówię jego główne zalety i wady. Następnie napiszemy prosty test, który uruchomimy. Do celów demonstracyjnych wykorzystamy nasz fikcyjny sklep internetowy, dostępny tutaj.
UWAGA
Prosimy o nieuruchamianie profili wydajnościowych, które udostępniamy, na więcej niż jednym wątku. Obciążanie naszego serwisu intensywnymi testami może negatywnie wpływać na jego stabilność oraz dostępność dla innych użytkowników. Dziękujemy za zrozumienie i współpracę.
Podstawy
Apache JMeter to oprogramowanie open-source przeznaczone do testowania wydajnościowego różnych systemów, w tym aplikacji webowych, mobilnych, serwerów oraz interfejsów API. Dzięki swojej wszechstronności, łatwości użycia oraz dostępności, JMeter cieszy się popularnością wśród testerów zajmującymi się testami wydajnościowymi. W kolejnych artykułach przyjrzymy się również innym narzędziom dostępnym na rynku, aby zaoferować bardziej kompleksowy przegląd dostępnych opcji.
Możliwości
- Testowanie obciążeniowe: mamy możliwość symulować duże obciążenie użytkowników w celu sprawdzenia wydajności systemu.
- Testowanie wydajnościowe: możemy mierzyć czas odpowiedzi, przepustowość i inne parametry wydajnościowe.
- Testowanie funkcjonalne: może być używany do testowania funkcjonalności aplikacji webowych i mobilnych.
- Testowanie protokołów: obsługuje wiele protokołów, takich jak HTTP, HTTPS, FTP, JDBC i SOAP.
- Testy API: możemy napisać testy API, które będą weryfikować poprawność zwracanych danych.
- Testy Integracyjne: wsparcie przy testach integracyjnych, poprzez generowanie dużej ilości komunikatów testowych.
Zalety
- Open-source: JMeter jest darmowy i dostępny dla każdego.
- Łatwość użycia: JMeter ma intuicyjny interfejs graficzny, który ułatwia tworzenie i uruchamianie testów.
- Wszechstronność: JMeter może być używany do testowania różnych typów systemów oraz testów.
- Rozszerzalność: JMeter można rozszerzać za pomocą wtyczek i skryptów.
Wady
- Krzywa uczenia się: Początkujący użytkownicy mogą napotkać wyzwania, ucząc się korzystać z JMetera ze względu na obfitość dostępnych modułów i opcji konfiguracji. Wymaga to pewnego czasu i praktyki, aby w pełni opanować to narzędzie.
- Brak graficznych raportów: JMeter nie generuje domyślnie graficznych raportów.
- Praca zespołowa: Narzędzie udostępnia zazwyczaj jeden plik w formacie .jmx, który jest mało czytelny i zmiana np. położenia jednego z elementu powoduje zmiany w kilku wierszach, co może być problematyczne przy rozwiązywaniu konfliktów przy wprowadzaniu zmian w kodzie.
Nasz pierwszy test
Zanim napiszemy nasz pierwszy test, musimy pobrać i zainstalować naszego JMetera. Do uruchomienia testu potrzebować będziemy również Javę. JMetera pobieramy z oficjalnej strony TUTAJ. Pisząc profil wydajnościowy będę używał wersji Apache JMeter 5.6.3 wraz z Javą 17.
Uruchomienie programu
Windows: Wchodzimy do folderu, w którym wypakowaliśmy pobrany plik, a następnie przechodzimy do poniższej ścieżki i uruchamiamy plik jar.
"....\apache-jmeter-5.6.3\bin\ApacheJMeter.jar"
Linux: Uruchamiamy wpisując poniższe komendy w konsoli
cd Downloads/apache-jmeter-5.6.3/bin
./jmeter
Dodanie pierwszych elementów
Po uruchomieniu mamy pusty profil. Na początku dodamy trzy elementy, które omówimy w dalszej części.
Dodajemy Thread Group klikając prawy przycisk myszy na elemencie Test Plan:
Add -> Threads (Users) -> Thread Group
Dodajemy HTTP Request kilkając prawy przycisk myszy na elemencie Thread Group:
Add -> Sampler -> HTTP Request
Dodajemy View Results Tree klikając prawy przycisk myszy na elemencie Thread Group:
Add -> Listener -> View Results Tree
Wynik powinien być zgodny z poniższym zdjęciem.

Opis pierwszych elementów
Pierwszym elementem, którym dodaliśmy był: Thread Group. Jest to podstawowy element, który definiuje grupę wątków symulujących użytkowników lub zapytania wysyłane do aplikacji, którą testujemy.

Poniżej opiszę podstawowe funkcję Thread Group w JMeterze:
- Number of Threads (Users): Liczba wątków, które będą symulowane. Każdy wątek działa niezależnie i symuluje osobnego użytkownika. W naszym przypadku jest to 1 wątek.
- Ramp-Up Period: Czas (w sekundach), w którym wszystkie wątki zostaną uruchomione. W naszym przypadku jest to 1 sekunda. Czyli w 1 sekundę uruchomimy wszystkie wątki, które zdefiniowaliśmy powyżej.
- Loop Count: Liczba powtórzeń, jakie każdy wątek ma wykonać. Można ustawić na określoną liczbę lub na wartość „infinite”, aby wątki działały w nieskończoność.
- Scheduler: Opcja pozwalająca na ustawienie harmonogramu uruchamiania Thread Group, co pozwala na precyzyjne określenie startu i czasu trwania testów.
- Duration: Określa całkowity czas działania Thread Group. Gdy ustawimy Loop Count na nieskończoność, powinniśmy także określić czas trwania testu, aby zakończył się on automatycznie po upływie określonego okresu.
Kolejny element, który dodaliśmy, czyli HTTP Request definiuje konkretne żądanie HTTP, które będzie wysyłane przez wątki w Thread Group. Można zdefiniować różne typy żądań (GET, POST, PUT, DELETE itp.), a także ustawić jego parametry. W naszym przykładzie wprowadziliśmy:
- Protocol [http]: https. Ustawiamy https, a nie http, ponieważ serwis używa protokołu SSL/TLS (Secure Sockets Layer / Transport Layer Security) do szyfrowania danych przesyłanych między przeglądarką a serwerem.
- Serwer Name or IP: playground.quality-frontiers.pl jest to nasz adres do serwisu, którego wydajność chcemy sprawdzić.
Ostatnim elementem, który dodaliśmy był View Results Tree, czyli najczęściej używany listener w JMeterze, który pozwala na szczegółową analizę wyników testów wydajnościowych i obciążeniowych. Z jego pomocą możemy zobaczyć odpowiedzi serwera oraz szczegółowe informacje na temat każdego żądania. Rekomenduje użycie go tylko do debugowania. Gdy jest on włączony podczas testów z dużą ilością wątków, może powodować znaczne zużycie pamięci.
Uruchamiamy nasz test
Dobrą praktyką jest zapisanie naszego scenariusza. Wchodzimy więc do File -> Save Test Plan as i wybieramy ścieżkę, gdzie chcemy zapisać plik.
Po pozytywnym zapisaniu uruchamiamy nas test. Przypominamy, że test jest ustawiony na 1 wątek (użytkownika), który wykona 1 zapytanie o stronę główną naszego serwisu,

Po wykonaniu testu wchodzimy w element View Results Tree i weryfikujemy czy test się wykonał poprawnie. Zielona ikonka sugeruje nam poprawność wykonania zapytania. Możemy podejrzeć jak wyglądało zapytanie (Request) oraz nasza odpowiedź (Response data). W odpowiedzi widzimy, że jest to kod HTML.

Jmeter pozwala również przetworzenie kodu HTML na widok zbliżony do tego co widzimy w przeglądarkach internetowych. Zmieniamy pole „Text” na HTML (download resources)

Podsumowanie
W powyższym artykule napisaliśmy prosty test, który pozwala nam zapoznać się z podstawowymi elementami w JMeterze. W kolejnych artykułach z tej serii będziemy stopniowo rozwijać profil, poznając jednocześnie nowe elementy programu oraz najlepsze praktyki. Zapisany profil możecie znaleźć na naszym repozytorium na Gitlab.