Patrol
Simple yet powerful Flutter-first UI testing framework overcoming limitations of
flutter_test, integration_test, and flutter_driver. Created and supported
by LeanCode.

Learn more about Patrol:
- Our extensive documentation
- How Patrol 4.0 Makes Cross-Platform Flutter Testing Possible
- Simplifying Flutter Web Testing: Patrol Web
- Patrol VS Code Extension - A Better Way to Run and Debug Flutter UI Tests
How can we help you:
Patrol is an open-source framework created and maintained by LeanCode. However, if your company wants to scale fast and accelerate Patrolβs adoption, we offer a set of value-added services on top of the core framework.
You can find out more below:
Patrol
patrol package builds on top of flutter_test and integration_test to make
it easy to control the native UI from Dart test code. It must be used together with patrol_cli.
It also provides a new custom finder system to make Flutter widget tests more
concise and understandable, and writing them β faster and more fun. It you want
to only use custom finders, check out
patrol_finders.
Installation
$ dart pub add patrol --dev
Usage
Patrol has 2 main features β native automation and custom finders.
Read our docs to learn more about them!
Accessing native platform features
// example/patrol_test/example_test.dart
import 'package:example/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
void main() {
patrolTest(
'counter state is the same after going to home and going back',
($) async {
await $.pumpWidgetAndSettle(const MyApp());
await $(FloatingActionButton).tap();
expect($(#counterText).text, '1');
await $.platform.mobile.pressHome();
await $.platform.mobile.pressDoubleRecentApps();
expect($(#counterText).text, '1');
await $(FloatingActionButton).tap();
expect($(#counterText).text, '2');
await $.platform.mobile.openNotifications();
await $.platform.mobile.pressBack();
},
);
}
Custom finders
import 'package:example/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
void main() {
patrolTest(
'logs in successfully',
($) async {
await $.pumpWidgetAndSettle(const MyApp());
await $(#emailInput).enterText('user@leancode.co');
await $(#passwordInput).enterText('ny4ncat');
// Finds all widgets with text 'Log in' which are descendants of widgets with key
// box1, which are descendants of a Scaffold widget and tap on the first one.
await $(Scaffold).$(#box1).$('Log in').tap();
// Finds all Scrollables which have Text descendant
$(Scrollable).containing(Text);
// Finds all Scrollables which have a Button descendant which has a Text descendant
$(Scrollable).containing($(Button).containing(Text));
// Finds all Scrollables which have a Button descendant and a Text descendant
$(Scrollable).containing(Button).containing(Text);
},
);
}
π οΈ Maintained by LeanCode
This package is built with π by LeanCode. We are top-tier experts focused on Flutter Enterprise solutions.
Why LeanCode?
-
Creators of Patrol β the next-gen testing framework for Flutter.
-
Production-Ready β We use this package in apps with millions of users.
-
Full-Cycle Product Development β We take your product from scratch to long-term maintenance.
Libraries
- patrol
- Powerful Flutter-native UI testing framework overcoming limitations of existing Flutter testing tools. Ready for action!