Dlaczego testowanie wydajności jest ważne?
Wyobraź sobie sytuację: Twoja aplikacja działa świetnie podczas developmentu, ale po wejściu na produkcję zaczyna się zawiesać gdy pojawi się więcej użytkowników. To klasyczny problem braku testów wydajności.
Apache JMeter rozwiązuje ten problem, pozwalając symulować realne obciążenie jeszcze przed wdrożeniem na produkcję.
Co się nauczysz z tego artykułu
- Jak zainstalować i skonfigurować JMeter na swoim komputerze
- Tworzenie pierwszego testu obciążeniowego dla aplikacji webowej
- Konfigurowanie Thread Groups i symulowanie różnej liczby użytkowników
- Dodawanie HTTP Request samplerów i konfigurowanie parametrów
- Interpretowanie wyników testów i identyfikowanie problemów wydajności
- Najlepsze praktyki testowania wydajności w środowisku deweloperskim
Wymagania wstępne
Potrzebujesz: Podstawowej znajomości aplikacji webowych, protokołu HTTP i requestów/responses
Środowisko: Java 8 lub nowsza, dowolna aplikacja webowa do testowania
Czym jest Apache JMeter?
Apache JMeter to open-source’owe narzędzie stworzone pierwotnie do testowania aplikacji webowych, ale rozrosło się do uniwersalnego narzędzia do testowania wydajności różnych protokołów i technologii.
JMeter działa na zasadzie symulowania wirtualnych użytkowników (threads), którzy wykonują zdefiniowane przez nas akcje – wysyłają requesty HTTP, łączą się z bazami danych, czy wywołują web services.
Instalacja i pierwsze uruchomienie
JMeter wymaga Java 8 lub nowszej. Instalacja jest prosta:
# 1. Pobierz JMeter z oficjalnej strony Apache wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-4.0.tgz # 2. Rozpakuj archiwum tar -xzf apache-jmeter-4.0.tgz # 3. Przejdź do katalogu bin cd apache-jmeter-4.0/bin # 4. Uruchom JMeter (GUI mode) ./jmeter # Linux/Mac alternatywnie: sh jmeter.sh
Po uruchomieniu pojawi się graficzny interfejs JMeter z pustym Test Planem.
Tworzenie pierwszego testu obciążeniowego
Każdy test w JMeter składa się z kilku podstawowych elementów:
1. Thread Group – symulacja użytkowników
Kliknij prawym przyciskiem na Test Plan → Add → Threads (Users) → Thread Group.
Kluczowe ustawienia Thread Group:
Parametr | Opis | Przykład |
---|---|---|
Number of Threads | Ile użytkowników symulować | 10 (dla pierwszego testu) |
Ramp-Up Period | W ciągu ilu sekund „uruchomić” wszystkich użytkowników | 30 sekund |
Loop Count | Ile razy każdy użytkownik wykona test | 5 |
2. HTTP Request Sampler
Kliknij prawym na Thread Group → Add → Sampler → HTTP Request.
Podstawowa konfiguracja HTTP Request:
Server Name: localhost Port Number: 8080 HTTP Request: GET Path: /api/users # Dla REST API z parametrami: Path: /api/users/${userId} Parameters: - Name: page, Value: 1 - Name: size, Value: 20
3. Listener – przeglądanie wyników
Kliknij prawym na Thread Group → Add → Listener → View Results Tree.
Uruchomienie pierwszego testu
1. Zapisz Test Plan (Ctrl+S)
2. Kliknij zielony przycisk „Start” (lub Ctrl+R)
3. Obserwuj wyniki w View Results Tree
Przykładowe wyniki które zobaczysz:
Sample: HTTP Request Response Code: 200 Response Time: 245ms Response Size: 1,247 bytes Thread Name: Thread Group 1-1
Interpretowanie wyników testów
Kluczowe metryki wydajności
Metryka | Jednostka | Co oznacza | Dobra wartość |
---|---|---|---|
Response Time | ms | Czas odpowiedzi serwera | < 200ms dla API |
Throughput | req/sec | Ile requestów obsłużono na sekundę | Zależne od aplikacji |
Error Rate | % | Procent nieudanych requestów | < 1% |
90th Percentile | ms | 90% requestów było szybszych niż X | < 500ms |
Dodawanie lepszych listenerów
View Results Tree jest świetny do debugowania, ale dla analizy wydajności lepsze są:
1. **Summary Report**: Thread Group → Add → Listener → Summary Report
2. **Aggregate Graph**: Thread Group → Add → Listener → Aggregate Graph
Praktyczne scenariusze testowania
Testowanie REST API
Typowy scenariusz dla REST API:
# HTTP Request 1: Lista użytkowników GET /api/users Accept: application/json # HTTP Request 2: Tworzenie użytkownika POST /api/users Content-Type: application/json Body: { "name": "Jan Kowalski", "email": "jan@example.com" } # HTTP Request 3: Aktualizacja użytkownika PUT /api/users/1 Content-Type: application/json Body: { "name": "Jan Nowak", "email": "jan.nowak@example.com" }
Dodawanie HTTP Header Manager
Kliknij prawym na HTTP Request → Add → Config Element → HTTP Header Manager.
Dodaj typowe nagłówki:
– Content-Type: application/json
– Accept: application/json
– Authorization: Bearer ${token} (jeśli potrzebne)
Częste problemy i rozwiązania
Problem: Bardzo wolne response times
**Możliwe przyczyny:**
1. Za dużo użytkowników zbyt szybko (zmniejsz threads lub zwiększ ramp-up)
2. Aplikacja rzeczywiście jest wolna (sukces testu!)
3. Baza danych nie jest zoptymalizowana pod obciążenie
Problem: Błędy 500/503
**Sprawdź:**
1. Logi aplikacji – co dokładnie się dzieje
2. Czy baza danych ma wystarczające połączenia
3. Czy serwer ma wystarczające zasoby (RAM, CPU)
Najlepsze praktyki dla początkujących
1. Zacznij od małego
– Pierwszy test: 5-10 użytkowników
– Stopniowo zwiększaj obciążenie
– Obserwuj kiedy aplikacja zaczyna zwalniać
2. Testuj realistyczne scenariusze
– Nie tylko GET requesty
– Dodaj typowe operacje CRUD
– Symuluj prawdziwe wzorce użytkowania
3. Monitoruj zasoby serwera
Podczas testów sprawdzaj:
– CPU usage
– Memory usage
– Database connections
– Network I/O
JMeter vs inne narzędzia
Narzędzie | Zalety | Wady | Najlepsze dla |
---|---|---|---|
JMeter | Darmowy, GUI, wszechstronny | Może być zasobożerny | Funkcjonalne i obciążeniowe |
LoadRunner | Enterprise features | Bardzo drogi | Duże organizacje |
Gatling | Wysoka wydajność | Wymaga programowania | Programiści Scala/Java |
ab (Apache Bench) | Prosty, szybki | Tylko podstawowe HTTP | Szybkie testy GET |
Zacznij od 10-50 użytkowników jednocześnie. To często wystarczy żeby znaleźć podstawowe problemy wydajności. Liczba zależy od oczekiwanego ruchu – jeśli spodziewasz się 100 użytkowników dziennie, testuj 20-30 jednoczesnych.
Tak, ale pamiętaj że wyniki będą inne niż na produkcji. Localhost nie ma opóźnień sieciowych i może mieć inne zasoby. Użyj tego do znajdowania podstawowych problemów kodu.
Dla podstawowych testów: 5-15 minut wystarczy. Dla testów wytrzymałościowych: 1-24 godziny. Zacznij od krótkich testów żeby upewnić się że konfiguracja jest poprawna.
Najczęściej memory leak, problemy z garbage collection, lub zapełniające się logi. To dobry znak że znalazłeś problem który mógłby się pojawić na produkcji!
Tak! JMeter obsługuje JDBC (bazy danych), JMS (message queues), LDAP, SOAP, FTP i wiele innych protokołów. HTTP to tylko najbardziej popularne zastosowanie.
Dodaj Simple Data Writer listener: Thread Group → Add → Listener → Simple Data Writer. Wybierz plik CSV gdzie zapisać wyniki. Możesz potem otworzyć w Excel czy Google Sheets.
Najprawdopodobniej za mało pamięci. Zwiększ heap size: edytuj jmeter.bat/jmeter.sh i zmień -Xms512m -Xmx512m na -Xms1g -Xmx2g. Albo zmniejsz liczbę threadów.
Przydatne zasoby
- Oficjalna dokumentacja JMeter
- JMeter Best Practices Guide
- BlazeMeter JMeter Tutorial
- Guru99 JMeter Course
🚀 Zadanie dla Ciebie
Challenge: Stwórz test obciążeniowy dla swojej ulubionej publicznej REST API (np. JSONPlaceholder). Skonfiguruj 20 użytkowników, którzy przez 5 minut będą wykonywać rotacyjnie operacje GET, POST i PUT. Przeanalizuj wyniki i określ przy jakiej liczbie równoczesnych użytkowników API zaczyna zwalniać. Wyniki opublikuj w komentarzach!
Bonus: Dodaj HTTP Cookie Manager i sprawdź jak zmienia to wydajność testów.
Testowanie wydajności to umiejętność która odróżnia dobrych developerów od świetnych. JMeter daje Ci narzędzia żeby znajdować problemy zanim znajdą je Twoi użytkownicy. Jakieś pytania o JMeter? A może masz ciekawe wyniki testów które chciałbyś omówić?