v0.2.0 — 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 "user@test.com" 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 and iOS simulators. 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 "user@test.com" 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,
'user@test.com');
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

Try it now

$ make build