Using Real and Virtual Mobile Devices for Testing
Getting the most out of your live and automated testing means including a healthy mix of Emulators, Simulators, and real devices as your mobile testing platforms. Why? Most aspects of the mobile experience you can test on Emulators or Simulators, while some scenarios require testing on physical real devices (e.g., memory consumption, CPU usage, location-based apps that use manufacturer-specific device sensors).
There are a variety of use cases to consider when you're deciding on the mix of Emulators, Simulators, and real devices to use in your testing.
We support thousands of device/OS combinations and test automation frameworks such as Appium, Espresso, XCUITest, and Robotium. For a full list, see Supported Browsers & Devices.
When to Test on Emulators and Simulators
Use Cases
If you need:
- Massive concurrency.
- To reduce build times.
- To save costs.
- Immediate availability.
- Extremely low error rates for your test environment.
- Longer test times -- native framework tests on real devices enforce a maximum test duration limit of 60 minutes.
System Requirements
iOS Mobile Apps | Android Mobile Apps | |
---|---|---|
Requirements | Your iOS app must be: Compiled for the simulator/device version of your choice Compressed into a .zip package/archive file (must include app directory) Uploaded and hosted in a place that Sauce Labs can access (for example: AWS, GitHub, or Sauce Labs App Storage) | Your Android app must be: Compiled for the simulator/device version of your choice Configured to have internet permissions Built into an .apk or .aab package/archive file Uploaded and hosted in a place that Sauce Labs can access (for example: AWS, GitHub, or Sauce Labs App Storage). Appium only. For Espresso, |
Versions supported | iOS versions 14.0 and higher | Android versions 5.0 and higher |
Tips | If you're using App Storage, get the returned location, which will look something like storage:filename=myApplication.zip. In your test capabilities, specify the location of the .zip file, or the | This StackOverflow article contains instructions on how to build an .apk file in Eclipse. In your test capabilities, specify the location of the .apk or .aab file, or the |
When to Test on Real Devices
The Sauce Labs Real Device Cloud (RDC) provides you with the ability to run live and automated tests across Android and iOS devices. Learn more here.
Use Cases
If you need:
- A breadth of device types for panel/compatibility testing.
- Manual, interactive testing on actual physical devices.
- To replicate an issue to match exact model as reported.
- Pixel-perfect display testing.
- To test hardware dependencies like CPU, memory, display, GPS.
- To test native ARM Libraries.
- To test on a custom OS (e.g., Samsung TouchWiz, OnePlus OxygenOS)
- To test on a native framework like Espresso and Robotium.
- To test scenarios that require carrier network connectivity (e.g., making phone calls and sending SMS messages to devices with SIM cards).
Supported OS versions and devices
- Available major OS versions for iOS/iPadOS real devices: 17.X, 16.X, 15.X, 14.X, 13.X, 12.X
- Available major OS versions for Android real devices: 14.X, 13.X, 12.X, 11.X, 10.X, 9.X
- Our support is limited to real devices manufactured within the last 6 years.
- Devices manufactured longer than 6 years ago are not supported.
Public Device Cloud
Our public cloud, available to all users regardless of pricing plan, contains a wide selection of thoroughly cleaned devices. They are subject to availability. On the mobile device selection screen, if a device is in use, it'll be marked with a In Use flag.
Here are some use cases:
- The devices available on the public cloud are sufficient for your testing coverage.
- You need to reproduce bugs on a selection of hundreds of iOS and Android devices.
- You need to upload and spot check apps on devices you don’t have access to.
- You need to share manual test sessions and devices across teams worldwide.
- You are looking for a low-cost real device testing option.
Private Device Cloud
Enterprise Only
This is a dedicated pool of devices just for your organization. On the mobile device selection screen, your private devices are marked with a green device icon. Here are some use cases:
- You need to use a very specific set of devices that aren't supported on the public cloud.
- Your security team insists on dedicated devices.
- You want to run automated parallel tests across multiple devices simultaneously.
- You need specific settings which are set on the devices all the time.
- You need to establish a secure IPSec VPN connection between your network and the Sauce Labs cloud.
- You want to test your apps with MDM Distribution (Intune).
- You want to test securely payment workflow with Apple Payment, or In-App Purchase, and retain your card data on your own dedicated device.
- You want to test eSIM/SIM card-related workflows.
System Requirements
iOS Mobile Apps | Android Mobile Apps | |
---|---|---|
Requirements | Your iOS app must be: Formatted as a .app or .ipa file. Refer to the documentation on how to create an .ipa file Uploaded and hosted in Sauce Labs storage or installed from a remote location. Appium only. For XCUITest, | Your Android app must be: Built into an .apk or .aab package/archive file. Configured to have internet permissions Uploaded and hosted in Sauce Labs storage or installed from a remote location. Appium only. For Expresso, |
Versions supported | iOS versions 12.5.X and higher | Android versions 8.0 and higher |
For the full list of supported real devices, see Supported Browsers and Devices.
Security
Real Device Cleaning
We use a proprietary process that wipes every real device clean at the end of the testing session:
- User accounts and data are cleared from the device.
- History and user data is removed from the default system browser. Non-default browsers are uninstalled.
- Network settings are reset.
- Device settings are reset.
- Your app is uninstalled.
- Cached data is deleted.
- Device is de-allocated from you.
While we take these actions to clean public real devices after each test session, we do not perform factory resets nor do we have anti-virus software installed on them. It is possible that other users of the public RDC may engage in malicious, careless or unsecure activity, and that sophisticated, persistent malware could therefore be present on any device in the public RDC.
If you test a Progressive Web Application (PWA) and install it on the home screen of the device, make sure that you remove the PWA manually before you close your session. At the moment we can’t remove the PWA and its data during our cleaning process.
Data Center Security
Real Device Cloud Data Center security is described in Data Center Endpoints.
Static and Dynamic Device Allocation
Regardless of the test frameworks you're using (Appium, Espresso, XCUITest), you can configure your real device tests using static and dynamic device allocation. While the syntax may be different (i.e., --device
, deviceName
), the functionality is the same across all frameworks.
Static Device Allocation
This is specifying an exact device for your test by setting deviceName
to the Device ID, which you can find under Live > Mobile-App > Choose device > Find Your Device > Details > ID.
When using this, there's no need to specify the platformName
and platformVersion
because they'll be set by default (i.e., if you include these separately included in your test script, they will be ignored).
- Appium (Android)
- Appium (iOS)
- Espresso
- XCUITest
devices:
- id: Google_Pixel_7_Pro_real_us
devices:
- id: iPhone_11_13_5_real_us
capabilities.setCapability("appium:deviceName", "Google_Pixel_7_Pro_real_us");
capabilities.setCapability("appium:deviceName", "iPhone_11_13_5_real_us");
Dynamic Device Allocation
This is specifying basic parameters for your test by setting deviceName
to the Display Name and or platformVersion
to the OS Version by regular expressions (regex) to dynamically allocate a device. (If you want to use the OS Version you need to remove the Android
or iOS
prefix from the OS version). A device(s) with your specifications will be selected from the real device pool.
You can find the Display Name or OS Version under Live > Mobile-App > Choose device > Find Your Device > Details > Title|OS.
The more strict you set the capabilities, the smaller the pool of available devices will be and the longer you might need to wait for an available device.
Based on Display Name
Regex Input | Dynamic Allocation Action |
---|---|
"iPhone.*" , "iPhone .*" | Allocates any iPhone device. See example or this example. |
".*nexus.*" | Allocates any device with the word "nexus" in its display name. See example. |
"iPhone [67]" or "iPhone [6-7]" | Both will allocate either an iPhone 7 or iPhone 6 device. See example or this example. |
"iPhone [67]S" or "iPhone [6-7]S" | Both will allocate either an iPhone 7S or iPhone 6S device. See example or this example. |
"iPhone 7.*" | Allocates any device that starts with the display name "iPhone 7" (e.g., iPhone 7, iPhone 7S). See example. |
"^(?!Nokia.*|Oppo.*|Huawei.*|Xiaomi.*).*" | Allocates any Android devices, except Nokia, Oppo, Huawei, and Xiaomi. See example. |
"^(?=Nokia.*|Oppo.*|Huawei.*|Xiaomi.*).*" | Allocates only Nokia, Oppo, Huawei, and Xiaomi devices. See example. |
- Appium (Android)
- Appium (iOS)
- Espresso
- XCUITest
devices:
- name: "^Google.*"
devices:
- name: "^(?!Oppo).*"
devices:
- name: "^iPhone.*"
devices:
- name: "^iPhone\s+(?!(5|5S)).*"
capabilities.setCapability("appium:deviceName", "^Google.*");
capabilities.setCapability("appium:deviceName", "^(?!Oppo).*");
capabilities.setCapability("appium:deviceName", "^iPhone.*");
capabilities.setCapability("appium:deviceName", "^iPhone\s+(?!(5|5S)).*");
Based on platform version
Regex Input | Dynamic Allocation Action |
---|---|
"^1[3-4|6].*" | Will match 13 , 14 and 16 , but not 15, see example. |
"^(?!15).*" | Will exclude version 15 with all it's minors and patches, but will match all other versions, see example. |
- Appium (Android)
- Appium (iOS)
- Espresso
- XCUITest
devices:
- name: "^Google.*"
platformVersion: "^1[1-3].*"
devices:
- name: "^iPhone.*"
platformVersion: "^(?!15).*"
capabilities.setCapability("appium:deviceName", "^Google.*");
capabilities.setCapability("appium:platformVersion", "^1[1-3].*");
capabilities.setCapability("appium:deviceName", "^iPhone.*");
capabilities.setCapability("appium:platformVersion", "^(?!15).*");
- A matching device must be present in your account in order for the test to run.
- Regex values are not case-sensitive (i.e.,
"iphone .*S"
and"IPHONe .*s"
are the same).