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
2. Maven Dependencies
<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>
3. Create a Base Test Class (with ThreadLocal Driver)
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();
}
}
4. Create Test Classes
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");
}
}
5. TestNG XML Configuration (
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>
Important Points:
ThreadLocalensures each thread (test) uses its own driver instance.
- Use unique
systemPortfor each Android session.
- Ensure ADB recognizes multiple devices:
adb devices