
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@testingbot/cli
Advanced tools
CLI tool to run Espresso, XCUITest and Maestro tests on TestingBot's cloud infrastructure
Run mobile tests on real devices in the cloud
Website · Documentation · npm
Run Espresso, XCUITest and Maestro tests on real devices in the cloud.
npm install -g @testingbot/cli
Requirements: NodeJS 20 or higher
The CLI requires TestingBot API credentials. You can authenticate in several ways:
testingbot login
This opens your browser for authentication. After logging in, your credentials are saved to ~/.testingbot.
--api-key and --api-secretTB_KEY and TB_SECRET~/.testingbot with content key:secretRun 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 patternsDevice 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 [mode] | Download test artifacts (logs, screenshots, video). Mode: all (default) or failed |
--artifacts-output-dir <path> | Directory to save artifacts zip (defaults to current directory) |
Advanced Options:
| Option | Description |
|---|---|
--shard-split <number> | Split flows into N parallel sessions for faster execution |
--ignore-checksum-check | Skip checksum verification and always upload the app |
CI/CD Integration:
| Option | Description |
|---|---|
--commit-sha <sha> | Git commit SHA associated with this test run |
--pull-request-id <id> | Pull request ID this test run originated from |
--repo-name <name> | Repository name (e.g., GitHub repo slug) |
--repo-owner <owner> | Repository owner (e.g., GitHub organization or username) |
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"
# Android app on real device with tags
testingbot maestro app.apk ./flows --device "Samsung Galaxy S24" --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"
# Download artifacts only for failed tests
testingbot maestro app.apk ./flows --download-artifacts failed --artifacts-output-dir ./artifacts
# Run in background (async)
testingbot maestro app.apk ./flows --async
# Split flows across 3 shards, grouping all flows over 3 parallel sessions
testingbot maestro app.apk ./flows --shard-split 3
# CI/CD integration with Git metadata
testingbot maestro app.apk ./flows \
--commit-sha "abc123def" \
--pull-request-id "42" \
--repo-owner "myorg" \
--repo-name "myapp"
Run 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 testsDevice 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 ./reports
Run 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 XCUITestsDevice 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" \
--async
By default, the CLI shows real-time progress updates including:
Use --quiet to suppress progress output.
Press Ctrl+C to gracefully stop running tests. The CLI will:
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 ./reports
Download 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 occurredFor more information, visit TestingBot Documentation.
MIT
FAQs
CLI tool to run Espresso, XCUITest and Maestro tests on TestingBot's cloud infrastructure
The npm package @testingbot/cli receives a total of 0 weekly downloads. As such, @testingbot/cli popularity was classified as not popular.
We found that @testingbot/cli demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.