← Назад к вопросам

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

2.3 Middle🔥 131 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Параллельный запуск тестов в pytest

Для эффективного параллельного запуска тестов в pytest используется плагин pytest-xdist, который позволяет распределять выполнение тестовых сценариев между несколькими процессами или даже машинами. Это значительно сокращает время выполнения тестового набора, особенно при больших объемах тестирования.

Основные способы запуска

Базовый параллельный запуск осуществляется с указанием количества рабочих процессов через параметр -n:

pytest -n auto        # Автоматическое определение числа ядер CPU
pytest -n 4          # Запуск с 4 процессами
pytest -n 2 tests/   # 2 процесса для тестов в директории tests/

Ключевые возможности pytest-xdist

Плагин предоставляет несколько режимов распределения нагрузки:

  • Распределение по модулям (--dist=loadscope) - тесты из одного модуля выполняются в одном процессе
  • Распределение по файлам (--dist=loadfile) - тесты из одного файла выполняются вместе
  • Циклическое распределение (--dist=load) - тесты распределяются по очереди между процессами

Пример с распределением по модулям:

pytest -n 4 --dist=loadscope

Ограничения и особенности

При параллельном запуске необходимо учитывать:

  • Изоляция состояния - каждый процесс имеет отдельное пространство памяти
  • Общие ресурсы - проблемы с конкурентным доступом к базам данных, файлам, сетевых сервисов
  • Порядок выполнения - тесты выполняются в произвольном порядке

Решение проблем с общими ресурсами

Для тестов, работающих с общей базой данных, можно использовать:

  • Уникальные имена БД для каждого процесса
  • Транзакционные фикстуры для изоляции данных
  • Docker-контейнеры с отдельными экземплярами сервисов

Пример фикстуры для изоляции данных:

import pytest
import uuid

@pytest.fixture(scope="function")
def isolated_database():
    # Создание уникального имени БД для каждого теста
    db_name = f"test_db_{uuid.uuid4().hex[:8]}"
    # Настройка соединения с уникальной БД
    connection = setup_database_connection(db_name)
    yield connection
    # Очистка после теста
    teardown_database(connection)

Интеграция с CI/CD системами

Для Jenkins, GitLab CI или GitHub Actions рекомендуется:

  • Динамическое определение числа процессов на основе доступных ресурсов
  • Разделение тестов на группы для балансировки нагрузки
  • Параллельный запуск в Docker-контейнерах

Пример конфигурации для GitHub Actions:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        worker: [1,这四个数字2, 3, 4]
    steps:
      - name: Run tests in parallel
        run: pytest -n ${{ matrix.worker }} --junitxml=report-${{ matrix.worker }}.xml

Мониторинг и отчетность

При параллельном запуске важно собирать консолидированные отчеты:

pytest -n 4 --junitxml=report.xml    # Общий отчет JUnit
pytest -n auto --html=report.html    # HTML отчет

Альтернативные подходы

Помимо pytest-xdist существуют другие решения:

  • pytest-parallel - экспериментальный плагин с многопоточностью
  • pytest-test-groups - ручное разделение тестов на группы
  • Кластеризация с помощью pytest-xdist --tx для распределения по разным машинам

Заключение

Параллельный запуск тестов в pytest через pytest-xdist является наиболее эффективным и популярным решением. Ключевые преимущества включают существенное сокращение времени выполнения тестов, эффективное использование ресурсов и хорошую интеграцию с CI/CD системами. Однако успешная реализация требует тщательного планирования архитектуры тестов, особенно в части изоляции состояния и управления общими ресурсами.

Как запускать тесты параллельно в pytest? | PrepBro