ワンクリックで
flutter-testing
Add Flutter unit tests, widget tests, or integration tests
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Add Flutter unit tests, widget tests, or integration tests
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Configure your Flutter app to support assistive technologies like Screen Readers
Add animated effects to your Flutter app
Measure and reduce the size of the Flutter app bundle, APK, or IPA
Use the Flutter team's recommended app architecture
Execute long-running tasks in a background thread in Flutter
Set up a macOS environment for Flutter development
| name | flutter-testing |
| description | Add Flutter unit tests, widget tests, or integration tests |
| metadata | {"model":"models/gemini-3.1-pro-preview","last_modified":"Wed, 04 Mar 2026 21:41:12 GMT"} |
Generates, configures, and debugs automated tests for Flutter applications, encompassing unit, widget, integration, and plugin testing. Analyzes architectural components (such as MVVM layers) to produce isolated, mock-driven tests and end-to-end device tests. Assumes a standard Flutter project structure, existing business logic, and familiarity with Dart testing paradigms.
Evaluate the user's target code to determine the appropriate testing strategy using the following decision tree:
STOP AND ASK THE USER: "Which specific class, widget, or flow are we testing today? Please provide the relevant source code if you haven't already."
Unit tests verify logic without rendering UI. They must reside in the test/ directory and end with _test.dart.
import 'package:test/test.dart';
// Import your ViewModel and Fakes here
void main() {
group('HomeViewModel tests', () {
test('Load bookings successfully', () {
final viewModel = HomeViewModel(
bookingRepository: FakeBookingRepository()..createBooking(kBooking),
userRepository: FakeUserRepository(),
);
expect(viewModel.bookings.isNotEmpty, true);
});
});
}
import 'package:test/test.dart';
// Import your Repository and Fakes here
void main() {
group('BookingRepositoryRemote tests', () {
late BookingRepository bookingRepository;
late FakeApiClient fakeApiClient;
setUp(() {
fakeApiClient = FakeApiClient();
bookingRepository = BookingRepositoryRemote(apiClient: fakeApiClient);
});
test('should get booking', () async {
final result = await bookingRepository.getBooking(0);
final booking = result.asOk.value;
expect(booking, kBooking);
});
});
}
Widget tests verify UI rendering and interaction. They must reside in the test/ directory and use the flutter_test package.
WidgetTester to build the widget.Finder to locate elements (find.text(), find.byKey(), find.byWidget()).Matcher to verify existence (findsOneWidget, findsNothing, findsNWidgets).import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('HomeScreen displays title and handles tap', (WidgetTester tester) async {
// 1. Setup Fakes and ViewModel
final bookingRepository = FakeBookingRepository()..createBooking(kBooking);
final viewModel = HomeViewModel(
bookingRepository: bookingRepository,
userRepository: FakeUserRepository(),
);
// 2. Build the Widget tree
await tester.pumpWidget(
MaterialApp(
home: HomeScreen(viewModel: viewModel),
),
);
// 3. Finders
final titleFinder = find.text('Home');
final buttonFinder = find.byKey(const Key('increment_button'));
// 4. Assertions
expect(titleFinder, findsOneWidget);
// 5. Interactions
await tester.tap(buttonFinder);
await tester.pumpAndSettle(); // Wait for animations/state updates to finish
expect(find.text('1'), findsOneWidget);
});
}
Integration tests run on real devices or emulators. They must reside in the integration_test/ directory.
integration_test is in dev_dependencies in pubspec.yaml.IntegrationTestWidgetsFlutterBinding.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' as app;
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('End-to-End App Test', () {
testWidgets('Full flow: tap FAB and verify counter', (WidgetTester tester) async {
// Load the full app
app.main();
await tester.pumpAndSettle();
// Verify initial state
expect(find.text('0'), findsOneWidget);
// Find and tap the FAB
final fab = find.byKey(const ValueKey('increment'));
await tester.tap(fab);
// Trigger a frame
await tester.pumpAndSettle();
// Verify state change
expect(find.text('1'), findsOneWidget);
});
});
}
If testing a plugin, tests must cover both Dart and Native communication.
android/src/test/ (JUnit)example/ios/RunnerTests/ (XCTest)linux/test/ (GoogleTest)Provide the user with the exact command to run the generated test:
flutter test test/your_test_file.dartflutter test integration_test/your_test_file.dartSTOP AND ASK THE USER: "Please run the test using the command above and paste the output. If the test fails, provide the stack trace so I can analyze the failure and generate a fix."
_test.dart.tester.pump() for single frame advances. Use tester.pumpAndSettle() strictly when waiting for animations or asynchronous UI updates to complete.dart:mirrors: Flutter does not support reflection. Rely on code generation (e.g., build_runner, mockito, mocktail) for mocking.