Как вы запускаете параллельное выполнение тестов? Что такое ThreadLocal?
🔹 Как запускать тесты параллельно
Есть несколько подходов:
Pytest +
pytest-xdist
Самый распространённый вариант для Python.
Параллельный запуск через
-n
(количество воркеров).
pytest -n 4 # запустит тесты в 4 потоках
Pytest сам распределит тесты по воркерам.
Selenium Grid
Позволяет запускать тесты на разных узлах (браузеры, ОС).
В комбинации с
pytest-xdist
можно сделать параллельный запуск на распределённой инфраструктуре.
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?