# Как вы запускаете параллельное выполнение тестов? Что такое ThreadLocal?

### 🔹 Как запускать тесты параллельно

Есть несколько подходов:

1. **Pytest + `pytest-xdist`**

   * Самый распространённый вариант для Python.
   * Параллельный запуск через `-n` (количество воркеров).

   ```bash
   pytest -n 4   # запустит тесты в 4 потоках
   ```

   Pytest сам распределит тесты по воркерам.
2. **Selenium Grid**
   * Позволяет запускать тесты на разных узлах (браузеры, ОС).
   * В комбинации с `pytest-xdist` можно сделать параллельный запуск на распределённой инфраструктуре.
3. **Threading / multiprocessing в Python**
   * Можно напрямую использовать стандартные модули (`threading`, `multiprocessing`).
   * Но лучше использовать Pytest, чтобы не писать свой менеджмент потоков.

***

### 🔹 Проблема с WebDriver при многопоточности

Если просто запустить несколько потоков, то:

* все тесты будут пытаться использовать **один и тот же драйвер**,
* браузеры будут «мешать» друг другу.

Решение: у каждого потока должен быть **свой экземпляр драйвера**.

***

### 🔹 Что такое **ThreadLocal**?

`ThreadLocal` — это способ хранить данные **отдельно для каждого потока**.

В контексте Selenium это значит, что **каждый поток получает свой экземпляр WebDriver**, и они не конфликтуют между собой.

Пример в Python (аналог `ThreadLocal`):

```python
import threading
from selenium import webdriver

# локальное хранилище для потоков
thread_local = threading.local()

def get_driver():
    if not hasattr(thread_local, "driver"):
        # создаем новый драйвер только для этого потока
        thread_local.driver = webdriver.Chrome()
    return thread_local.driver

def test_google():
    driver = get_driver()
    driver.get("https://google.com")
    print(driver.title)
    driver.quit()

# Запустим тесты в нескольких потоках
threads = []
for _ in range(3):
    t = threading.Thread(target=test_google)
    threads.append(t)
    t.start()

for t in threads:
    t.join()
```

👉 Здесь у каждого потока свой `driver`, благодаря `threading.local()` (аналог **ThreadLocal** в Java).

***

### 🔹 Итого

* Параллельный запуск тестов лучше всего делать через **pytest-xdist** или **Selenium Grid**.
* **ThreadLocal** нужен, чтобы в каждом потоке был **свой WebDriver**, иначе браузеры будут мешать друг другу.
