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

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

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

  1. Pytest + pytest-xdist

    • Самый распространённый вариант для Python.

    • Параллельный запуск через -n (количество воркеров).

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

    Pytest сам распределит тесты по воркерам.

  2. Selenium Grid

    • Позволяет запускать тесты на разных узлах (браузеры, ОС).

    • В комбинации с pytest-xdist можно сделать параллельный запуск на распределённой инфраструктуре.

  3. Threading / multiprocessing в Python

    • Можно напрямую использовать стандартные модули (threading, multiprocessing).

    • Но лучше использовать Pytest, чтобы не писать свой менеджмент потоков.


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

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

  • все тесты будут пытаться использовать один и тот же драйвер,

  • браузеры будут «мешать» друг другу.

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


🔹 Что такое ThreadLocal?

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

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

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

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, иначе браузеры будут мешать друг другу.

Last updated

Was this helpful?