Параллельное выполнение тестов значительно сокращает время прогона тестовой suite. Рассмотрим подходы для обоих фреймворков.
Основной способ настройки параллельного выполнения:
<suite name="Parallel Suite" parallel="methods" thread-count="5">
<test name="Test Group" parallel="classes" thread-count="3">
<classes>
<class name="com.example.Test1"/>
<class name="com.example.Test2"/>
</classes>
</test>
</suite>
Уровни параллелизма:
methods
: параллельное выполнение методовtests
: параллельное выполнение тестовых блоков <test>
classes
: параллельное выполнение классовinstances
: параллельное выполнение экземпляров тестового класса@Test(threadPoolSize = 3, invocationCount = 10)
public void concurrentTest() {
// Тест выполнится 10 раз в 3 потоках
}
Добавьте в 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
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
@Execution(ExecutionMode.CONCURRENT)
class ParallelTestClass {
// Все тесты будут выполняться параллельно
}
Особенность | TestNG | JUnit 5 |
---|---|---|
Конфигурация | XML-файл | .properties файл |
Гранулярность | Методы/Классы/Тесты | Классы/Методы |
Управление потоками | threadPoolSize | Параллелизм через стратегии |
Встроенная поддержка | Полная | Требует активации |
Изоляция тестов:
Управление ресурсами:
@BeforeMethod
public void setup() {
// Инициализация для каждого потока
}
Синхронизация доступа:
synchronized
или ThreadLocal
private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
Балансировка нагрузки:
Проблема: Состояние гонки (race conditions)
Решение: Используйте @BeforeMethod
вместо @BeforeClass
для инициализации
Проблема: Нестабильные тесты
Решение: Добавьте повторный запуск для упавших тестов:
<!-- Для TestNG -->
<test name="FlakyTests">
<classes>
<class name="com.example.FlakyTests">
<methods>
<include name="unstableTest" invocation-count="3"/>
</methods>
</class>
</classes>
</test>
Для Jenkins добавьте параметр параллельного выполнения:
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'mvn test -Dparallel=methods -DthreadCount=4'
}
}
}
}
TestNG предоставляет более гибкие настройки параллелизма через XML-конфигурацию, в то время как JUnit 5 требует явной активации через properties-файл. Оба фреймворка эффективно ускоряют выполнение тестов при правильной настройке изоляции тестовых данных.