Loading...
Loading...
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.
npx skill4agent add flutter/skills flutter-add-integration-testpubspec.yamlflutter pub add 'dev:integration_test:{"sdk":"flutter"}'
flutter pub add 'dev:flutter_test:{"sdk":"flutter"}'lib/main.dartlib/main_test.dartpackage:flutter_driver/driver_extension.dartenableFlutterDriverExtension();runApp()KeyValueKey('login_button')launch_apptarget: "lib/main_test.dart"get_widget_treeKeyTextTypetapenter_textscrollwaitForget_healthSliverListListViewscrollscrollIntoViewflutter_testintegration_test/<name>_test.dartIntegrationTestWidgetsFlutterBinding.ensureInitialized();main()await tester.pumpWidget(MyApp());await tester.pumpAndSettle();tester.tap()expect(find.byKey(ValueKey('foo')), findsOneWidget);findsNothingawait tester.scrollUntilVisible(itemFinder, 500.0, scrollable: listFinder);flutter_driverflutter_driverdriver.waitFor()driver.waitForAbsent()driver.tap()driver.scroll()WidgetTesterflutter drivetest_driver/integration_test.dartintegrationDriver()chromedriver --port=4444flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart -d chrome-d web-serverflutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dartflutter build apk --debug./gradlew app:assembleAndroidTestintegration_testflutter_testpubspec.yamlenableFlutterDriverExtension()ValueKeylaunch_appget_widget_treetapenter_textintegration_test/app_test.dartWidgetTestertest_driver/integration_test.dartintegrationDriver()flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dartPumpAndSettleTimedOutExceptionscrollUntilVisibleintegration_test/app_test.dartimport '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);
});
});
}test_driver/integration_test.dartimport 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();test_driver/perf_driver.dartbinding.traceAction()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,
);
}
},
);
}