Конфигурация через testng.xml:
<suite name="ParallelSuite" parallel="tests" thread-count="3">
<test name="ChromeTest">
<parameter name="browser" value="chrome"/>
<classes>
<class name="com.tests.LoginTest"/>
</classes>
</test>
<test name="FirefoxTest">
<parameter name="browser" value="firefox"/>
<classes>
<class name="com.tests.LoginTest"/>
</classes>
</test>
</suite>
Параметры parallel:
tests
- параллельные тестыclasses
- параллельные классыmethods
- параллельные методыАннотация для параллельного выполнения:
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
@Execution(ExecutionMode.CONCURRENT)
public class ParallelTest {
// тестовые методы
}
Запуск тестов на разных нодах:
DesiredCapabilities chromeCap = new DesiredCapabilities();
chromeCap.setBrowserName("chrome");
DesiredCapabilities firefoxCap = new DesiredCapabilities();
firefoxCap.setBrowserName("firefox");
// Параллельный запуск через Thread
new Thread(() -> {
WebDriver driver = new RemoteWebDriver(new URL("http://grid-hub:4444"), chromeCap);
// тесты для Chrome
}).start();
new Thread(() -> {
WebDriver driver = new RemoteWebDriver(new URL("http://grid-hub:4444"), firefoxCap);
// тесты для Firefox
}).start();
ThreadLocal - это класс в Java, который позволяет создавать переменные, доступные только для текущего потока. Каждый поток имеет свою независимую копию переменной.
Проблема: При параллельном выполнении общий WebDriver может вызвать конфликты.
Решение: ThreadLocal для изоляции драйвера между потоками.
Реализация:
public class DriverManager {
private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
public static WebDriver getDriver() {
return driver.get();
}
public static void setDriver(WebDriver webDriver) {
driver.set(webDriver);
}
public static void quitDriver() {
if (driver.get() != null) {
driver.get().quit();
driver.remove();
}
}
}
Инициализация драйвера:
@BeforeMethod
public void setup(String browser) {
WebDriver driver;
if(browser.equals("chrome")) {
driver = new ChromeDriver();
} else {
driver = new FirefoxDriver();
}
DriverManager.setDriver(driver);
}
В тестах:
@Test
public void testLogin() {
WebDriver driver = DriverManager.getDriver();
driver.get("https://example.com");
// тестовые действия
}
Очистка:
@AfterMethod
public void tearDown() {
DriverManager.quitDriver();
}
Общие ресурсы:
Способы решения:
Балансировка нагрузки:
Настройка thread-count:
Логирование:
System.out.println("Thread ID: " + Thread.currentThread().getId());
Профессиональный совет: Для сложных сценариев комбинируйте параллельное выполнение методов/классов с распределенным запуском через Selenium Grid. Всегда проверяйте тесты на race condition при увеличении количества потоков.