Install
$ agentstack add skill-dhruvanbhalara-skills-flutter-testing ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
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
domainandbloclayers. - Test Independence: Each test MUST be independent. No shared mutable state between tests.
Test Types Overview
| Type | Scope | Speed | Skill | |---|---|---|---| | Unit | Single function/class | Fast | dart-testing | | Widget | Single UI component | Medium | flutter-add-widget-test | | Integration | Full app / user flow | Slow | flutter-add-integration-test |
Pattern-Based Testing
These three patterns cut repetitive test setup, cover all visual states, and keep widget behavior consistent. They're conventions, not packages.
Golden Variant Testing
When a widget has multiple visual states (primary, disabled, hover, error), test all variants in a single structured group() with a Map:
- Define a
variantsmap where keys are state names and values are widget builders. - Each variant MUST be rendered in isolation (fresh
pumpWidgetcall per variant). - Use deterministic golden file naming:
goldens/..png. - Set a consistent
surfaceSizeviatester.view.physicalSizeto avoid flaky pixel diffs. - When to use: Design system components, widgets with distinct modes/types.
- When NOT to use: Integration tests or animation frame verification.
State Matrix Testing
Every stateful widget MUST be tested against ALL possible UI states. Use a state matrix to separate setup from verification:
- Define a
statesmap with every state the widget can render (loading,error,data,empty). - Write a single
verify(stateName)callback that asserts correct rendering per state usingswitchexpressions. - This pattern prevents the common mistake of only testing the "happy path".
- When to use: Widgets with complex state machines (e.g., BLoC-driven screens).
- When NOT to use: If verification logic varies wildly between states, write separate tests.
Interaction Contract Testing
Reusable widgets have implicit behavioral rules. Define these as explicit, reusable contracts:
- Create helper functions in
test/utils/for common contracts: verifyTappable(tester, finder, mockCallback)— Tap fires callback exactly once.verifyDisabledNotTappable(tester, finder, mockCallback)— Tap does NOT fire callback when disabled.verifyValidatesOnBlur(tester, finder)— Validation triggers when focus leaves.- Apply contracts consistently across all widgets sharing the same behavior.
- When to use: Widgets with strictly defined behavioral rules that must hold across refactors.
- When NOT to use: One-off logic unique to a single widget.
Test Naming & Structure
- Test Naming: Use string interpolation for test group names:
group('$ClassName',notgroup('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 inExpandedor constrain dimensions in testVertical viewport was given unbounded height— WrapListViewinSizedBoxwith fixed height in testsetState called during build— Defer state changes to post-frame callbackNo MediaQuery widget ancestor— Always wrap test widget inMaterialApp
Running Tests (Quick Reference)
flutter test— Run all unit and widget testsflutter test test/path/to/file_test.dart— Run specific test fileflutter test integration_test/— Run integration testsflutter test --coverage— Run with coverage reportdart test— Pure Dart unit tests
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: dhruvanbhalara
- Source: dhruvanbhalara/skills
- License: MIT
- Homepage: https://dhruvanbhalara.github.io/skills/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.