2024-04-23
> Important: This tutorial requires Appium 2.0 or higher.
Launching automated tests can take a long time. This tutorial shows how to parallelize test execution. Parallelization detects bugs as soon as possible. Parallelization also reduces time spent on test runs.
Requirements
Requirements
- Python 3 environment.
- A Genymotion SaaS account.
- Genymotion gmsaas command line tool installed and configured.
- Android SDK platform tools with adb installed.
- A working Appium install.
We use Python throughout this tutorial. You can use a preferred language by referring 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.
> If you are on Windows, consider using bash.exe.
> 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. The port numbers are needed 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 is easy using only one appium server. Before Appium 1.7, starting N appium servers was required to test N devices in parallel.
Start an Appium server using the basic command: appium
Write your tests in Python
We use Python throughout this tutorial. You can use a preferred language by referring to the Appium documentation for Appium clients for other languages.
We chose to use Pytest as our test framework.
Pytest has several useful plugins like:
xdist: for running tests in parallel.rerunfailures: for rerunning failed tests an arbitrary number of times to reduce build failures due to flakey tests.
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()
view raw
saas_appium_test_python.py
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 executes tests on one device at a time. This is not what we want. To have results as soon as possible, execute all the tests at the same time.
To do that, take advantage of the pytest-xdist plugin and run the following command:
pytest -n 3 test_example.py
-n is the number of worker processes you want to use.
Here, we start the suite with 3 processes.
That’s it.
You can run parallel tests on several Genymotion SaaS virtual devices using appium and pytest.
Many thanks to Jonathan Lipps, one of the Appium maintainers and founder of Cloud Grey, for reviewing the article!
To learn more about Genymotion SaaS, see the following resources: SaaS user guide
To run parallelize your tests using Java rather than Python, see Ellinor Kwok’s project on Github.