На каком тест-раннере тестировал многопоточные системы?

«На каком тест-раннере тестировал многопоточные системы?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для тестирования многопоточных систем и параллельного запуска автотестов я использовал следующие тест-раннеры и плагины:

  • JUnit 5 (Java): Наиболее гибкий вариант. Параллелизм настраивается в файле junit-platform.properties:

    junit.jupiter.execution.parallel.enabled=true
    junit.jupiter.execution.parallel.mode.default=concurrent
    junit.jupiter.execution.parallel.config.strategy=fixed
    junit.jupiter.execution.parallel.config.fixed.parallelism=4

    Аннотация @Execution(ExecutionMode.CONCURRENT) позволяет управлять параллельностью на уровне класса или метода.

  • TestNG (Java): Имеет встроенную мощную поддержку многопоточности через параметры аннотации @Test:

    @Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000)
    public void concurrentApiCallTest() {
        // Этот тест выполнится 10 раз, используя пул из 3 потоков
    }

    Также поддерживает параллельный запуск на уровне тестов, классов и suites в XML-конфигурации.

  • pytest (Python): Для параллельного выполнения используется плагин pytest-xdist:

    pytest -n auto  # Использует все доступные ядра CPU
    pytest -n 4     # Запускает тесты в 4 рабочих процесса

Ключевые моменты при тестировании многопоточных систем:

  1. Изоляция состояния: Каждый поток должен работать с изолированными данными (например, уникальными ID пользователей, создаваемыми перед тестом).
  2. Синхронизация и ожидания: Использование явных ожиданий (WebDriverWait в Selenium) и избегание статических shared-ресурсов, которые могут привести к состоянию гонки (race condition).
  3. Детерминированность: Тесты должны быть идемпотентными и не зависеть от порядка выполнения.

Выбор инструмента зависит от стека проекта: для Java-экосистемы я предпочитаю JUnit 5 за его современность и гибкость, а TestNG — для legacy-проектов или когда нужны специфические возможности из коробки.