Running parallel test cases in Appium with Java and TestNG involves setting up multiple device configurations, using TestNG’s parallel execution capability, and ensuring your tests can run independently.
Steps to Run Parallel Test Cases in Appium with Java & TestNG
1. Prerequisites
Ensure you have:
Appium server installed
Java JDK installed
Android/iOS devices or emulators connected
TestNG, Appium Java Client, Selenium added to your Maven project
<dependencies>
<!-- Appium Java Client -->
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>9.0.0</version>
</dependency>
<!-- Selenium -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.18.0</version>
</dependency>
<!-- TestNG -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.10.1</version>
<scope>test</scope>
</dependency>
</dependencies>
public class BaseTest {
protected static ThreadLocal<AppiumDriver> driver = new ThreadLocal<>();
@Parameters({"platformName", "udid", "systemPort"})
@BeforeMethod
public void setup(String platformName, String udid, String systemPort) throws MalformedURLException {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", platformName);
caps.setCapability("udid", udid);
caps.setCapability("systemPort", systemPort); // Unique port for parallel
caps.setCapability("appPackage", "com.example");
caps.setCapability("appActivity", "com.example.MainActivity");
driver.set(new AndroidDriver(new URL("http://localhost:4723/wd/hub"), caps));
}
public AppiumDriver getDriver() {
return driver.get();
}
@AfterMethod
public void teardown() {
getDriver().quit();
driver.remove();
}
}
public class ParallelTest1 extends BaseTest {
@Test
public void testOne() {
getDriver().findElement(By.id("com.example:id/button")).click();
}
}
public class ParallelTest2 extends BaseTest {
@Test
public void testTwo() {
getDriver().findElement(By.id("com.example:id/input")).sendKeys("Test");
}
}
testng.xml)<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="ParallelAppiumSuite" parallel="tests" thread-count="2">
<test name="Device1">
<parameter name="platformName" value="Android"/>
<parameter name="udid" value="emulator-5554"/>
<parameter name="systemPort" value="8200"/>
<classes>
<class name="tests.ParallelTest1"/>
</classes>
</test>
<test name="Device2">
<parameter name="platformName" value="Android"/>
<parameter name="udid" value="emulator-5556"/>
<parameter name="systemPort" value="8201"/>
<classes>
<class name="tests.ParallelTest2"/>
</classes>
</test>
</suite>
ThreadLocalensures each thread (test) uses its own driver instance.
- Use unique
systemPortfor each Android session.
- Ensure ADB recognizes multiple devices:
adb devices