Logo Testów Wydajnościowych

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.