How to execute Parallel Test Cases in Appium with TestNG for IOS Apps

  

Parallel execution of iOS test cases with Appium + TestNG requires:

  • Multiple real iOS devices or simulators

  • Unique udidwdaLocalPortsystemPort (if needed)

  • Separate Appium servers or instances

  • Proper TestNG configuration for parallel execution



1. Connect Multiple iOS Devices or Simulators

  • Ensure all devices/simulators are connected and visible via:


xcrun xctrace list devices




2. Start Multiple Appium Servers on Different Ports

Each server must run on a different port with different wdaLocalPort. For example:

appium -p 4723 --base-path /wd/hub --nodeconfig node1.json
appium -p 4725 --base-path /wd/hub --nodeconfig node2.json


Or use Appium programmatically or Appium Server GUI.




3. Create BaseTest.java to Handle Driver Initialization


public class BaseTest {
    public static ThreadLocal<AppiumDriver<MobileElement>> driver = new ThreadLocal<>();

    public AppiumDriver<MobileElement> getDriver() {
        return driver.get();
    }

    @Parameters({"udid", "port", "wdaPort"})
    @BeforeMethod
    public void setup(String udid, String port, String wdaPort) throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("platformName", "iOS");
        caps.setCapability("automationName", "XCUITest");
        caps.setCapability("udid", udid);
        caps.setCapability("bundleId", "your.app.bundle.id");
        caps.setCapability("wdaLocalPort", wdaPort);
        // Add other capabilities as needed

        URL appiumServerUrl = new URL("http://127.0.0.1:" + port + "/wd/hub");
        driver.set(new IOSDriver<>(appiumServerUrl, caps));
    }

    @AfterMethod
    public void tearDown() {
        driver.get().quit();
        driver.remove();
    }
}





4. Create Sample Test Classes


public class SampleTest1 extends BaseTest {
    @Test
    public void testMethod1() {
        getDriver().findElement(By.name("Login")).click();
    }
}


public class SampleTest2 extends BaseTest {
    @Test
    public void testMethod2() {
        getDriver().findElement(By.name("Signup")).click();
    }
}





5. Configure testng.xml for Parallel Execution


<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Parallel-iOS-Tests" parallel="tests" thread-count="2">
    <test name="iPhone-Device-1">
        <parameter name="udid" value="auto_udid1"/>
        <parameter name="port" value="4723"/>
        <parameter name="wdaPort" value="8100"/>
        <classes>
            <class name="tests.SampleTest1"/>
        </classes>
    </test>

    <test name="iPhone-Device-2">
        <parameter name="udid" value="auto_udid2"/>
        <parameter name="port" value="4725"/>
        <parameter name="wdaPort" value="8101"/>
        <classes>
            <class name="tests.SampleTest2"/>
        </classes>
    </test>
</suite>




6. Run via Maven

mvn clean test -DsuiteXmlFile=testng.xml





Maven Dependencies:


<dependencies>
    <dependency>
        <groupId>io.appium</groupId>
        <artifactId>java-client</artifactId>
        <version>8.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.8.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>