Parallel tests with Appium and Genymotion SaaS

2024-04-23

> Important: This tutorial requires Appium 2.0 or higher.

Launching automated tests can take a long time. This tutorial explains how to parallelize tests to detect bugs as soon as possible. This approach spends less time on test runs.

Requirements

Requirements

We’re using Python throughout this tutorial. You can use your preferred language. You must refer to the Appium documentation for Appium clients for other languages.

Launch several devices in Genymotion SaaS

gmsaas recipes list lists recipes that can be started. UUID is the identifier used when starting an instance.

This step creates and launches several Genymotion devices:

# start a Samsung Galaxy S23 - 14.0 device
instance1=$(gmsaas instances start 37499e5d-6bee-46d1-b07a-e594ff3fcb0d device_14.0)
# start a Samsung Galaxy A14- 13.0 device
instance2=$(gmsaas instances start f90338c7-5e36-4e30-b376-f3252b08c23f device_13.0)
# start a Google Pixel 6 - 12.0 device
instance3=$(gmsaas instances start 53d71621-b0b8-4e5a-8cea-0055ea98988f device_12.0)

The instance UUID is printed on standard output once an instance is started.

> Note: The following commands only work on Unix shell like Bash or Zsh. > Windows users should consider using . > Windows users should call gmsaas.exe instead of gmsaas.

Once the devices are started, connect them to adb:

port1=10000 && port2=20000 && port3=30000
gmsaas instances adbconnect $instance1 --adb-serial-port=$port1
gmsaas instances adbconnect $instance2 --adb-serial-port=$port2
gmsaas instances adbconnect $instance3 --adb-serial-port=$port3

Keep the port numbers handy. You need the port numbers to configure the Appium server.

If you need a persistent adb port, add the parameter --adb-serial port (optional).

Start appium server

Since Appium 1.7, parallel testing can be done using only one appium server. Before Appium 1.7, N appium servers were needed to test N devices in parallel.

Start an Appium server using the basic command: appium

Write your tests in Python

We’re using Python throughout this tutorial. You can use your preferred language. You can refer to the Appium documentation for Appium clients for other languages.

Pytest is chosen as the test framework.

Pytest has several useful plugins like:

Here is a simple python script:

| | # -- coding: utf-8 -- | | --- | --- | | | import pytest | | | from appium import webdriver | | | from appium.webdriver.common.appiumby import AppiumBy | | | from appium.options.android import UiAutomator2Options | | | | | | def create_android_driver(udid, systemPort): | | | | | | # Setting capabilities directly on the options object | | | capabilities = { | | | "appium:deviceName": "Genymotion Cloud PaaS", | | | "platformName": "Android", | | | "automationName": "UiAutomator2", | | | "appium:udid": udid, | | | "appium:systemPort": systemPort, | | | "appium:appPackage": "com.android.settings", | | | "appium:appActivity": ".Settings" | | | } | | | url = "http://localhost:4723" | | | options = UiAutomator2Options() | | | options.load_capabilities(capabilities) | | | driver = webdriver.Remote(url, options=options) | | | # Return the driver | | | return driver | | | | | | @pytest.mark.parametrize( | | | "udid, systemPort", | | | [ | | | ("localhost:10000", "8201"), | | | ("localhost:20000", "8202"), | | | ("localhost:30000", "8203"), | | | ], | | | ) | | | def test_sum(udid, systemPort): # Accept udid and systemPort as parameters | | | driver = create_android_driver(udid, systemPort) | | | | | | try: | | | | | | driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]') | | | | | | finally: | | | # Ensure proper teardown | | | driver.quit() |

How to run Python tests in parallel

Now, it’s time to run tests on all devices!

If we run the python script as follows:

pytest test_example.py

pytest will execute tests on one device at a time. This is not what we want. To have results as soon as possible, we need to execute all the tests at the same time. To run all the tests at the same time, take advantage of the . Run the following command:

pytest -n 3 test_example.py

Here we start the suite with 3 processes.

That’s it! You’ve been able to run parallel tests on several Genymotion SaaS virtual devices using appium and pytest.

Many thanks to , one of the Appium maintainers and founder of , for reviewing the article!

To learn more about Genymotion SaaS, see the following resources:

To run parallelize your tests using Java rather than Python, see on Github.