Testy wydajnościowe: Nowoczesny przewodnik
Testy wydajnościowe (Performance Testing) to kategoria testów niefunkcjonalnych, których celem jest weryfikacja i ocena, jak system lub aplikacja zachowuje się pod określonym obciążeniem. W przeciwieństwie do testów funkcjonalnych, które sprawdzają, czy aplikacja działa poprawnie, testy wydajnościowe odpowiadają na pytania: jak szybko, jak stabilnie i jak efektywnie działają nasze systemy informatyczne. Ich celem jest identyfikacja i eliminacja "wąskich gardeł" (bottlenecks), zanim staną się one problemem dla użytkowników.
Kluczowe Mierzone Metryki
Wyniki testów wydajnościowych są analizowane na podstawie kilku kluczowych metryk:
- Czas odpowiedzi (Response Time): czas, jaki upływa od momentu wysłania żądania do otrzymania pełnej odpowiedzi. Jest to podstawowa miara responsywności aplikacji z perspektywy użytkownika.
- Przepustowość (Throughput): liczba żądań, jaką system jest w stanie obsłużyć w danej jednostce czasu (np. żądania na sekundę). Jest to miara wydajności całego systemu.
- Wskaźnik błędów (Error Rate): procent żądań, które zakończyły się błędem (np. z kodem statusu HTTP 5xx) w stosunku do wszystkich wysłanych żądań.
- Zużycie zasobów: poziom wykorzystania zasobów sprzętowych (CPU, pamięć RAM, I/O dysku) na serwerach aplikacji i bazy danych.
Główne Typy Testów Wydajnościowych
W zależności od celu, wyróżniamy kilka typów testów wydajnościowych, które są kluczowe w budowie dedykowanych systemów:
- Testy obciążeniowe (Load Testing): weryfikacja, czy system działa zgodnie z oczekiwaniami pod normalnym i szczytowym przewidywanym obciążeniem. Pozwalają one określić, czy infrastruktura jest wystarczająca dla typowego ruchu.
- Testy przeciążeniowe (Stress Testing): znalezienie punktu krytycznego systemu poprzez stopniowe zwiększanie obciążenia powyżej normalnych limitów. Celem jest sprawdzenie, jak system zachowuje się w ekstremalnych warunkach i czy potrafi gracefully degradować swoją funkcjonalność.
- Testy wytrzymałościowe (Soak Testing): weryfikacja stabilności systemu pod normalnym obciążeniem, ale przez długi okres czasu (np. 8, 24 lub 48 godzin), w celu wykrycia problemów takich jak wycieki pamięci.
Popularne Narzędzia
Większość testów wydajnościowych aplikacji webowych jest przeprowadzana na poziomie protokołu (np. HTTP), a nie przez interfejs graficzny, co zapewnia znacznie większą skalowalność i powtarzalność.
- Apache JMeter: Jedno z najpopularniejszych narzędzi open-source, napisane w Javie. Posiada interfejs graficzny do tworzenia planów testów, jest niezwykle elastyczny i rozszerzalny dzięki wtyczkom.
- Gatling: Nowoczesne narzędzie, które zyskuje na popularności. Skrypty testowe pisze się w języku Scala, co pozwala na tworzenie bardzo złożonych i łatwych w utrzymaniu scenariuszy jako kodu.
- k6: Narzędzie skoncentrowane na wydajności i łatwości użycia, z testami pisanymi w języku JavaScript. Jest idealne dla zespołów, które chcą zintegrować testy wydajnościowe ze swoim istniejącym ekosystemem JavaScript.
Przykład Kodu - Test obciążeniowy w k6
Poniżej znajduje się prosty skrypt testu obciążeniowego napisany w JavaScript dla narzędzia k6. Symuluje on 10 wirtualnych użytkowników, którzy przez 30 sekund odpytują publiczne API.
import http from 'k6/http';
import { check, sleep } from 'k6';
// Konfiguracja testu
export const options = {
vus: 10, // Liczba wirtualnych użytkowników
duration: '30s', // Czas trwania testu
};
// Główna funkcja testowa
export default function () {
// Wykonaj żądanie GET do publicznego API
const res = http.get('https://test-api.k6.io/public/crocodiles/1/');
// Sprawdź, czy odpowiedź ma status 200 (OK)
check(res, { 'status was 200': (r) => r.status == 200 });
// Poczekaj 1 sekundę przed kolejnym żądaniem (symulacja "think time" użytkownika)
sleep(1);
}
Podsumowanie
Podsumowując, testy wydajnościowe są kluczowym elementem zapewnienia jakości i niezawodności oprogramowania. Pozwalają one zidentyfikować i wyeliminować "wąskie gardła" zanim staną się one problemem dla użytkowników, co jest niezbędne w każdym profesjonalnym systemie na zamówienie.