Analyzed Jul 13, 2026
flutter/agent-plugins · Official
flutter-add-integration-test
Configures Flutter Driver for app interaction and converts MCP actions into permanent integration tests. Use when adding integration testing to a project, exploring UI components via MCP, or automating user flows with the integration_test package.
Installation
npx skills add flutter/agent-plugins --skill flutter-add-integration-test
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Browser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
11.9K installsPostgres best practices maintained by Supabase, for Postgres running anywhere. Load this skill …
1.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
4.7K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
1.7K installsPre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure…
1.5K installsConfigure Azure API Management as an AI Gateway for AI models, MCP tools, and agents. WHEN: sem…
1.5K installsSecurity audits
Partner security reviews for this skill.
Analyzed Jul 13, 2026
Analyzed Jul 13, 2026
0 alerts
Also in this package
Other skills from flutter/agent-plugins · top by installs.
npx skills add flutter/agent-plugins
More details
Agent compatibility
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Repository health
main
Skill metadata
Parsed from SKILL.md frontmatter.
More metadata
- model
- models/gemini-3.1-pro-preview
- last_modified
- Tue, 21 Apr 2026 18:29:20 GMT
Package contents
Files included with this skill beyond the listing page.
-
skill md
SKILL.md7,342 B -
docs
SUMMARY.md283 B
History
- First seen on skills.sh
- First recorded snapshot · 30,600 installs
SKILL.md
Implementing Flutter Integration Tests
Contents
- [Project Setup and Dependencies](#project-setup-and-dependencies)
- [Interactive Exploration via MCP](#interactive-exploration-via-mcp)
- [Test Authoring Guidelines](#test-authoring-guidelines)
- [Execution and Profiling](#execution-and-profiling)
- [Workflow: End-to-End Integration Testing](#workflow-end-to-end-integration-testing)
- [Examples](#examples)
Project Setup and Dependencies
Configure the project to support integration testing and Flutter Driver extensions.
- Add required development dependencies to
pubspec.yaml:
``bash flutter pub add 'dev:integrationtest:{"sdk":"flutter"}' flutter pub add 'dev:fluttertest:{"sdk":"flutter"}' ``
- Enable the Flutter Driver extension in your application entry point (typically
lib/main.dartor a dedicatedlib/main_test.dart):
- Import package:flutterdriver/driverextension.dart. - Call enableFlutterDriverExtension(); before runApp().
- Add
Keyparameters (e.g.,ValueKey('login_button')) to critical widgets in the application code to ensure reliable targeting during tests.
Interactive Exploration via MCP
Use the Dart/Flutter MCP server tools to interactively explore and manipulate the application state before writing static tests.
- Launch: Execute
launchappwithtarget: "lib/maintest.dart"to start the application and acquire the DTD URI. - Inspect: Execute
getwidgettreeto discover availableKeys,Textnodes, and widgetTypes. - Interact: Execute
tap,enter_text, andscrollto simulate user flows. - Wait: Always execute
waitForor verify state withget_healthwhen navigating or triggering animations. - Troubleshoot Unmounted Widgets: If a widget is not found in the tree, it may be lazily loaded in a
SliverListorListView. ExecutescrollorscrollIntoViewto force the widget to mount before interacting with it.
Test Authoring Guidelines
Structure integration tests using the flutter_test API paradigm.
- Create a dedicated
integration_test/directory at the project root. - Name all test files using the
<name>_test.dartconvention. - Initialize the binding by calling
IntegrationTestWidgetsFlutterBinding.ensureInitialized();at the start ofmain(). - Load the application UI using
await tester.pumpWidget(MyApp());. - Trigger frames and wait for animations to complete using
await tester.pumpAndSettle();after interactions liketester.tap(). - Assert widget visibility using
expect(find.byKey(ValueKey('foo')), findsOneWidget);orfindsNothing. - Scroll to specific off-screen widgets using
await tester.scrollUntilVisible(itemFinder, 500.0, scrollable: listFinder);.
Conditional Logic for Legacy flutter_driver:
- If maintaining or migrating legacy
flutter_drivertests, usedriver.waitFor(),driver.waitForAbsent(),driver.tap(), anddriver.scroll()instead of theWidgetTesterAPIs.
Execution and Profiling
Execute tests using the flutter drive command. Require a host driver script located in testdriver/integrationtest.dart that calls integrationDriver().
Conditional Execution Targets:
- If testing on Chrome: Launch
chromedriver --port=4444in a separate terminal, then run:
flutter drive --driver=testdriver/integrationtest.dart --target=integrationtest/apptest.dart -d chrome
- If testing headless web: Run with
-d web-server. - If testing on Android (Local): Run
flutter drive --driver=testdriver/integrationtest.dart --target=integrationtest/apptest.dart. - If testing on Firebase Test Lab (Android):
1. Build debug APK: flutter build apk --debug 2. Build test APK: ./gradlew app:assembleAndroidTest 3. Upload both APKs to the Firebase Test Lab console.
Workflow: End-to-End Integration Testing
Copy and follow this checklist to implement and verify integration tests.
- Task Progress: Setup
- [ ] Add integrationtest and fluttertest to pubspec.yaml. - [ ] Inject enableFlutterDriverExtension() into the app entry point. - [ ] Assign ValueKeys to target widgets.
- Task Progress: Exploration
- [ ] Run launchapp via MCP. - [ ] Map the widget tree using getwidgettree. - [ ] Validate interaction paths using MCP tools (tap, entertext).
- Task Progress: Authoring
- [ ] Create integrationtest/apptest.dart. - [ ] Write test cases using WidgetTester APIs. - [ ] Create testdriver/integrationtest.dart with integrationDriver().
- Task Progress: Execution & Feedback Loop
- [ ] Run flutter drive --driver=testdriver/integrationtest.dart --target=integrationtest/apptest.dart. - [ ] Feedback Loop: Review test output -> If PumpAndSettleTimedOutException occurs, check for infinite animations -> If widget not found, add scrollUntilVisible -> Re-run test until passing.
Examples
Standard Integration Test (integrationtest/apptest.dart)
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('End-to-end test', () {
testWidgets('tap on the floating action button, verify counter', (tester) async {
// Load app widget.
await tester.pumpWidget(const MyApp());
// Verify the counter starts at 0.
expect(find.text('0'), findsOneWidget);
// Find the floating action button to tap on.
final fab = find.byKey(const ValueKey('increment'));
// Emulate a tap on the floating action button.
await tester.tap(fab);
// Trigger a frame and wait for animations.
await tester.pumpAndSettle();
// Verify the counter increments by 1.
expect(find.text('1'), findsOneWidget);
});
});
}
Host Driver Script (testdriver/integrationtest.dart)
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();
Performance Profiling Driver Script (testdriver/perfdriver.dart)
Use this driver script if you wrap your test actions in binding.traceAction() to capture performance metrics.
import 'package:flutter_driver/flutter_driver.dart' as driver;
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() {
return integrationDriver(
responseDataCallback: (data) async {
if (data != null) {
final timeline = driver.Timeline.fromJson(
data['scrolling_timeline'] as Map<String, dynamic>,
);
final summary = driver.TimelineSummary.summarize(timeline);
await summary.writeTimelineToFile(
'scrolling_timeline',
pretty: true,
includeSummary: true,
);
}
},
);
}