31 skills · 85 min
Skills
Skill 16 of 31
Configures Flutter Driver for app interaction and converts MCP actions into permanent integration tests.
2 minutes · 420 words · 11 sections
Install
npx skills add flutter/agent-plugins --skill flutter-add-integration-testnpx skills add flutter/agent-plugins/plugin marketplace add flutter/agent-pluginsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Configure the project to support integration testing and Flutter Driver extensions.
pubspec.yaml:
flutter pub add 'dev:integration_test:{"sdk":"flutter"}'
flutter pub add 'dev:flutter_test:{"sdk":"flutter"}'lib/main.dart or a dedicated lib/main_test.dart):
package:flutter_driver/driver_extension.dart.enableFlutterDriverExtension(); before runApp().Key parameters (e.g., ValueKey('login_button')) to critical widgets in the application code to ensure reliable targeting during tests.Use the Dart/Flutter MCP server tools to interactively explore and manipulate the application state before writing static tests.
launch_app with target: "lib/main_test.dart" to start the application and acquire the DTD URI.get_widget_tree to discover available Keys, Text nodes, and widget Types.tap, enter_text, and scroll to simulate user flows.waitFor or verify state with get_health when navigating or triggering animations.SliverList or ListView. Execute scroll or scrollIntoView to force the widget to mount before interacting with it.Structure integration tests using the flutter_test API paradigm.
integration_test/ directory at the project root.<name>_test.dart convention.IntegrationTestWidgetsFlutterBinding.ensureInitialized(); at the start of main().await tester.pumpWidget(MyApp());.await tester.pumpAndSettle(); after interactions like tester.tap().expect(find.byKey(ValueKey('foo')), findsOneWidget); or findsNothing.await tester.scrollUntilVisible(itemFinder, 500.0, scrollable: listFinder);.Conditional Logic for Legacy flutter_driver:
flutter_driver tests, use driver.waitFor(), driver.waitForAbsent(), driver.tap(), and driver.scroll() instead of the WidgetTester APIs.Execute tests using the flutter drive command. Require a host driver script located in test_driver/integration_test.dart that calls integrationDriver().
Conditional Execution Targets:
chromedriver --port=4444 in a separate terminal, then run:
flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart -d chrome-d web-server.flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart.flutter build apk --debug./gradlew app:assembleAndroidTestCopy and follow this checklist to implement and verify integration tests.
integration_test and flutter_test to pubspec.yaml.enableFlutterDriverExtension() into the app entry point.ValueKeys to target widgets.launch_app via MCP.get_widget_tree.tap, enter_text).integration_test/app_test.dart.WidgetTester APIs.test_driver/integration_test.dart with integrationDriver().integration_test/app_test.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', () {
test_driver/integration_test.dart)import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();test_driver/perf_driver.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 =
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.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 17 September 2026.SKILL.md, not by matching a directory convention. 2 distinct layouts observed: .agents/agents/reidbaker-agent/skills/*/SKILL.md, skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Dart and Flutter Team, declaring 1 plugin. It is read for editorial metadata only — never as the skill index, which is always the repository tree.flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart.PumpAndSettleTimedOutException occurs, check for infinite animations -> If widget not found, add scrollUntilVisible -> Re-run test until passing./flutter/agent-plugins.md, and each skill at its own .md URL.