A broad QA tool for UI/UX consistency, codebase testing, and security auditing.
Install
mkdir -p .claude/skills/tester-saadhjawwadh && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/18943" && unzip -o skill.zip -d .claude/skills/tester-saadhjawwadh && rm skill.zipInstalls to .claude/skills/tester-saadhjawwadh
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
A comprehensive testing skill that covers UI/UX consistency, codebase QA, security auditing, and verification of settings and backups.Key capabilities
- →Verify Material Design 3 compliance
- →Check haptics and micro-animations
- →Ensure overflow protection for text
- →Execute full local test suites
- →Audit data integrity and backups
- →Perform security audits
How it works
The skill executes QA verifications, unit/widget tests, security audits, and layout validations. It includes specific checks for UI/UX, codebase quality, data integrity, and security, along with release-mode verification learnings.
Inputs & outputs
When to use Tester
- →Validating Material Design compliance
- →Running full test suites
- →Performing security audits
About this skill
Tester Skill
Use this skill to execute QA verifications, unit/widget tests, security audits, and layout validations.
1. UI/UX & Layout Verification
- Material Design 3: Verify components follow dynamic Material You themes, container colors (
surfaceContainerLowfor cards,surfaceContainerHighfor dialogs), and shape specifications. - Haptics and Snappiness: Check that micro-animations (e.g.
OpenContainertransitions) run smoothly and buttons provide tactile feedback. - Overflow Protection: Verify all dynamically generated text is wrapped appropriately (
Flexible/Expanded) to preventRenderFlex overflowissues. - Visual Validation: Capture screenshots of the mobile emulator (
emulator-5554) to verify layouts:adb exec-out screencap -p > "screenshots/<filename>.png"
2. Codebase QA & Mocking
- Test Suite execution: Always run the full local test suite:
flutter test - Path Provider Mocking: Unit or widget tests utilizing filesystem paths must mock the path provider channel inside
setUp:TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( const MethodChannel('plugins.flutter.io/path_provider'), (MethodCall methodCall) async => '.', ); - Context safety: Ensure all asynchronous callback gates check
context.mountedor statemountedbefore executing context operations. - Async Provider Constructor Races:
SettingsProviderloadsSharedPreferencesasynchronously in its constructor (loadSettings()). In unit tests where a new instance is instantiated (newSettings = SettingsProvider()), insertawait Future.delayed(const Duration(milliseconds: 100))before invoking methods likerestoreFromBackupMapto preventloadSettings()from finishing later and overwriting mock test state. - Widget Test Localization Delegates: Any widget test rendering screens that reference
AppLocalizations.of(context)(e.g.SettingsScreen) must includelocalizationsDelegates: AppLocalizations.localizationsDelegatesandsupportedLocales: AppLocalizations.supportedLocalesinsideMaterialAppin the test widget tree to preventnulllocalization exceptions.
3. Data Integrity & Backups Audit
- Backup Completeness: Ensure
BackupService.generateBackupJsonusesSettingsProvider.toBackupMap()to export settings. Never hardcode individual SharedPreferences keys, which go stale as new options are added. - Restore Operations: Ensure
SettingsProvider.restoreFromBackupMapcalls setter methods (e.g.,await setShowFinancialManager(value)) instead of assigning directly to private fields. Direct assignments skip saving to SharedPreferences, causing settings to revert on app restart. - Database Upgrades: Verify
onUpgradedatabase migrations (especially schema/junction table changes) preserve existing user data.
4. Security Auditing
- SQLCipher: Confirm that database connections are always opened securely with the key from KeyStore.
- App Lock Screen: Verify that background state detection locks the app after the idle timeout.
- Picker & Native Dialog Lock Bypasses: Verify that screens using platform file/image pickers, share sheets (
SharePlus.instance.share), or gallery permission dialogs (Gal.requestAccess) implementAppLockScreen.ignoreNextResumeLock()so that returning from native OS dialogs or sheet interfaces does not trigger the app lock screen and unmount the active widget state. - Secure Key Storage: Never store database encryption keys or backups in unencrypted
SharedPreferences. Migrate legacy backups toFlutterSecureStorageon launch and remove them from plaintext storage immediately to prevent leakage. - Android Notifications Resource Resolution: The
FlutterLocalNotificationsPluginlooks for initialization icons in the app'sdrawablefolder (e.g.R.drawable.launcher_icon). If the resource is only defined inmipmapdirectories, it will fail on startup with aPlatformException(invalid_icon). Place a copy of the target icon inside thedrawablefolder to ensure successful native initialization. - Tablet & Large Screen Manifest Compatibility: Ensure
android.hardware.telephony,camera, andmicrophonefeatures inAndroidManifest.xmlhaveandroid:required="false"and<supports-screens>is configured. Otherwise, Wi-Fi tablets (e.g. Samsung Galaxy Tab S10+) will be automatically excluded from Play Store distribution.
5. Release-Mode & On-Device Verification (v2.0 learnings)
- Debug hides release-only startup races. A WorkManager task opening the SQLCipher DB in a background isolate during cold start deadlocked the app on the splash — release builds only. ALWAYS install the release APK on the emulator and cold-start it before shipping. Give background tasks an
initialDelay, and wrapmain()'s initFuture.waitin a.timeout()so the first frame can never hang. - Diagnosing a stuck launch:
adb logcat -s flutter(engine + Dart prints),adb shell dumpsys window | grep mCurrentFocus,adb shell pidof <package>. Two "Impeller" engine lines = a background FlutterEngine (WorkManager) is also running. - Background isolate channels: MethodChannels registered in
MainActivity.configureFlutterEnginedo NOT exist in WorkManager isolates —MissingPluginExceptionfrom there is expected; code must catch it and prefs-only paths must still complete. - Drive the UI, don't assume: a FAB
tooltipswallowed the long-press that opened the template sheet — only caught by actually long-pressing on the emulator. Screenshot each new surface and LOOK at it. - Test-data parity:
createTestDatabasepins the CURRENT schema version — bump it together with_initDB'sversion:and add theonUpgradebranch, or tests diverge from production schema. - Flutter↔Kotlin prefs types: Dart
prefs.setIntstores a Long — Kotlin must readgetLong(...), notgetInt(...), or widget code silently falls back to defaults.
How it compares
This skill provides a complete and structured testing approach, covering UI/UX, codebase, data, and security, which is more thorough than isolated manual checks.
Compared to similar skills
Tester side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| Tester (this skill) | 0 | 15d | Review | Intermediate |
| mobile-games | 11 | 6mo | No flags | Intermediate |
| flutter | 13 | 3mo | No flags | Intermediate |
| get-it-expert | 1 | 5mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
mobile-games
davila7
Mobile game development principles. Touch input, battery, performance, app stores.
flutter
alinaqi
Flutter development with Riverpod state management, Freezed, go_router, and mocktail testing
get-it-expert
flutter-it
Expert guidance on get_it service locator and dependency injection for Flutter/Dart. Covers registration (singleton, factory, lazy, async), scopes with shadowing, async initialization with init() pattern, retrieval, testing with scope-based mocking, and production patterns. Use when working with get_it, dependency injection, service registration, scopes, or async initialization.
mobile-components
dadbodgeoff
Mobile-first UI components including bottom navigation, bottom sheets, pull-to-refresh, and swipe actions. Touch-optimized with proper gesture handling.
genui
gskinnerTeam
Core GenUI framework for dynamic AI-driven UIs. Use when: working with Conversation, SurfaceController, Transport, Surface, SurfaceHost, Catalog, CatalogItem, CatalogItemContext, DataModel, DataContext, DataPath, A2uiSchemas, ClientFunction, PromptBuilder, A2UiClientCapabilities, data binding, A2UI
flutter-bloc-state-management
HoangNguyen0403
Implement BLoC/Cubit state management correctly in Flutter. Use when writing, modifying, reviewing, or testing any BLoC, Cubit, state, or event file.