Patrol

patrol on pub.dev patrol_cli on pub.dev patrol_finders on pub.dev patrol_discord code style patrol_github_stars patrol_x

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

Patrol promotial graphics

Learn more about Patrol:

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

LeanCode Logo

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.


Need help with your Flutter project?

πŸ‘‰ Hire our team   β€’   Check our other packages

Libraries

patrol
Powerful Flutter-native UI testing framework overcoming limitations of existing Flutter testing tools. Ready for action!