Android Testing Standards skill
Write Android unit, Compose UI, and Hilt-integrated tests.
by HoangNguyen0403·MIT license·★ 569 Stars on the repo·GitHub ↗
Use now
npx degit HoangNguyen0403/agent-skills-standard/skills/android/android-testing#develop ~/.claude/skills/android-testingChecked ·commit develop
Files of Android Testing Standards
SKILL.md
Show the full text62 lines
Android Testing Standards
Priority: P0 (CRITICAL)
The Four-Pillar Test Value Framework
Qualitative reasoning framework to evaluate unit test value:
- Protection against Regressions: Catches real defects; a test passing during failure offers zero protection.
- Resistance to Refactoring: Decoupled from internal implementation; zero false alarms on internal refactorings.
- Fast Feedback: Executes in milliseconds; rapid local TDD feedback loop.
- Maintainability: Clean AAA structure, high readability, zero boilerplate duplication. Avoid inventing arbitrary numeric scores (e.g. P * R * F * M) statically without empirical measurement.
Core Rule Anchors
[MOB-TEST-01]Tripartite Naming: Name testsMethod_Scenario_ExpectedBehavior(e.g.submitOrder_whenCreditLimitExceeded_displaysBlockedBanner).[MOB-TEST-02]State & ViewModel Invariant Rule: Assert UI state transitions (e.g.StateFlow/UiStatevia Turbinetest {}); ban asserting 30-property boilerplate state copies.[MOB-TEST-03]Entity Invariant & Serialization Rule: Test calculations, validations, domain invariants, and non-trivial serialization/parsing or error mapping. Ban testing auto-generated code, trivial getters, or echo tests repeating literal assignments.[MOB-TEST-04]Contract Testing Rule: Repositories and data sources must be tested for contract compliance and error mapping. Ban 1:1 pass-through mock echoing (coEvery { dataSource.get() } returns x; repo.get() == x).[MOB-TEST-05]Bug-First Regression Lock: Every PR fixing a bug ticket or with titlefix(...)must introduce a failing test reproducing the defect before fixing it.
Implementation Guidelines
Unit Tests
- Scope & Async: ViewModels, Usecases, Repositories, Utils. Use
runTestwithMainDispatcherRule. Mock with MockK or fakes. - Coverage: Coverage is diagnostic and project-configured; verify risk-weighted critical paths rather than padding code for an arbitrary percentage.
UI Integration Tests (Instrumentation)
- Scope & DI: Composable Screens, Navigation flows. Use
createAndroidComposeRule+ Hilt (HiltAndroidRule). Fake repositories via@TestInstallIn. - Negative Assertions: Add negative assertions only when absence is part of the business contract.
Anti-Patterns & Banned Smells
[MOB-TEST-01]Vague names: Banish non-descriptive test names.[MOB-TEST-02]Brittle state copies: Ban asserting 30-property boilerplate state copies; use focused state assertions or Turbine.[MOB-TEST-03]Echo tests: Ban testing auto-generated code, trivial getters, or repeating literal assignments.[MOB-TEST-04]Pass-through mock echoing: Ban 1:1 pass-through mock echoing and shallow assertions without contract checks.[MOB-TEST-05]Missing bug reproduction: Ban bug fix PRs without reproduction tests.- No Real Network / Thread.sleep: Fake repositories in DI; use IdlingResource or
composeTestRule.waitUntilfor async timing.
References
| 1 | |
| 2 | name android-testing |
| 3 | description Write Android unit, Compose UI, and Hilt-integrated tests. Use when designing test behavior with MockK or coroutine test utilities; defer database/WorkManager-specific recipes to the owning feature skill. |
| 4 | metadata |
| 5 | triggers |
| 6 | files |
| 7 | - '**/*Test.kt' |
| 8 | - '**/*Rule.kt' |
| 9 | keywords |
| 10 | - "@Test" |
| 11 | - runTest |
| 12 | - composeTestRule |
| 13 | - HiltAndroidTest |
| 14 | - MockK |
| 15 | - createAndroidComposeRule |
| 16 | - MainDispatcherRule |
| 17 | - "@TestInstallIn" |
| 18 | |
| 19 | # Android Testing Standards |
| 20 | |
| 21 | ## **Priority: P0 (CRITICAL)** |
| 22 | |
| 23 | ## The Four-Pillar Test Value Framework |
| 24 | |
| 25 | Qualitative reasoning framework to evaluate unit test value: |
| 26 | **Protection against Regressions**: Catches real defects; a test passing during failure offers zero protection. |
| 27 | **Resistance to Refactoring**: Decoupled from internal implementation; zero false alarms on internal refactorings. |
| 28 | **Fast Feedback**: Executes in milliseconds; rapid local TDD feedback loop. |
| 29 | **Maintainability**: Clean AAA structure, high readability, zero boilerplate duplication. |
| 30 | Avoid inventing arbitrary numeric scores (e.g. P * R * F * M) statically without empirical measurement. |
| 31 | |
| 32 | ## Core Rule Anchors |
| 33 | |
| 34 | **`[MOB-TEST-01]` Tripartite Naming**: Name tests `Method_Scenario_ExpectedBehavior` (e.g. `submitOrder_whenCreditLimitExceeded_displaysBlockedBanner`). |
| 35 | **`[MOB-TEST-02]` State & ViewModel Invariant Rule**: Assert UI state transitions (e.g. `StateFlow`/`UiState` via Turbine `test {}`); ban asserting 30-property boilerplate state copies. |
| 36 | **`[MOB-TEST-03]` Entity Invariant & Serialization Rule**: Test calculations, validations, domain invariants, and non-trivial serialization/parsing or error mapping. Ban testing auto-generated code, trivial getters, or echo tests repeating literal assignments. |
| 37 | **`[MOB-TEST-04]` Contract Testing Rule**: Repositories and data sources must be tested for contract compliance and error mapping. Ban 1:1 pass-through mock echoing (`coEvery { dataSource.get() } returns x; repo.get() == x`). |
| 38 | **`[MOB-TEST-05]` Bug-First Regression Lock**: Every PR fixing a bug ticket or with title `fix(...)` must introduce a failing test reproducing the defect before fixing it. |
| 39 | |
| 40 | ## Implementation Guidelines |
| 41 | |
| 42 | ### Unit Tests |
| 43 | **Scope & Async**: ViewModels, Usecases, Repositories, Utils. Use `runTest` with `MainDispatcherRule`. Mock with MockK or fakes. |
| 44 | **Coverage**: Coverage is diagnostic and project-configured; verify risk-weighted critical paths rather than padding code for an arbitrary percentage. |
| 45 | |
| 46 | ### UI Integration Tests (Instrumentation) |
| 47 | **Scope & DI**: Composable Screens, Navigation flows. Use `createAndroidComposeRule` + Hilt (`HiltAndroidRule`). Fake repositories via `@TestInstallIn`. |
| 48 | **Negative Assertions**: Add negative assertions only when absence is part of the business contract. |
| 49 | |
| 50 | ## Anti-Patterns & Banned Smells |
| 51 | |
| 52 | **`[MOB-TEST-01]` Vague names**: Banish non-descriptive test names. |
| 53 | **`[MOB-TEST-02]` Brittle state copies**: Ban asserting 30-property boilerplate state copies; use focused state assertions or Turbine. |
| 54 | **`[MOB-TEST-03]` Echo tests**: Ban testing auto-generated code, trivial getters, or repeating literal assignments. |
| 55 | **`[MOB-TEST-04]` Pass-through mock echoing**: Ban 1:1 pass-through mock echoing and shallow assertions without contract checks. |
| 56 | **`[MOB-TEST-05]` Missing bug reproduction**: Ban bug fix PRs without reproduction tests. |
| 57 | **No Real Network / Thread.sleep**: Fake repositories in DI; use IdlingResource or `composeTestRule.waitUntil` for async timing. |
| 58 | |
| 59 | ## References |
| 60 | |
| 61 | [Test Rules] |
| 62 |
Discussion
Alternatives
Browse more free Claude skills or everything in Development.