Answer
singleThreaded in TestNG
When a suite runs in parallel="methods" mode, individual @Test methods from the same class can run in different threads. @Test(singleThreaded = true) at class level overrides this — forcing all methods of that class to run in ONE thread.
The Problem Without singleThreaded
// parallel="methods" — each method runs in its own thread
// LoginTest.validLogin → Thread-1
// LoginTest.invalidLogin → Thread-2 ← CONFLICT: both share driver!
// LoginTest.sessionTimeout → Thread-3
Without ThreadLocal, multiple threads interfere with each other''s driver.
Solution 1 — singleThreaded (Keep Class Sequential)
@Test(singleThreaded = true) // ALL methods run in same thread
public class LoginTest extends BaseTest {
@Test
public void openLoginPage() {
driver.get("https://automateqa.online/login");
}
@Test(dependsOnMethods = "openLoginPage")
public void enterCredentials() {
driver.findElement(By.id("username")).sendKeys("admin");
}
@Test(dependsOnMethods = "enterCredentials")
public void submitAndVerify() {
driver.findElement(By.id("loginBtn")).click();
Assert.assertTrue(driver.getTitle().contains("Dashboard"));
}
}
All 3 methods run sequentially in the same thread → same driver instance → no conflict.
testng.xml Configuration
<suite name="Suite" parallel="methods" thread-count="5">
<test name="Tests">
<classes>
<class name="tests.LoginTest"/> <!-- singleThreaded=true in class -->
<class name="tests.CartTest"/> <!-- can run methods in parallel -->
<class name="tests.ProductTest"/>
</classes>
</test>
</suite>
LoginTest runs its methods sequentially, while CartTest and ProductTest methods run in parallel.
Solution 2 — ThreadLocal (Better for Parallel Methods)
Rather than using singleThreaded, the modern approach is:
// No singleThreaded needed — each thread gets its OWN driver
public class LoginTest extends BaseTest {
// BaseTest uses ThreadLocal<WebDriver>
@Test
public void validLogin() {
DriverManager.getDriver().get("..."); // Thread-safe
}
@Test
public void invalidLogin() {
DriverManager.getDriver().get("..."); // Different thread, different driver
}
}
When to Use singleThreaded
| Scenario | Use singleThreaded? |
|---|---|
| Tests share browser session (login → cart → checkout) | Yes |
| Tests are fully independent | No — use ThreadLocal |
Methods have dependsOnMethods chain | Yes (or use parallel="classes") |
| Complex state machine tests | Yes |
| Stateless API tests | No |
singleThreaded vs parallel="classes"
- ✓
singleThreaded=trueon a class: that specific class is sequential; others may be parallel - ✓
parallel="classes"in XML: all classes run in parallel, but each class''s methods are sequential
Best modern approach: Use ThreadLocal<WebDriver> + parallel="methods" rather than singleThreaded.
