Parallel execution of iOS test cases with Appium + TestNG requires:
Multiple real iOS devices or simulators
Unique
udid,wdaLocalPort,systemPort(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
BaseTest.java to Handle Driver Initializationpublic 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(); } }
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(); } }
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>
mvn clean test -DsuiteXmlFile=testng.xml
<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>