Move mobile instrumentation and XCUITest suites from BrowserStack App Automate to Marathon Cloud.
Marathon Cloud replaces BrowserStack App Automate for Espresso, XCUITest, and Maestro suites with a single CLI, automatic parallelization, and per-test retries.
Concept mapping
Section titled “Concept mapping”| BrowserStack App Automate | Marathon Cloud |
|---|---|
Upload app via REST API, then reference bs://<hash> |
--application app.apk; the CLI uploads |
| Upload test suite via REST API | --test-application tests.apk |
devices: ["Google Pixel 7-13.0"] |
--os-version 13; the platform picks the emulator profile |
shards / parallelsPerPlatform |
Automatic; cap with --concurrency-limit if needed |
retryOnFailure / numFlakyTestAttempts |
Per-test retries with --retry-quota-* |
class / package / annotation filters in the build payload |
--filter-file YAML |
instrumentationLogs, video, deviceLogs options |
Always collected; see artifacts |
local: true (Local Testing tunnel) |
No equivalent; backends must be reachable from the internet |
| Build status via REST API polling | --wait (default) blocks and exits 0 / 1; --result-file writes a JSON summary |
| Report download via REST API | --output ./results or marathon-cloud download |
Key differences
Section titled “Key differences”Virtual, not physical
Section titled “Virtual, not physical”BrowserStack runs on real devices. Marathon Cloud runs Android on emulators and iOS on ARM64 simulators. Review tests that depend on OEM-specific behaviour or physical hardware before migrating.
Parallelism is decided for you
Section titled “Parallelism is decided for you”BrowserStack requires you to size parallelsPerPlatform against your plan. Marathon Cloud sizes the pool from the suite’s historical duration, targeting a 15-minute run. If your shared backend cannot absorb that load, set --concurrency-limit; see limiting concurrency.
Pricing
Section titled “Pricing”BrowserStack bills per parallel slot per month. Marathon Cloud bills device time per second at $2/hour (Android) and $3/hour (iOS). See pricing for how time is counted.
No tunnel
Section titled “No tunnel”There is no equivalent of BrowserStack Local. Tests must reach staging or test backends over the public internet.
Migration steps
Section titled “Migration steps”-
Run your existing binaries once from a terminal to confirm they execute on Marathon Cloud before touching CI:
Terminal window marathon-cloud run android \--api-key $MARATHON_CLOUD_API_KEY \--application app-debug.apk \--test-application app-debug-androidTest.apk \--output marathon -
If tests used BrowserStack Local to reach a private backend, move them to an internet-reachable staging environment first. This is the step most likely to need work.
-
Translate BrowserStack filters into a filter file.
-
Add the Marathon Cloud step to CI next to the BrowserStack step with
--ignore-test-failureswhile you compare results, using the GitHub Action, Bitrise step, or Docker image. -
Point your JUnit publisher at
<output>/tests/omni/marathon_junit_report.xml. -
Once results match, drop
--ignore-test-failuresand remove the BrowserStack step.