Testing Trong Flutter
 · 2 min read
Giới Thiệu
Testing là một phần quan trọng trong quá trình phát triển ứng dụng Flutter. Flutter hỗ trợ ba loại testing chính:
- Unit Testing
- Widget Testing
- Integration Testing
Unit Testing
Cài đặt Dependencies
dev_dependencies:
  test: ^1.24.0
  mockito: ^5.4.0
  build_runner: ^2.4.0
Ví dụ Unit Test
// Class cần test
class Calculator {
  int add(int a, int b) => a + b;
}
// Test file
import 'package:test/test.dart';
void main() {
  group('Calculator', () {
    late Calculator calculator;
    setUp(() {
      calculator = Calculator();
    });
    test('add should return correct sum', () {
      expect(calculator.add(2, 3), equals(5));
    });
  });
}
Widget Testing
Cài đặt
dev_dependencies:
  flutter_test:
    sdk: flutter
Ví dụ Widget Test
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
  await tester.pumpWidget(MyApp());
  expect(find.text('0'), findsOneWidget);
  expect(find.text('1'), findsNothing);
  await tester.tap(find.byIcon(Icons.add));
  await tester.pump();
  expect(find.text('0'), findsNothing);
  expect(find.text('1'), findsOneWidget);
});
Integration Testing
Cài đặt
dev_dependencies:
  integration_test:
    sdk: flutter
Ví dụ Integration Test
void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  testWidgets('Complete flow test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());
    // Login flow
    await tester.enterText(
      find.byKey(Key('username')), 
      'testuser'
    );
    await tester.enterText(
      find.byKey(Key('password')), 
      'password123'
    );
    await tester.tap(find.byType(ElevatedButton));
    await tester.pumpAndSettle();
    // Verify home screen
    expect(find.text('Welcome'), findsOneWidget);
  });
}
Mocking trong Flutter
Sử dụng Mockito
// Tạo mock class
@GenerateMocks([HttpClient])
void main() {
  late MockHttpClient mockHttpClient;
  setUp(() {
    mockHttpClient = MockHttpClient();
  });
  test('fetchData returns data on success', () async {
    when(mockHttpClient.get(any))
        .thenAnswer((_) async => Response('{"data": "test"}', 200));
    
    final result = await DataService(mockHttpClient).fetchData();
    expect(result, equals('test'));
  });
}
Best Practices
Unit Testing
- Test một function/method độc lập
- Tập trung vào business logic
- Sử dụng mocking cho external dependencies
Widget Testing
- Test UI components
- Verify widget rendering
- Test user interactions
Integration Testing
- Test complete user flows
- Verify app behavior end-to-end
- Test real device interactions
Continuous Integration
Cấu hình GitHub Actions
name: Flutter CI
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: subosito/flutter-action@v2
    - run: flutter test
Test Coverage
Generating Coverage Reports
# Run tests with coverage
flutter test --coverage
# Generate HTML report
genhtml coverage/lcov.info -o coverage/html
