CLI tool to run Espresso, XCUITest and Maestro tests on TestingBot's cloud infrastructure.
npm install -g @testingbot/cliRequirements: NodeJS 20 or higher
The CLI requires TestingBot API credentials. You can authenticate in several ways:
testingbot loginThis opens your browser for authentication. After logging in, your credentials are saved to ~/.testingbot.
- Command-line options:
--api-keyand--api-secret - Environment variables:
TB_KEYandTB_SECRET - Config file: Create
~/.testingbotwith contentkey:secret
Run Maestro UI tests on real devices and emulators/simulators.
testingbot maestro <app> <flows...> [options]Arguments:
app- Path to your app file (.apk, .ipa, .app, or .zip)flows- One or more paths to flow files (.yaml/.yml), directories, .zip files, or glob patterns
Device Options:
| Option | Description |
|---|---|
--device <name> |
Device name (e.g., "Pixel 9", "iPhone 16") |
--platform <name> |
Platform: Android or iOS |
--deviceVersion <version> |
OS version (e.g., "14", "17.2") |
--real-device |
Use a real device instead of emulator/simulator |
--orientation <orientation> |
Screen orientation: PORTRAIT or LANDSCAPE |
--device-locale <locale> |
Device locale (e.g., "en_US", "de_DE") |
--timezone <timezone> |
Timezone (e.g., "America/New_York", "Europe/London") |
Test Configuration:
| Option | Description |
|---|---|
--name <name> |
Test name for dashboard identification |
--build <build> |
Build identifier for grouping test runs |
--include-tags <tags> |
Only run flows with these tags (comma-separated) |
--exclude-tags <tags> |
Exclude flows with these tags (comma-separated) |
-e, --env <KEY=VALUE> |
Environment variable for flows (can be repeated) |
--maestro-version <version> |
Maestro version to use (e.g., "2.0.10") |
Network & Location:
| Option | Description |
|---|---|
--throttle-network <speed> |
Network throttling: 4G, 3G, Edge, airplane, or disable |
--geo-country-code <code> |
Geographic IP location (ISO country code, e.g., "US", "DE") |
Output Options:
| Option | Description |
|---|---|
--async |
Start tests and exit without waiting for results |
-q, --quiet |
Suppress progress output |
--report <format> |
Download report after completion: html or junit |
--report-output-dir <path> |
Directory to save reports (required with --report) |
--download-artifacts |
Download test artifacts (logs, screenshots, video) |
--artifacts-output-dir <path> |
Directory to save artifacts zip (defaults to current directory) |
Examples:
# Basic usage
testingbot maestro app.apk ./flows
# Multiple flow directories
testingbot maestro app.apk ./flows/smoke ./flows/regression ./flows/e2e
# With device selection
testingbot maestro app.apk ./flows --device "Pixel 8" --deviceVersion "14"
# iOS app on real device with tags
testingbot maestro app.ipa ./flows --platform iOS --real-device --include-tags "smoke,regression"
# With environment variables
testingbot maestro app.apk ./flows -e API_URL=https://staging.example.com -e API_KEY=secret
# Download JUnit report
testingbot maestro app.apk ./flows --report junit --report-output-dir ./reports
# Download all artifacts (logs, screenshots, video)
testingbot maestro app.apk ./flows --download-artifacts --build "build-123"
# Run in background (async)
testingbot maestro app.apk ./flows --asyncRun Android Espresso tests on real devices and emulators.
testingbot espresso [appFile] [testAppFile] [options]Arguments:
appFile- Path to application APK filetestAppFile- Path to test APK file containing Espresso tests
Device Options:
| Option | Description |
|---|---|
--app <path> |
Path to application APK file |
--test-app <path> |
Path to test APK file |
--device <name> |
Device name (e.g., "Pixel 6", "Samsung.*") |
--platform-version <version> |
Android OS version (e.g., "12", "13", "14") |
--real-device |
Use a real device instead of an emulator |
--tablet-only |
Only allocate tablet devices |
--phone-only |
Only allocate phone devices |
--locale <locale> |
Device locale (e.g., "en_US", "de_DE") |
--timezone <timezone> |
Timezone (e.g., "America/New_York", "Europe/London") |
Test Configuration:
| Option | Description |
|---|---|
--name <name> |
Test name for dashboard identification |
--build <build> |
Build identifier for grouping test runs |
--test-runner <runner> |
Custom test instrumentation runner |
--language <lang> |
App language (ISO 639-1 code, e.g., "en", "fr", "de") |
Test Filtering:
| Option | Description |
|---|---|
--class <classes> |
Run tests in specific classes (comma-separated fully qualified names) |
--not-class <classes> |
Exclude tests in specific classes |
--package <packages> |
Run tests in specific packages (comma-separated) |
--not-package <packages> |
Exclude tests in specific packages |
--annotation <annotations> |
Run tests with specific annotations (comma-separated) |
--not-annotation <annotations> |
Exclude tests with specific annotations |
--size <sizes> |
Run tests by size: small, medium, large (comma-separated) |
Network & Location:
| Option | Description |
|---|---|
--throttle-network <speed> |
Network throttling: 4G, 3G, Edge, or airplane |
--geo-location <code> |
Geographic IP location (ISO country code, e.g., "US", "DE") |
Output Options:
| Option | Description |
|---|---|
--async |
Start tests and exit without waiting for results |
-q, --quiet |
Suppress progress output |
--report <format> |
Download report after completion: html or junit |
--report-output-dir <path> |
Directory to save reports (required with --report) |
Examples:
# Basic usage with positional arguments
testingbot espresso app.apk app-test.apk --device "Pixel 8"
# Using named options
testingbot espresso --app app.apk --test-app app-test.apk --device "Pixel 8"
# Real device with specific Android version
testingbot espresso app.apk app-test.apk \
--device "Samsung Galaxy S24" \
--platform-version "14" \
--real-device
# Run specific test classes
testingbot espresso app.apk app-test.apk \
--device "Pixel 8" \
--class "com.example.LoginTest,com.example.HomeTest"
# Run tests with annotations
testingbot espresso app.apk app-test.apk \
--device "Pixel 8" \
--annotation "com.example.SmokeTest" \
--size "small,medium"
# With network throttling and geolocation
testingbot espresso app.apk app-test.apk \
--device "Pixel 8" \
--throttle-network "3G" \
--geo-location "DE" \
--language "de"
# Download JUnit report
testingbot espresso app.apk app-test.apk \
--device "Pixel 8" \
--report junit \
--report-output-dir ./reportsRun iOS XCUITest tests on real devices and simulators.
testingbot xcuitest [appFile] [testAppFile] [options]Arguments:
appFile- Path to application IPA filetestAppFile- Path to test ZIP file containing XCUITests
Device Options:
| Option | Description |
|---|---|
--app <path> |
Path to application IPA file |
--test-app <path> |
Path to test ZIP file |
--device <name> |
Device name (e.g., "iPhone 15", "iPad.*") |
--platform-version <version> |
iOS version (e.g., "17.0", "18.2") |
--real-device |
Use a real device instead of a simulator |
--tablet-only |
Only allocate tablet devices |
--phone-only |
Only allocate phone devices |
--orientation <orientation> |
Screen orientation: PORTRAIT or LANDSCAPE |
--locale <locale> |
Device locale (e.g., "DE", "US") |
--timezone <timezone> |
Timezone (e.g., "America/New_York", "Europe/London") |
Test Configuration:
| Option | Description |
|---|---|
--name <name> |
Test name for dashboard identification |
--build <build> |
Build identifier for grouping test runs |
--language <lang> |
App language (ISO 639-1 code, e.g., "en", "fr", "de") |
Network & Location:
| Option | Description |
|---|---|
--throttle-network <speed> |
Network throttling: 4G, 3G, Edge, or airplane |
--geo-location <code> |
Geographic IP location (ISO country code, e.g., "US", "DE") |
Output Options:
| Option | Description |
|---|---|
--async |
Start tests and exit without waiting for results |
-q, --quiet |
Suppress progress output |
--report <format> |
Download report after completion: html or junit |
--report-output-dir <path> |
Directory to save reports (required with --report) |
Examples:
# Basic usage with positional arguments
testingbot xcuitest app.ipa app-test.zip --device "iPhone 16"
# Using named options
testingbot xcuitest --app app.ipa --test-app app-test.zip --device "iPhone 16"
# Real device with specific iOS version
testingbot xcuitest app.ipa app-test.zip \
--device "iPhone 15 Pro" \
--platform-version "17.2" \
--real-device
# iPad in landscape mode
testingbot xcuitest app.ipa app-test.zip \
--device "iPad Pro" \
--tablet-only \
--orientation LANDSCAPE
# With localization settings
testingbot xcuitest app.ipa app-test.zip \
--device "iPhone 16" \
--locale "DE" \
--language "de" \
--timezone "Europe/Berlin"
# With network throttling and geolocation
testingbot xcuitest app.ipa app-test.zip \
--device "iPhone 16" \
--throttle-network "3G" \
--geo-location "DE"
# Download HTML report
testingbot xcuitest app.ipa app-test.zip \
--device "iPhone 16" \
--report html \
--report-output-dir ./reports
# Run in background
testingbot xcuitest app.ipa app-test.zip \
--device "iPhone 16" \
--asyncBy default, the CLI shows real-time progress updates including:
- Test status updates
- Device allocation status
- Live output from Maestro flows
Use --quiet to suppress progress output.
Press Ctrl+C to gracefully stop running tests. The CLI will:
- Stop all active test runs on TestingBot
- Clean up resources
- Exit with appropriate status code
Press Ctrl+C twice to force exit immediately.
All test frameworks support downloading reports after completion:
# JUnit XML format (for CI integration)
--report junit --report-output-dir ./reports
# HTML format (for human viewing)
--report html --report-output-dir ./reportsDownload all test artifacts including logs, screenshots, and video recordings:
testingbot maestro app.apk ./flows --download-artifacts --build "my-build"Artifacts are saved as a zip file named after the --build value (or with a timestamp if not provided).
0- All tests passed1- One or more tests failed or an error occurred
For more information, visit TestingBot Documentation.
MIT