How to execute Parallel Test Cases in Appium with JUnit for Android Apps

  


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 @Parameterized or 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

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:


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 driver objects across threads.
  • Avoid shared static variables unless they are synchronized.
  • You can scale it up using a Grid or Appium with Docker.

No comments:

Post a Comment