---
title: Mobile App Test Automation in the Cloud | TestingBot
description: Run automated mobile app tests on real iPhones, iPads and Android devices
  in the TestingBot cloud with Appium, Espresso, XCUITest, Maestro and Electron.
source_url:
  html: https://testingbot.com/support/app-automate
  md: https://testingbot.com/support/app-automate/index.md
---
Documentation

# Mobile App Test Automation

TestingBot runs automated tests for native iOS, Android and cross-platform apps on real iPhones, iPads and Android phones and tablets in our EU datacenter, plus iOS simulators and Android emulators for fast iteration. Bring your existing Appium, XCUITest, Espresso, Maestro or Electron tests and point them at the TestingBot grid.

## Pick a mobile test framework

TestingBot supports the major mobile and cross-platform test frameworks. Each card links to a complete setup guide with code examples in every supported language. Not sure which framework to pick? See the [framework comparison](https://testingbot.com#compare) below.

 ![Appium](https://testingbot.com/assets/support/appium-4b35a8bb56bae236bd84c539cee9b8bbb489a55ddf48e32d059c86685d230354.svg)
### [Appium](https://testingbot.com/support/app-automate/appium)

W3C WebDriver framework for cross-platform iOS and Android app automation.

- [Java](https://testingbot.com/support/app-automate/appium/java)
- [Python](https://testingbot.com/support/app-automate/appium/python)
- [Node.js](https://testingbot.com/support/app-automate/appium/nodejs)
- [Ruby](https://testingbot.com/support/app-automate/appium/ruby)
- [C#](https://testingbot.com/support/app-automate/appium/csharp)
- [PHP](https://testingbot.com/support/app-automate/appium/php)
- [Flutter](https://testingbot.com/support/app-automate/appium/flutter)

 ![XCUITest](https://testingbot.com/assets/integrations/xcuitest-4a935f2368661d89d3559b3c5af3377236029478ae76bb43253f3c3bee712096.svg)
### [XCUITest](https://testingbot.com/support/app-automate/xcuitest)

Apple's native iOS UI testing framework, written in Swift or Objective-C.

- [XCUITest guide](https://testingbot.com/support/app-automate/xcuitest)

 ![Espresso](https://testingbot.com/assets/integrations/espresso-a8ff30da0c385f89f4e694bb29fc4779ad132e8e3f4a777a38e608e0492ff610.svg)
### [Espresso](https://testingbot.com/support/app-automate/espresso)

Google's native Android UI testing framework, written in Java or Kotlin.

- [Espresso guide](https://testingbot.com/support/app-automate/espresso)

 ![Maestro](https://testingbot.com/assets/integrations/maestro-9d782f30f13fb4efaf9928b704c7a787eb14cb9e5b20c650137bb65892334b8b.svg)
### [Maestro](https://testingbot.com/support/app-automate/maestro)

YAML-based declarative test runner for iOS and Android.

- [Maestro guide](https://testingbot.com/support/app-automate/maestro)

 ![Electron](https://testingbot.com/assets/environments/svg/electron-91b2641c5cea963ea9c261f274ae480fc4fbc689889a058158c9ebbcd559b622.svg)
### [Electron](https://testingbot.com/support/app-automate/electron)

Test cross-platform Electron desktop apps built with web technologies.

- [Electron guide](https://testingbot.com/support/app-automate/electron)

### [Smart TV](https://testingbot.com/support/app-automate/smart-tv)

Automate Smart TV and OTT applications on real connected TV hardware.

- [Smart TV guide](https://testingbot.com/support/app-automate/smart-tv)

## Quick start: run your first mobile app test

Four steps to point an existing Appium, XCUITest, Espresso or Maestro test at the TestingBot cloud:

1. **Sign up and grab your API key.** [Create a free account](https://testingbot.com/users/sign_up). Your API key and secret are in the dashboard under Account, then Keys and Authentication. 
2. **Upload your app binary to TestingBot Storage.** Upload your `.ipa` (iOS), `.apk` (Android) or Maestro flow ZIP to [TestingBot Storage](https://testingbot.com/support/api#upload). The response returns a `tb://` URL you reference in test capabilities. 
3. **Point your framework at the TestingBot endpoint.** Connect to `https://hub.testingbot.com/wd/hub`. Pass your key and secret via `tb:options`, set `platformName`, `deviceName`, `platformVersion` and `app` (the `tb://` URL). 
4. **Run the test and view results.** TestingBot streams a live video, screenshots, device logs and framework command logs into the dashboard while the test runs and after it finishes. 

## Appium vs XCUITest vs Espresso vs Maestro

All four frameworks run on TestingBot. Pick the one that fits your codebase and team:

| &nbsp; | Appium | XCUITest | Espresso | Maestro |
| --- | --- | --- | --- | --- |
| Platforms | iOS and Android | iOS only | Android only | iOS and Android |
| Languages | Java, Python, Ruby, JavaScript, C#, PHP, Flutter | Swift, Objective-C | Java, Kotlin | YAML (declarative) |
| Protocol | W3C WebDriver | Apple XCTest runner | Google AndroidJUnitRunner | Maestro CLI |
| Test speed | Slower (extra protocol layer) | Fast (native runner) | Fast (native runner) | Fast (direct UI driver) |
| Best for | One codebase across iOS and Android, language flexibility | iOS teams already using XCTest in Xcode | Android teams already using AndroidJUnit in Studio | QA teams that want readable, low-code flows |

## Frequently asked questions

What is mobile app test automation?

Mobile app test automation runs UI tests against native iOS and Android applications, exercising the app exactly like a user would. TestingBot runs these tests on real iPhones, iPads, Android phones and tablets in our EU datacenter, plus iOS simulators and Android emulators when you want faster iteration. See the [supported device list](https://testingbot.com/support/app-automate/devices) for current models.

Which mobile test frameworks does TestingBot support?

TestingBot supports Appium for cross-platform iOS and Android, Apple's XCUITest for iOS, Google's Espresso for Android, Maestro for declarative cross-platform flows, and Electron for cross-platform desktop apps. See the dedicated guides for [Appium](https://testingbot.com/support/app-automate/appium), [XCUITest](https://testingbot.com/support/app-automate/xcuitest), [Espresso](https://testingbot.com/support/app-automate/espresso), [Maestro](https://testingbot.com/support/app-automate/maestro) and [Electron](https://testingbot.com/support/app-automate/electron).

Can I run tests on real iPhones and Android devices, not simulators?

Yes. TestingBot runs automated tests on physical iPhones, iPads, and Android phones and tablets housed in our EU datacenter, alongside iOS simulators and Android emulators. Use `realDevice: true` in your capabilities to target real hardware. See [real device testing](https://testingbot.com/real-device-testing) for the full real-hardware overview.

How do I upload my app binary to TestingBot?

Upload your `.ipa`, `.apk` or Maestro flow ZIP to [TestingBot Storage](https://testingbot.com/support/api#upload) with your API key and secret. The response returns a `tb://` URL that you reference in your test capabilities. Apps are retained for the storage retention period defined by your plan and can be deleted via the REST API at any time.

Can I run mobile app tests in parallel?

Yes. Each plan includes a number of concurrent device sessions. Most test runners (Appium, XCUITest, Espresso, Maestro) launch parallel sessions natively, and each session runs on a separate, isolated device. See [our pricing plans](https://testingbot.com/pricing) for the device-concurrency limits.

What is the difference between Appium, XCUITest, Espresso and Maestro?

Appium is a cross-platform W3C WebDriver implementation for iOS and Android, similar to Selenium. XCUITest is Apple's native iOS UI testing framework. Espresso is Google's native Android UI testing framework. Maestro is a YAML-based declarative test runner for both platforms. Appium gives the broadest reuse for teams that need one codebase across iOS and Android. XCUITest and Espresso are tightly coupled to their respective platforms and typically run faster. Maestro is the simplest to write and read. See the [framework comparison](https://testingbot.com#frameworks) on this page for details.

Can I test my app on a real device behind a firewall or staging environment?

Yes. Use the [TestingBot Tunnel](https://testingbot.com/support/tunnel) to expose internal services to the device under test. Start the tunnel with an identifier, then pass tunnelIdentifier in your tb:options capabilities. The tunnel encrypts traffic between your network and the cloud device.

How are mobile app tests billed on TestingBot?

Mobile app tests are billed by the minute (the time the device was allocated to your test) and capped by your plan's concurrency limit. Simulator, emulator and real-device sessions all consume the same minutes at the same rate. See [our pricing plans](https://testingbot.com/pricing) for current rates.

## Next steps

- [ **Supported devices**  
Real iPhones, iPads and Android devices on the grid](https://testingbot.com/support/app-automate/devices)
- [ **Appium guide**  
Cross-platform iOS and Android automation](https://testingbot.com/support/app-automate/appium)
- [ **XCUITest guide**  
Native iOS UI testing](https://testingbot.com/support/app-automate/xcuitest)
- [ **Espresso guide**  
Native Android UI testing](https://testingbot.com/support/app-automate/espresso)
- [ **Maestro guide**  
YAML-based declarative flows](https://testingbot.com/support/app-automate/maestro)
- [ **Real device testing**  
How the real-hardware cloud works](https://testingbot.com/real-device-testing)
- [ **TestingBot Tunnel**  
Test against internal or staging APIs](https://testingbot.com/support/tunnel)
- [ **Pricing**  
Real-device plans and concurrency](https://testingbot.com/pricing)

Was this page helpful? Yes No 

## Looking for More Help?

Have questions or need more information?   
 You can reach us via the following channels:

- [Email us](https://testingbot.com/contact/new)
- [Join our Slack Channel](https://join.slack.com/t/testingb0t/shared_invite/zt-3bcw9xch-jk19~6XPs_xBrsAgAedkCw)
