搜索插件、代码仓与 APP 分类

插件详情v4.10.0

patrol

一个功能强大的多平台端到端UI测试框架,适用于Flutter应用,能够克服integration_test的局限性,处理原生交互。

AndroidiOSWebmacOS
近 30 天下载
67.9万
喜欢数
731
Pub 分数
140

安装插件

flutter pub add patrol

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Patrol 是一个适用于 Flutter 的多平台端到端 UI 测试框架,其功能超越了 integration_test,能够无缝地与原生平台功能进行交互。它允许测试人员在 Android、iOS、Web 和 macOS 上模拟真实用户行为,包括处理原生对话框、权限和系统级操作。Patrol 以可靠性和开发者体验为核心设计,简化了复杂的测试场景,同时保持跨平台的一致性。其架构支持强大且可维护的测试套件,真实反映应用程序的实际使用情况。

适合场景

  • 测试原生对话框交互
  • 验证平台特定行为
  • 跨平台 UI 验证
  • 处理运行时权限
  • 模拟设备特定事件
  • 端到端工作流验证

主要特点

  • 原生交互支持
  • 跨平台测试(Android、iOS、Web、macOS)
  • 相比 integration_test 的测试可靠性有所提高
  • 真实用户模拟
  • 内置重试和等待机制
  • 简洁、可读的测试语法

适合对象

  • 构建复杂 Flutter 应用的团队
  • 需要原生功能测试的开发者
  • 跨平台需要一致的端到端测试的项目
  • 测试自动化工程师
  • CI/CD 流水线集成

使用建议

  • 与 basic integration_test 相比,需要额外的设置
  • 可能需要平台特定的配置
  • 最适合具有专门测试工作流程的成熟项目
  • 与主流包相比,文档有限
  • 新用户的学习曲线更高

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Patrol

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

A powerful, multiplatform E2E UI testing framework for Flutter apps that overcomes the limitations of integration_test by handling native interactions. Developed by LeanCode since 2022, battle-tested and shaped by production-grade experience.

Patrol promotional 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:

[!NOTE] Patrol 4.7.0 adds Swift Package Manager support for iOS and macOS! If you migrate your project to SPM, a few small setup changes are needed — see the iOS setup guide for details.

Patrol custom finders

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')),
    'charlie@root.me',
  );
  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('charlie@root.me');
  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.

Patrol native automation

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);
  });
}

CLI

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.

Package

See packages/patrol.

CI/CD Workflows

See .github/WORKFLOWS.md for detailed documentation about all GitHub Actions workflows, including test schedules, Flutter versions, and deployment pipelines.

Patrol contracts generator

  1. (Optionally) add new request type:
class OpenAppRequest {
  late String appId;
}
  1. Add new method to NativeAutomator:
abstract class NativeAutomator<IOSServer, AndroidServer, DartClient> {
  ...
  void openApp(OpenAppRequest request);
  ...
}
  1. Run gen_from_schema script, few files will be updated

Develop patrol_cli

If you have previously activated patrol_cli run:

dart pub global deactivate patrol_cli

then

cd packages/patrol_cli
flutter pub global activate -s path .

🛠️ 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.


Need help with your Flutter project?

👉 Hire our team   •   Check our other packages

所属分类

依赖

依赖清单 11 项

源码仓库

使用此插件的项目

所在榜单