skills/flutter-testing/SKILL.md

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