Run Parallel Appium Tests with TestNG for Android App

  

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:

  • ThreadLocal ensures each thread (test) uses its own driver instance.
  • Use unique systemPort for each Android session.
  • Ensure ADB recognizes multiple devicesadb devices