v0.5.1 — BSL 1.1 open source

Flutter E2E tests in
plain English

Write tests your whole team can read. Execute with direct widget-tree access — no accessibility layer, no WebDriver overhead.

login.probe
test "user can log in"
  open the app
  tap "Sign In"
  type "[email protected]" into "Email"
  type "secret" into "Password"
  tap "Continue"
  see "Dashboard"         <!-- 7 lines. Done. -->
Get Started Quick Start Guide
<50ms
Command round-trip
<0.5%
Flake rate
<100ms
CLI cold start
7
Migration formats

Architecture

Two components. One WebSocket. Zero flakiness.

probe CLI

Parses .probe files, manages devices, dispatches commands, generates reports

Go · 15MB binary
JSON-RPC 2.0 WebSocket :48686

ProbeAgent

Runs inside your app. Walks widget tree, executes actions, captures screenshots

Dart · dev dependency

Everything you need

No plugins to install. No extra packages. Batteries included.

N Natural language

ProbeScript reads like English. No locators, no async/await. QA, product, and engineering can all read the tests.

Sub-50ms execution

Direct widget-tree access via the Dart agent. No XPath, no accessibility bridge. Command round-trips under 50 milliseconds.

Watch mode

Re-runs on file save with hot-reload awareness. Iteration cycles under 2 seconds. No recompilation needed.

Cross-platform

Same tests on Android emulators, iOS simulators, and physical devices. Stable WiFi testing with zero connection drops. Permissions, lifecycle, and platform quirks handled automatically.

Test recording

Record taps, swipes, and text input on a real device. FlutterProbe writes the .probe file as you interact.

Visual regression

Screenshot baselines with configurable pixel thresholds. Catch unintended UI changes before they ship.

HTTP mocking

Mock API responses directly in test files. No external packages, no separate mock server.

CI/CD ready

JUnit XML, JSON, HTML reports. Official Docker image. GitHub Actions workflow included. Test sharding with --shard N.

Side by side

Same login test. Different experience.

FlutterProbe7 lines
test "user can log in" open the app tap "Sign In" type "[email protected]" into "Email" type "secret" into "Password" tap "Continue" see "Dashboard"
flutter_test13 lines
testWidgets('user can log in', (t) async {
app.main();
await t.pumpAndSettle();
await t.tap(find.text('Sign In'));
await t.pumpAndSettle();
await t.enterText(
find.byType(TextField).first,
'[email protected]');
await t.enterText(
find.byType(TextField).last,
'secret');
await t.tap(find.text('Continue'));
await t.pumpAndSettle();
expect(find.text('Dashboard'),
findsOneWidget);
});

Migrate from anything

probe-convert handles 7 source formats. 100% construct coverage.

Maestro
Gherkin
Robot Framework
Detox
Appium Python
Appium Java
Appium JS

Zero to tests in 4 steps

01

Install

Single binary. No runtime deps.

curl -Lo probe ...releases/latest/download/probe-linux-amd64
02

Init

Scaffolds config and test directory.

probe init
03

Write

Plain English in a .probe file.

tests/login.probe
04

Run

Against any connected device.

probe test tests/ -v

FAQ

Can I test on physical iOS devices?

Yes. FlutterProbe supports physical iOS devices via USB or WiFi. WiFi is recommended — it provides a stable, drop-free connection. USB-C cables can cause intermittent disconnects due to charge/data mode switching. Build with --dart-define=PROBE_WIFI=true and connect with --host <device-ip>.

Why does my USB connection keep dropping?

USB-C cables switch between charging and data transfer modes, which momentarily disconnects the device. FlutterProbe auto-reconnects (up to 2 retries), but this adds latency. Switch to WiFi testing to eliminate drops entirely, or use a USB-A cable which doesn’t have this issue.

Does restart the app work over WiFi?

Yes. The CLI pre-shares a token with the agent before restarting. After restart, the agent uses the pre-shared token — no USB log reading needed.

What operations are unsupported on physical devices?

clear app data, allow/deny permission, and set location are skipped with a warning on physical iOS devices (no simulator sandbox access). On Android physical devices, only set location is unsupported. All other operations work normally.

Do I need to modify my Flutter app?

Add flutter_probe_agent as a dev dependency and call ProbeAgent.start() in your main entrypoint, guarded by --dart-define=PROBE_AGENT=true. No other changes needed. The agent is stripped from release builds.

Can I run tests in CI/CD?

Yes. FlutterProbe includes GitHub Actions workflows for Android (ubuntu + emulator) and iOS (macOS + simulator) with 3-way test sharding, automated app build, and HTML report generation. Use --format junit -o results.xml for CI integration.

Try it now

$ make build