59 lines
2.9 KiB
Markdown
59 lines
2.9 KiB
Markdown
---
|
|
name: flutter-testing
|
|
description: Quality Assurance & Advanced Testing
|
|
metadata:
|
|
platforms: "flutter"
|
|
languages: "dart"
|
|
category: "testing"
|
|
---
|
|
|
|
# Testing Strategy
|
|
|
|
- **Test Pyramid**: More unit and widget tests, fewer integration tests. Unit tests are fastest and cheapest.
|
|
- **Mirror Test Rule**: 100% logic and widget coverage. No code without a test.
|
|
- **Mirror Organization**: Test files MUST strictly mirror the `lib/` directory structure and end with `_test.dart`.
|
|
- **Coverage Targets**: Target 100% logic coverage for `domain` and `bloc` layers.
|
|
- **Test Independence**: Each test MUST be independent. No shared mutable state between tests.
|
|
|
|
# Unit Testing
|
|
|
|
- Follow the Arrange-Act-Assert (Given-When-Then) convention for clear and maintainable tests
|
|
- Use mocks for dependencies except for lightweight third-party services
|
|
- Test business logic in isolation from the UI
|
|
- For tests, ensure to create 5 to 8 tests for logical operations with real scenarios
|
|
- **Mocking Protocol**: Use `mocktail` for all dependency mocking. STRICTLY prohibit using real implementation dependencies in unit tests.
|
|
- **Pure Logic**: Business logic inside BLoCs or UseCases should be extracted to static pure functions for 100% unit test coverage.
|
|
|
|
# Widget Testing
|
|
|
|
- Write widget tests for all major UI components
|
|
- Test user interactions and state changes
|
|
- **Widget Keys**: Use `Key('feature_action_id')` format on interactive widgets for test access
|
|
- **Test Localization**: Use `AppLocalizations` (`context.l10n`) in widget tests — no hardcoded strings
|
|
|
|
# Integration Testing
|
|
|
|
- Use `IntegrationTestWidgetsFlutterBinding.ensureInitialized()` at the start of integration tests
|
|
- Interact with widgets via `Key` (e.g., `find.byKey(const ValueKey('increment'))`)
|
|
- Use `pumpAndSettle()` to wait for animations and async operations to complete
|
|
- Run with: `flutter test integration_test/`
|
|
|
|
# Test Naming & Structure
|
|
|
|
- **Test Naming**: Use string interpolation for test group names: `group('$ClassName',` not `group('ClassName',`. This ensures consistency and enables better tooling support.
|
|
- **Test Grouping**: Use `group()` to organize tests by feature, class, or state for clearer reporting.
|
|
- **Descriptive Names**: Test names should clearly describe what is being tested and why.
|
|
|
|
# Common Test Errors
|
|
|
|
- `A RenderFlex overflowed...` — Wrap widget in `Expanded` or constrain dimensions in test
|
|
- `Vertical viewport was given unbounded height` — Wrap `ListView` in `SizedBox` with fixed height in test
|
|
- `setState called during build` — Defer state changes to post-frame callback
|
|
|
|
# Running Tests
|
|
|
|
- `flutter test` — Run all unit and widget tests
|
|
- `flutter test test/path/to/file_test.dart` — Run specific test file
|
|
- `flutter test integration_test/` — Run integration tests
|
|
- `flutter test --coverage` — Run with coverage report
|