patrol-e2e-testing
Skill669 starsChanged 3 months agoMITView on GitHub
Use when writing E2E/integration tests, testing native interactions like permissions or system dialogs, capturing UI regressions, or validating cross-platform behavior (Patrol 4.x).
In this repository36 other files it gives its agents.
- AGENTS.mdAGENTS.md
- accessibilitySkill
- architecture-feature-firstSkill
- blocSkill
- code-reviewSkill
- dart-3-updatesSkill
- developing-genkit-dartSkill
- effective-dartSkill
- firebase-aiSkill
- firebase-analyticsSkill
- firebase-app-checkSkill
- firebase-authSkill
- firebase-cloud-firestoreSkill
- firebase-cloud-functionsSkill
- firebase-crashlyticsSkill
- firebase-databaseSkill
- firebase-data-connectSkill
- firebase-in-app-messagingSkill
- firebase-messagingSkill
- firebase-remote-configSkill
- firebase-storageSkill
- flutter-app-architectureSkill
- flutter-best-practicesSkill
- flutter-change-notifierSkill
- flutter-errorsSkill
- flutterfire-configureSkill
- flutter-pre-cachingSkill
- flutter-use-column-row-firstSkill
- generate-images-with-firebase-aiSkill
- inclusive-designSkill
- mockitoSkill
- mocktailSkill
- providerSkill
- revenuecat-testingSkill
- riverpodSkill
- testingSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. About 0 are common, 8 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Use this skill when:
- Distinctive: line 23
Follow the official Patrol documentation for installation and project initialization: https://patrol.leancode.co/documentation#setup
- Very specific: line 28
Add patrol as a dev dependency.
- Very specific: line 29
Place tests in patrol_test/.
- Distinctive: line 35
Follow these steps when implementing or updating Patrol tests.
- Distinctive: line 48
Avoid combining unrelated flows in a single test.
- Very specific: line 81
Use patrolTest() instead of testWidgets().
- Very specific: line 83
Use $(#keyName) to find widgets by Key.
- Very specific: line 84
Use explicit wait conditions (e.g., waitUntilVisible).
- Distinctive: line 104
Use native automation only when required by the feature.
- Distinctive: line 167
Run a specific file with live reload (development mode):
- Distinctive: line 173
Run a specific file:
- Very specific: line 212
Never use Future.delayed as a synchronization mechanism.
- Very specific: line 213
Use waitUntilVisible or waitUntilExists to wait for UI state.
- Distinctive: line 218
When applied, this skill produces:
- Very specific: line 225
Checkpoint: Run patrol test --target <file> locally to confirm the test passes before committing.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Patrol E2E Testing Skill
Design, implement, and run end-to-end (E2E) tests using Patrol 4.x in Flutter projects.
When to Use
Use this skill when:
- A new screen or user flow needs E2E test coverage.
- A feature interacts with native components (permissions, notifications, system dialogs, deep links).
- A UI bug should be captured as a regression test.
- Cross-platform behavior (Android / iOS / Web) must be validated.
- Setting up Patrol in a new or existing Flutter project.
Setup
Follow the official Patrol documentation for installation and project initialization: https://patrol.leancode.co/documentation#setup
Key Patrol conventions:
- Add
patrolas a dev dependency. - Place tests in
patrol_test/. - Name test files with a
_test.dartsuffix. - Execute tests with
patrol test.
Workflow
Follow these steps when implementing or updating Patrol tests.
1. Identify the user journey
Break the feature into:
- Actions: taps, scrolls, input, navigation, deep links.
- Observable outcomes: visible text, screen changes, enabled buttons, dialogs.
Rules:
- One test per primary (happy-path) journey.
- Separate tests for critical edge cases.
- Avoid combining unrelated flows in a single test.
2. Structure the Patrol test
Basic Patrol structure:
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
void main() {
patrolTest(
'user can log in successfully',
($) async {
await $.pumpWidgetAndSettle(const MyApp());
const email = String.fromEnvironment('E2E_EMAIL');
const password = String.fromEnvironment('E2E_PASSWORD');
await $(#emailField).enterText(email);
await $(#passwordField).enterText(password);
await $(#loginButton).tap();
await $.waitUntilVisible($(#homeScreenTitle));
expect($(#homeScreenTitle).text, equals('Welcome'));
},
);
}Key concepts:
- Use
patrolTest()instead oftestWidgets(). $is the Patrol tester.- Use
$(#keyName)to find widgets byKey. - Use explicit wait conditions (e.g.,
waitUntilVisible).
3. Handle native dialogs
For OS-level permission dialogs:
patrolTest('grants camera permission', ($) async {
await $.pumpWidgetAndSettle(const MyApp());
await $(#openCameraButton).tap();
if (await $.native.isPermissionDialogVisible()) {
await $.native.grantPermission();
}
await $.waitUntilVisible($(#cameraPreview));
});Use native automation only when required by the feature.
4. Selector & interaction quick reference
Finding widgets:
$('some text') // by text
$(TextField) // by type
$(Icons.arrow_back) // by iconTapping:
// Tap a widget containing a specific text label
await $(Container).$('click').tap();
// Tap a container that contains an ElevatedButton
await $(Container).containing(ElevatedButton).tap();
// Tap only the enabled ElevatedButton
await $(ElevatedButton)
.which<ElevatedButton>(
(b) => b.enabled,
)
.tap();Entering text:
// Enter text into the second TextField on screen
await $(TextField).at(1).enterText('your input');Scrolling:
await $(widget_you_want_to_scroll_to).scrollTo();Native interactions:
// Grant permission while app is in use
await $.native.grantPermissionWhenInUse();
// Open notification shade and tap a notification by text
await $.native.openNotifications();
await $.native.tapOnNotificationBySelector(
Selector(textContains: 'text'),
);5. Running Patrol tests
Run all tests:
patrol testRun a specific file with live reload (development mode):
patrol develop -t integration_test/my_test.dartRun a specific file:
patrol test --target patrol_test/login_test.dartRun on web:
patrol test --device chromeHeadless web (CI):
patrol test --device chrome --web-headless trueFilter by tags:
patrol test --tags android6. Stabilization patterns
Flaky tests undermine confidence. Apply these patterns:
// AVOID — arbitrary delay
await Future.delayed(Duration(seconds: 3));
// PREFER — explicit wait condition
await $.waitUntilVisible($(#targetWidget));
// For animations, pump until settled
await $.pumpAndSettle();- Never use
Future.delayedas a synchronization mechanism. - Use
waitUntilVisibleorwaitUntilExiststo wait for UI state. - Set
settleTimeoutinPatrolTesterConfigfor slow CI environments.
Output requirements
When applied, this skill produces:
- Patrol test(s) covering the specified feature.
- Any required widget
Keyadditions to production code. - Exact
patrol testcommand(s) to execute locally. - Notes explaining stabilization or timing decisions.
Checkpoint: Run patrol test --target <file> locally to confirm the test passes before committing.
Quality bar
A valid Patrol test must be:
- Deterministic — no arbitrary delays; uses explicit wait conditions.
- Readable — clear test name describing the user journey.
- Minimal but complete — one assertion chain per journey.
- Secret-safe — credentials loaded from
String.fromEnvironment, never hardcoded. - CI-ready — passes headless with
--web-headless trueor on emulator.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

