Sobes.tech
Junior

Czym jest paralelizacja?

sobes.tech AI

Odpowiedź od AI

Paralelizacja w kontekście testowania to jednoczesne wykonywanie kilku scenariuszy testowych na różnych środowiskach, przeglądarkach lub urządzeniach.

Jej głównym celem jest skrócenie łącznego czasu wykonania zestawu testów.

Zalety:

  • Przyspieszenie: Testy są wykonywane znacznie szybciej, co pozwala na częstsze uruchamianie pełnych zestawów regresji.
  • Wydajność: Optymalne wykorzystanie dostępnych zasobów (CPU, RAM).
  • Elastyczność: Pozwala na testowanie aplikacji w różnych konfiguracjach jednocześnie (np. Chrome na Windows i Firefox na macOS).

Wady:

  • Złożoność konfiguracji: Wymaga poprawnej konfiguracji infrastruktury testowej.
  • Zarządzanie zależnościami: Należy unikać zależności między testami, które mogą powodować niepożądane skutki uboczne podczas równoległego wykonywania.
  • Debugowanie: Debugowanie testów uruchamianych równolegle może być trudniejsze.

Implementacja często opiera się na:

  • Narzędziach do automatyzacji testów z wbudowanym wsparciem dla paralelizacji (np. Selenium Grid, Playwright, Cypress).
  • Frameworkach testowych obsługujących równoległe wykonywanie (np. JUnit, TestNG, Pytest).
  • Systemach CI/CD, które mogą uruchamiać zadania testowe równolegle na wielu agentach.

Przykład na TestNG:

// testng.xml
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="MySuite" parallel="tests" thread-count="2"> // <-- parallel="tests" i thread-count="2"
    <test name="TestOnChrome">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="com.example.tests.LoginTest"/>
            <class name="com.example.tests.ProductTest"/>
        </classes>
    </test>
    <test name="TestOnFirefox">
        <parameter name="browser" value="firefox"/>
        <classes>
            <class name="com.example.tests.LoginTest"/>
             <class name="com.example.tests.ProductTest"/>
        </classes>
    </test>
</suite>

Przykład z Pytest:

# conftest.py
import pytest

def pytest_addoption(parser):
    parser.addoption("--browser", action="store", default="chrome", help="przeglądarka do uruchomienia testów")

@pytest.fixture
def browser(request):
    return request.config.getoption("--browser")

# test_example.py
def test_login(browser):
    print(f"Testowanie logowania na {browser}") # Logowanie dla przykładu
    assert True

def test_product(browser):
    print(f"Testowanie strony produktu na {browser}") # Logowanie dla przykładu
    assert True

# Uruchomienie z paralelizacją
# pytest -n 2 --dist=loadfile --browser=chrome test_example.py & pytest -n 2 --dist=loadfile --browser=firefox test_example.py
# lub z pytest-xdist
# pytest -n auto --dist=loadfile test_example.py --browser=chrome --browser=firefox

Strategia paralelizacji (według metod, klas, testów, zestawów) zależy od architektury frameworka testowego i wymagań projektu. Ważne jest, aby testy były niezależne od siebie i nie wpływały na stan środowiska nawzajem.