To execute parallel test cases in Appium with JUnit for Android apps, you need to:
- Set up multiple Android devices/emulators.
- Assign unique ports and capabilities to each device.
- Use JUnit's
@Parameterizedor a custom parallel runner. - Launch tests in parallel threads.
Prerequisites
Java (JDK 11+)
Appium server installed
Android SDK with AVDs or real devices
Eclipse or IntelliJ IDE
Appium Java client dependency in your Maven
pom.xml:
Maven Dependency:
<dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>9.0.0</version> </dependency>
Step-by-step Implementation
1. Create a Device Configuration Class
1. Create a Device Configuration Class
public class DeviceConfig { public String deviceName; public String udid; public String platformVersion; public int systemPort; public int appiumPort; public DeviceConfig(String deviceName, String udid, String platformVersion, int systemPort, int appiumPort) { this.deviceName = deviceName; this.udid = udid; this.platformVersion = platformVersion; this.systemPort = systemPort; this.appiumPort = appiumPort; } }
2. Create a Base Test Class to Setup Driver
public class BaseTest { protected AndroidDriver<MobileElement> driver; protected DeviceConfig device; public void setUp(DeviceConfig device) throws MalformedURLException { this.device = device; DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("platformName", "Android"); caps.setCapability("deviceName", device.deviceName); caps.setCapability("udid", device.udid); caps.setCapability("platformVersion", device.platformVersion); caps.setCapability("automationName", "UiAutomator2"); caps.setCapability("systemPort", device.systemPort); caps.setCapability("app", System.getProperty("user.dir") + "/apps/yourapp.apk"); driver = new AndroidDriver<>(new URL("http://127.0.0.1:" + device.appiumPort + "/wd/hub"), caps); } public void tearDown() { if (driver != null) { driver.quit(); } } }
3. Define Your Test Class With
@RunWith(Parameterized.class)
@RunWith(Parameterized.class) public class ParallelAppiumTest extends BaseTest { @Parameterized.Parameters public static Collection<DeviceConfig> devices() { return Arrays.asList( new DeviceConfig("emulator-5554", "emulator-5554", "11", 8200, 4723), new DeviceConfig("emulator-5556", "emulator-5556", "11", 8201, 4725) ); } private DeviceConfig config; public ParallelAppiumTest(DeviceConfig config) { this.config = config; } @Before public void init() throws Exception { setUp(config); } @Test public void sampleTest() { System.out.println("Running test on: " + config.deviceName); // Your test code here } @After public void cleanup() { tearDown(); } }
Step 4: Start Multiple Appium Servers
Start different Appium servers on different ports manually or via command line:
Start different Appium servers on different ports manually or via command line:
appium -p 4723 --default-capabilities '{"systemPort": 8200}' appium -p 4725 --default-capabilities '{"systemPort": 8201}'
Or use AppiumServiceBuilder from Java code to start servers dynamically (optional).
JUnit by default runs parameterized tests sequentially. To achieve true parallel execution, use JUnit Parallel Computer or a custom test runner like JUnitParams + multithreading.
Things to Remember:
- Always assign unique systemPort and Appium server port for each device.
- Don’t reuse
driverobjects across threads.
- Avoid shared static variables unless they are synchronized.
- You can scale it up using a Grid or Appium with Docker.