Skip to content

Migrate from BrowserStack

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.

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

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.

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.

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.

There is no equivalent of BrowserStack Local. Tests must reach staging or test backends over the public internet.

  1. Install the CLI and create an API key.

  2. 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
  3. 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.

  4. Translate BrowserStack filters into a filter file.

  5. Add the Marathon Cloud step to CI next to the BrowserStack step with --ignore-test-failures while you compare results, using the GitHub Action, Bitrise step, or Docker image.

  6. Point your JUnit publisher at <output>/tests/omni/marathon_junit_report.xml.

  7. Once results match, drop --ignore-test-failures and remove the BrowserStack step.