Simple yet powerful Flutter-first UI testing framework overcoming limitations of
flutter_test, integration_test, and flutter_driver. Created and supported
by LeanCode.
- 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
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:
Flutter's finders are powerful, but not very intuitive to use.
We took them and made something awesome.
Thanks to Patrol's custom finders, you'll take your tests from this:
testWidgets('signs up', (WidgetTester tester) async {
await tester.pumpWidget(AwesomeApp());
await tester.pumpAndSettle();
await tester.enterText(
find.byKey(Key('emailTextField')),
'[email protected]',
);
await tester.pumpAndSettle();
await tester.enterText(
find.byKey(Key('nameTextField')),
'Charlie',
);
await tester.pumpAndSettle();
await tester.enterText(
find.byKey(Key('passwordTextField')),
'ny4ncat',
);
await tester.pumpAndSettle();
await tester.tap(find.byKey(Key('termsCheckbox')));
await tester.pumpAndSettle();
await tester.tap(find.byKey(Key('signUpButton')));
await tester.pumpAndSettle();
expect(find.text('Welcome, Charlie!'), findsOneWidget);
});to this:
patrolTest('signs up', (PatrolIntegrationTester $) async {
await $.pumpWidgetAndSettle(AwesomeApp());
await $(#emailTextField).enterText('[email protected]');
await $(#nameTextField).enterText('Charlie');
await $(#passwordTextField).enterText('ny4ncat');
await $(#termsCheckbox).tap();
await $(#signUpButton).tap();
await $('Welcome, Charlie!').waitUntilVisible();
});Learn more about custom finders in the docs!
Patrol's custom finders are also available standalone in the patrol_finders package.
Flutter's default integration_test package can't interact with the OS your Flutter app is running on. This makes it impossible to test many critical business features, such as:
- granting runtime permissions
- signing into the app which through WebView or Google Services
- tapping on notifications
- much more!
Patrol's native automation feature solves these problems:
void main() {
patrolTest('showtime', (PatrolIntegrationTester $) async {
await $.pumpWidgetAndSettle(AwesomeApp());
// prepare network conditions
await $.platform.mobile.enableCellular();
await $.platform.mobile.disableWifi();
// toggle system theme
await $.platform.mobile.enableDarkMode();
// handle native location permission request dialog
await $.platform.mobile.selectFineLocation();
await $.platform.mobile.grantPermissionWhenInUse();
// tap on the first notification
await $.platform.mobile.openNotifications();
await $.platform.mobile.tapOnNotificationByIndex(0);
});
}
See packages/patrol_cli.
The CLI is needed to enable Patrol's native automation feature in integration tests. It also makes development of integration tests much faster thanks to [Hot Restart].
To run widget tests, you can continue to use flutter test.
See packages/patrol.
- (Optionally) add new request type:
class OpenAppRequest {
late String appId;
}- Add new method to
NativeAutomator:
abstract class NativeAutomator<IOSServer, AndroidServer, DartClient> {
...
void openApp(OpenAppRequest request);
...
}- Run
gen_from_schemascript, few files will be updated
If you have previously activated patrol_cli run:
dart pub global deactivate patrol_clithen
cd packages/patrol_cli
flutter pub global activate -s path .This package is built with ๐ by LeanCode. We are top-tier experts focused on Flutter Enterprise solutions.
-
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.