Sobes.tech
Junior

Opowiedz o testach obciążeniowych.

sobes.tech AI

Odpowiedź od AI

Testy obciążeniowe to rodzaj testów mających na celu określenie wydajności, stabilności i skalowalności aplikacji (systemu) przy różnych obciążeniach.

Cele testów obciążeniowych:

  • Określenie granicznego obciążenia, które system wytrzymuje.
  • Wykrycie "wąskich gardeł".
  • Ocena czasu reakcji systemu przy zadanym obciążeniu.
  • Sprawdzenie stabilności działania systemu w dłuższym okresie pod obciążeniem.
  • Sprawdzenie skalowalności systemu.

Rodzaje testów obciążeniowych:

  • Test obciążeniowy (Load Testing): Sprawdzenie zachowania systemu przy oczekiwanym (normalnym) poziomie obciążenia.
  • Test stresowy (Stress Testing): Sprawdzenie systemu przy obciążeniu przekraczającym normalne, do momentu awarii. Celem jest określenie granic wytrzymałości.
  • Test wytrzymałości/długości (Endurance/Soak Testing): Sprawdzenie stabilności systemu przy długotrwałym działaniu średniego lub wysokiego obciążenia, wykrycie wycieków pamięci, degradacji wydajności z czasem.
  • Test szczytowego obciążenia (Spike Testing): Sprawdzenie zachowania systemu przy nagłym, jednorazowym zwiększeniu obciążenia.
  • Test skalowalności (Scalability Testing): Ocena zdolności systemu do obsługi rosnącego obciążenia poprzez skalowanie poziome lub pionowe zasobów.
  • Test objętości (Volume Testing): Sprawdzenie zachowania systemu przy wzroście ilości danych w bazie danych lub innych magazynach.

Etapy przeprowadzania testów obciążeniowych:

  1. Określenie celów: Jasne zdefiniowanie metryk wydajności (czas reakcji, przepustowość, liczba błędów) i kryteriów sukcesu.
  2. Planowanie i projektowanie scenariuszy: Analiza scenariuszy użytkowników, określenie profilu obciążenia (liczba wirtualnych użytkowników, intensywność zapytań).
  3. Tworzenie skryptów testowych: Pisanie skryptów symulujących działania użytkowników z użyciem narzędzi do testów obciążeniowych.
  4. Przygotowanie środowiska testowego: Konfiguracja środowiska testowego, symulującego środowisko produkcyjne.
  5. Wykonanie testów: Uruchomienie testów z różnym obciążeniem.
  6. Monitorowanie i zbieranie danych: Zbieranie metryk wydajności systemu, serwerów, baz danych.
  7. Analiza wyników i raportowanie: Porównanie wyników z celami, wykrycie problemów, przygotowanie raportu.

Narzędzia do testów obciążeniowych:

  • JMeter
  • LoadRunner
  • Gatling
  • k6
  • Locust

Przykład prostego skryptu JMeter (HTTP Request):

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test obciążeniowy dla przykładu">
      <hashTree>
        <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Grupa wątków">
          <intProp name="ThreadGroup.num_threads">100</intProp>
          <intProp name="ThreadGroup.ramp_time">10</intProp>
          <longProp name="ThreadGroup.duration">60</longProp>
          <boolProp name="ThreadGroup.scheduler">true</boolProp>
          <hashTree>
            <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Przykład żądania HTTP">
              <stringProp name="HTTPSampler.domain">example.com</stringProp>
              <stringProp name="HTTPSampler.path">/</stringProp>
              <stringProp name="HTTPSampler.method">GET</stringProp>
              <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
              <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
              <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
              <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
              <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">false</boolProp>
              <boolProp name="HTTPSampler.embedded_url_report">true</boolProp>
              <boolProp name="HTTPSampler.connect_timeout"></boolProp>
              <boolProp name="HTTPSampler.response_timeout"></boolProp>
              <stringProp name="HTTPSampler.protocol">https</stringProp>
              <stringProp name="HTTPSampler.contentEncoding"></stringProp>
              <stringProp name="HTTPSampler.comment"></stringProp>
              <stringProp name="HTTPSampler.port"></stringProp>
              <stringProp name="HTTPSampler.image_parser">true</stringProp>
              <stringProp name="HTTPSampler.concurrentDwn">Both</stringProp>
              <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
              <stringProp name="HTTPSampler.implementation_status">OK</stringProp>
              <boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
              <listProp name="HTTPSampler.HTTP_HEADERS"></listProp>
            </HTTPSamplerProxy>
            <hashTree/>
          </hashTree>
        </hashTree>
      </hashTree>
    </TestPlan>
  </hashTree>
</jmeterTestPlan>

Metryki zbierane podczas testów obciążeniowych:

  • Czas reakcji
  • Przepustowość
  • Liczba błędów na sekundę
  • Liczba zapytań na sekundę
  • Wykorzystanie CPU
  • Użycie pamięci
  • Aktywność dysku
  • Aktywność sieciowa
  • Metryki bazy danych

Testy obciążeniowe pomagają zapobiegać awariom systemu w produkcji pod dużym obciążeniem i zapewniają akceptowalny poziom jakości dla końcowych użytkowników.