Flutter có ba tầng test, khác nhau ở phạm vi và tốc độ:
| Unit test | Widget test | Integration test | |
|---|---|---|---|
| Kiểm tra | Hàm, class, logic (repository, bloc) | Một widget hoặc một màn | Cả app, luồng người dùng thật |
| Chạy trên | Dart VM | Môi trường test, không cần thiết bị | Thiết bị thật/emulator |
| Package | test / flutter_test | flutter_test | integration_test |
| Tốc độ | Rất nhanh | Nhanh | Chậm |
dart
testWidgets('bấm + thì tăng số', (tester) async {
await tester.pumpWidget(const MaterialApp(home: CounterPage()));
await tester.tap(find.byIcon(Icons.add));
await tester.pump(); // dựng frame mới sau setState
expect(find.text('1'), findsOneWidget);
});Widget test không mở app thật: tester dựng widget trong môi trường test, cho phép tap, nhập chữ, rồi pump()/pumpAndSettle() để chạy tiếp frame. Dependency bên ngoài (API, database) được thay bằng mock/fake (mocktail, mockito).
Chiến lược thường gặp: nhiều unit test cho logic, widget test cho các màn quan trọng, vài integration test cho luồng chính (đăng nhập, thanh toán). Golden test (so ảnh chụp của widget) hữu ích cho design system.
Lưu ý: quên await trước tester.tap/pump, hoặc quên pump() sau thao tác, là lỗi hay gặp — test sẽ kiểm tra trạng thái cũ. pumpAndSettle() sẽ timeout nếu màn có animation lặp vô hạn (loading spinner).