Use this skill to apply Android-team testing strategies — determinism, hermetic execution, Given-When-Then / Arrange-Act-Assert structure, naming conventions, and Hilt-based dependency replacement. Encodes which guidance actually lives on /training/testing/fundamentals/strategies (qualitative pyramid, network-access table) versus /training/testing/instrumented-tests/stability (determinism / flake) versus /training/dependency-injection/hilt-testing (@HiltAndroidTest, HiltAndroidRule, @TestInstallIn, @UninstallModules, @BindValue, rule ordering). Use when the user asks "how should I structure tests", "Given When Then or Arrange Act Assert", "how do I name test methods", "Hilt rule order", "@HiltAndroidTest", "@BindValue", "how to swap a binding for tests", "tests pass locally fail on CI", or "make tests deterministic".
EnglishUse this skill to verify Compose layout measurements from a UI test using assertWidthIsEqualTo, assertHeightIsEqualTo, assertWidthIsAtLeast, assertHeightIsAtLeast, assertTouchWidthIsEqualTo, assertTouchHeightIsEqualTo, assertPositionInRootIsEqualTo, assertTopPositionInRootIsEqualTo, assertLeftPositionInRootIsEqualTo, plus read helpers getUnclippedBoundsInRoot, getBoundsInRoot, getAlignmentLinePosition, getFirstLinkBounds, and the underlying Dp.assertIsEqualTo(expected, subject, tolerance = Dp(.5f)). Covers the half-dp default tolerance, the unclipped vs clipped distinction, the canonical "compute padding from two unclipped rects" pattern, and minimum-touch-target assertions like assertHeightIsAtLeast(MinHeight + 1.dp). Use when the developer wants to assert sizes, padding, alignment, position in dp, or asks about getUnclippedBoundsInRoot, DpRect, touch-target size, or compares widths in pixels. If the developer is comparing layout dimensions from a test, use this skill.
EnglishUse this skill to verify a Compose semantics node's properties from a UI test using assertExists, assertDoesNotExist, assertIsDisplayed, assertIsNotDisplayed, assertIsDeactivated, assertIsEnabled, assertIsOn, assertIsOff, assertIsSelected, assertIsFocused, assertTextEquals, assertTextContains, assertContentDescriptionEquals, assertValueEquals, assertRangeInfoEquals, assertHasClickAction, plus the generic assert(matcher) escape hatch and the boolean isDisplayed() / isNotDisplayed() for waitUntil predicates. Covers collection variants assertCountEquals, assertAny, assertAll. Use when the developer wants to verify a Switch is on, a Button is enabled, a Text shows the expected string, a node is displayed vs merely composed, or asks about assertIsDisplayed vs assertExists. If the developer mentions any assert API on SemanticsNodeInteraction, use this skill.
EnglishUse this skill to perform an end-to-end review of an existing Jetpack Compose UI test file or test suite. Sequences six audit phases (setup correctness, finder discipline, assertion strength, action correctness, time/idle correctness, debug output) and routes each finding to the precise sibling skill that fixes it. Produces a prioritized issue list — does NOT mutate code. Use when the user asks "review my Compose tests", "audit this test class", "is this test flaky", "why is this test slow on CI", "which Compose tests should I rewrite", or pastes a Test.kt file and asks for feedback.
EnglishUse this skill to render every Jetpack Compose @Preview as a screenshot on a real Android device or emulator and publish a browsable HTML catalog from CI. Covers the Compose HotSwan Gradle compiler plugin (com.github.skydoves.compose.hotswan.compiler) and debugImplementation("com.github.skydoves.compose.hotswan:preview"), the captureAllPreviews task, capturing one preview over ADB via HotSwanPreviewActivity + screencap, the hotSwanCompiler { preview { renderDelayMs; demoMode; sdkModeEnabled } } DSL, per-preview @PreviewScreenshot(renderDelay = ...), running it on an emulator in GitHub Actions (reactivecircus/android-emulator-runner or Gradle Managed Devices) and deploying the catalog to GitHub Pages, and how device rendering differs from host-JVM tools (Paparazzi, Roborazzi). Use when the user mentions "captureAllPreviews", "HotSwan", "preview screenshots in CI", "screenshot catalog", "preview catalog on GitHub Pages", or "Paparazzi vs Roborazzi vs device screenshots".
EnglishUse this skill to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos. Covers adb shell screencap -p (PNG screenshot), adb exec-out screencap -p > out.png (binary-clean stream that avoids CRLF translation on Windows), adb shell screenrecord with --size, --bit-rate, --time-limit, --rotate, --bugreport, --verbose flags, the 3-minute hard cap, scoped-storage rules for /sdcard/ on API 30+, and the JUnit4 TestWatcher capture-on-failure pattern that grabs a screencap plus logcat -d on failure. If the user mentions "screenshot device", "screencap PNG", "raw RGBA dump", "screenrecord 3 minute limit", "scrcpy / Vysor streaming", "exec-out vs shell", or "bugreport overlay timestamp", use this skill.
EnglishUse this skill to pick the correct Compose UI test entry point. Compares createComposeRule(), createAndroidComposeRule (), createEmptyComposeRule(), runComposeUiTest { }, and runAndroidComposeUiTest { }, plus the v1 vs v2 split (UnconfinedTestDispatcher vs StandardTestDispatcher). Encodes the rule that mixing runComposeUiTest { } and a ComposeTestRule in the same test is forbidden, that setContent may only run once, and that createEmptyComposeRule() returns ComposeTestRule (no setContent). Use when the user asks "ComposeTestRule vs ComposeUiTest", reports IllegalStateException: setContent can only be called once, mentions runComposeUiTest, the v2 deprecation warning, effectContext, custom ComponentActivity, or "host tests need a coroutine scope".
EnglishUse this skill to pick which behaviors to cover in an Android test suite using Google's five-category state vocabulary plus the explicit "what NOT to test" list from /training/testing/fundamentals/what-to-test. Covers state on screen, state held in memory (ViewModels), persisted state (DB / DataStore / files), other state (system bars / system services), and errors / edge cases. Includes Google's verbatim "Tests to Avoid" list (framework entry points such as activities / fragments / services should not have business logic) and an edge-case mining checklist. Use when the user asks "what should I write tests for", "should I unit-test this Activity", "do I need a test for this util class", "what edge cases am I missing", or "should I test the ViewModel or the Composable".
EnglishUse this skill to drive Jetpack Compose UI from tests with the high-level action APIs that do not go through a gesture builder — performClick, performScrollTo, performScrollToIndex, performScrollToKey, performScrollToNode, requestFocus, performSemanticsAction, and performFirstLinkClick. Covers picking the correct receiver node (the scrollable container vs an item), the matchers used to find a scroll parent (hasScrollAction, hasScrollToIndexAction, hasScrollToKeyAction, hasScrollToNodeAction), and how the lazy vs non-lazy scrollable cases differ. Use when the developer asks "how do I tap a Compose node", "scroll to an item in a LazyColumn", "click a link inside Text", "trigger a custom semantics action", or reports "Action performScrollTo failed" / "node has no parent layout with a Scroll SemanticsAction" / "ScrollToIndex not defined".
EnglishUse this skill to build precise Compose UI test queries by composing SemanticsMatcher predicates with infix and, infix or, and operator not, plus the prebuilt filter library (hasText, hasClickAction, isEnabled, isOn, hasTestTag, hasContentDescription, hasParent, hasAnyAncestor, hasAnyChild, hasAnySibling, hasAnyDescendant, hasImeAction, hasScrollToKeyAction, hasScrollToNodeAction, isDialog, isPopup, isRoot, isFocused, isEditable, isHeading). Covers SemanticsMatcher.expectValue / keyIsDefined / keyNotDefined for custom semantics keys. Use when the developer asks how to find "an enabled button with text Submit", how to combine matchers, how to filter by a custom SemanticsPropertyKey, how to write a hierarchical predicate, or mentions hasParent, hasAnyAncestor, expectValue. If the developer wants one matcher instead of three chained assertions, use this skill.
EnglishUse this skill to stand up a JUnit4-based JVM unit-test suite on an Android module. Covers the canonical Gradle dependency matrix (junit:junit:4.13.2, androidx.test:core:1.7.0, androidx.test.ext:junit:1.3.0, androidx.test.ext:truth:1.7.0), the @RunWith(AndroidJUnit4::class) runner, InstrumentationRegistry.getInstrumentation(), ApplicationProvider.getApplicationContext(), the @SmallTest / @MediumTest / @LargeTest size annotations wired into am instrument -e size, the androidx-test Truth subjects, and the canonical MainDispatcherRule setup pattern. Use when the user mentions AndroidJUnit4 unresolved, which AndroidJUnit4, InstrumentationRegistry deprecated, getApplicationContext in unit test, Truth IntentSubject, @SmallTest, MainDispatcherRule, or asks how to wire JUnit4 into an Android module's src/test/.
EnglishUse this skill to wire the correct Gradle dependency matrix for Jetpack Compose UI tests. Covers androidTestImplementation("androidx.compose.ui:ui-test-junit4"), the debugImplementation("androidx.compose.ui:ui-test-manifest") requirement that makes createComposeRule() work, the host-test (Robolectric) trio, the accessibility add-ons (ui-test-accessibility, ui-test-junit4-accessibility), and the TestManifestGradleConfiguration lint warning. Use when the user reports ActivityNotFoundException: ComponentActivity, createComposeRule unresolved, lint warning ui-test-manifest, Cannot find test rule, or asks "what dependencies do I need for Compose UI tests" / "why won't my Compose test compile".
EnglishUse this skill to connect ADB to an Android 11+ device wirelessly with the modern adb pair flow (pairing code or QR via Settings → Developer options → Wireless debugging), then adb connect and adb disconnect, plus mDNS auto-discovery via adb mdns check / adb mdns services and the adb-tls-pairing.tcp / adb-tls-connect.tcp service types. Covers the ADB v34+ default mDNS backend (Openscreen on Linux/Windows, not Bonjour as the public doc says), the legacy adb tcpip + adb connect path that pre-dates pairing, security caveats (corporate Wi-Fi blocks p2p; flat LAN exposure), version requirements (Android 11/API 30 for phones, Android 13/API 33 for TV+Wear), and the ADBMDNSOPENSCREEN / ADBMDNSAUTOCONNECT environment variables. Use when the user mentions adb pair, adb connect, "wireless debugging", "QR code pairing", adb-tls-connect, "Openscreen vs Bonjour", adb tcpip 5555, or "device not connecting after pairing successfully".
EnglishUse this skill to attach a USB device or emulator to ADB, list transports with adb devices / adb devices -l, disambiguate among multiple devices using -s SERIAL, -d (single USB), -e (single TCP/IP), or -t TRANSPORTID, gate scripts on a transport with the canonical adb wait-for[-TRANSPORT]- syntax (TRANSPORT in {usb, local, any}; state in {device, recovery, rescue, sideload, bootloader, disconnect}), interpret device states (device, offline, unauthorized, no permissions, recovery, sideload, bootloader, rescue), accept the RSA fingerprint dialog on first connect, and install Linux udev rules. Use when the user mentions error: more than one device/emulator, error: device not found, unauthorized, no permissions, daemon not running, "wait for device to boot", wait-for-device-online (which is not a real subcommand), or asks how to script around emulator startup.
EnglishUse this skill to drive the Compose test clock by hand with MainTestClock — currentTime, autoAdvance, advanceTimeByFrame, advanceTimeBy(milliseconds, ignoreFrameDuration), and advanceTimeUntil. Explains the 16 ms frame delay used by TestMonotonicFrameClock, the per-frame ordering where withFrameNanos awaiters resume before recomposition, and how the recomposer and MainTestClock share one TestCoroutineScheduler. Covers v1 versus v2 entry-point dispatcher differences (UnconfinedTestDispatcher vs StandardTestDispatcher) and when an explicit runCurrent or advanceTimeBy(0) is required after migration. If the user mentions MainTestClock, mainClock.advanceTimeBy, mainClock.advanceTimeByFrame, mainClock.advanceTimeUntil, ComposeTimeoutException, frame delay, TestCoroutineScheduler, "test clock vs wall clock", or "v2 createComposeRule queues tasks", use this skill.
EnglishUse this skill to drive cross-app and system-UI flows from instrumentation tests using UiAutomator 2.3.0 — UiDevice, BySelector / UiObject2 (modern), UiSelector / UiObject (legacy), Until conditions, and Configurator global timeouts. Covers the singleton acquisition (UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())), pressBack/pressHome/pressRecentApps, device.findObject(By...) cached-node refresh and StaleObjectException recovery, the executeShellCommand @Discouraged path vs Context.startActivity plus , and the full By factory catalog. Use when the user reports StaleObjectException, Espresso InjectEventSecurityException, findObject returns null, asks "how do I open Settings from a test", "toggle Wi-Fi", "dismiss notification shade", or "test that spans my app and another".
EnglishUse this skill to make @Preview functions the primary feedback loop for Jetpack Compose UI work — preview-driven development. Covers hoisting state out of composables so a preview never needs a ViewModel or DI graph, LocalInspectionMode for conditional preview rendering (e.g. placeholder instead of Coil/Glide), @PreviewParameter + PreviewParameterProvider for rendering every UI state side by side, multi-configuration previews (uiMode, fontScale, device, widthDp, locale), @Preview-annotated annotation classes for reusable preview sets, and the anti-patterns that make previews rot (screen-level previews, unwrapped theme, zero-width fillMaxWidth previews, Lorem-ipsum data). Use when the user mentions "preview won't render", "preview needs a ViewModel", "@PreviewParameter", "LocalInspectionMode", "preview out of date", "preview-driven development", "previews keep breaking", or "how to structure Compose previews".
EnglishUse this skill to enable Espresso's AccessibilityValidator against the Compose semantics tree via enableAccessibilityChecks(...) from androidx.compose.ui:ui-test-accessibility (for ComposeUiTest) or androidx.compose.ui:ui-test-junit4-accessibility (for ComposeTestRule / AndroidComposeTestRule). Covers the API surface, the auto-check after every UI-mutating action (performMultiModalInput is the lone exception), the manual tryPerformAccessibilityChecks() entry point, sharing the validator with Espresso via AccessibilityChecks.enable(), the API 34+ requirement, and the Robolectric inconclusive behavior (logs a Log.w warning and still installs the validator, but Robolectric does not faithfully drive accessibility services — b/332778271). Use when the developer asks "how do I enable a11y checks in a Compose test", "AccessibilityChecks.enable", "AccessibilityValidator throws on click", "robolectric a11y not supported", or "ComposeTestRule IllegalStateException".
EnglishUse this skill to drive Jetpack Compose text fields from tests with the text-specific actions — performTextInput (insert at cursor via the InsertTextAtCursor semantics action), performTextReplacement (clear + replace via SetText), performTextClearance (replace with empty string), performTextInputSelection (set TextRange selection), and performImeAction (fire the configured IME action such as Next, Done, Search). Covers the auto-focus path, the enabled / editable / focusable preconditions, the append vs replace gotcha that produces "helloworld" instead of "world", and the IME-action focus chain (Next advances focus to the next focusable). Use when the developer asks "how do I type into a TextField in a test", "test an IME Next button", "test a clear-text action", "BasicTextField won't accept input", "text input duplicated in test", or reports "Failed to perform text input" / "Failed to perform IME action" / "Default ImeAction" errors.
EnglishUse this skill to read device logs for test failures, debug, smoke testing, and CI repros. Covers adb logcat (stream), adb logcat -d (dump and exit), adb logcat -c (clear), buffer selection (-b main|system|crash|events|radio|kernel|all), priority ladder (V/D/I/W/E/F/S), filter expressions like MyApp:D :S, format flags (-v threadtime, -v json on Android 11+), --pid $(adb shell pidof -s pkg), time/count filters (-T '01-01 12:00:00.000', -t 100), buffer rotation (-r , -n , -f ), buffer sizing (-G, -g), and stripping Log.d calls in release builds via R8 -assumenosideeffects. If the user mentions "logcat filter only my app", "events buffer amprocstart", "logcat json format", "grep logcat expensive", "missing logs after restart", "stripping Log.d release", or "logcat -f writes to host or device", use this skill.
EnglishUse this skill to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags. Covers the path-permission rules — /data/local/tmp/ is freely writable, /sdcard/ (alias /storage/emulated/0/) is shell-writable with scoped-storage rules on API 30+, /data/data/ / requires run-as on debuggable builds, and /sdcard/Android/data/ /files/ is package-owned but pullable. Includes adb shell run-as cat for text grabs, adb exec-out run-as tar cf - | tar xf - for binary-clean directory grabs, the connectedandroidtestadditionaloutput/ Gradle output dir, and the androidx.test:services useTestStorageService flag for the modern artefact-collection API. If the user mentions "adb pull permission denied data data", "run-as", "scoped storage shell", "tar through adb", "test storage service", or "exec-out vs shell for binary", use this skill.
EnglishUse this skill to locate Compose semantics nodes from a UI test using onNodeWithTag, onNodeWithText, onNodeWithContentDescription, onAllNodes, and onRoot. Covers the count contract (single-node finders fail on 0 or >1 matches; collection finders never throw on 0), the merged-vs-unmerged tree distinction, and why tagging in production beats text-matching from tests. Use when the developer reports "no node matched", "multiple nodes matched", "tag not found", "useUnmergedTree", "Modifier.testTag", or asks how to find a Button/Text/Icon in a Compose test. If the developer mentions onNodeWithText, onNodeWithTag, onNodeWithContentDescription, onAllNodesWithTag, onRoot, or merged tree vs unmerged tree, use this skill.
EnglishUse this skill to drive an Android device from the host shell — inject taps, swipes, text, key events, and drag-and-drop via adb shell input; resize the display with wm size / wm density; flip hermetic-test settings with settings put global windowanimationscale 0; reset app state with pm clear vs am force-stop; launch Activities with am start -n pkg/.Activity; and use the modern cmd wrapper (cmd wifi, cmd connectivity, cmd uimode night, cmd locale set-app-locales) instead of the deprecated svc aliases on API 30+. If the user mentions "input tap", "input swipe", "input text spaces", "KEYCODEBACK", "wm size for screen-size matrix", "settings put animationscale", "force-stop vs pm clear", "svc wifi no-op", "cmd wifi set-wifi-enabled", or "am start intent extras", use this skill.
EnglishUse this skill to drive Jetpack Compose UI from tests with non-touch input — performMouseInput (click, rightClick, doubleClick, tripleClick, longClick, animateMoveTo, dragAndDrop, smoothScroll, enter / exit, press / release / scroll), performKeyInput (keyDown, keyUp, isKeyDown, modifier-state vals isCtrlDown / isShiftDown / isAltDown / isMetaDown / isFnDown / isCapsLockOn / isNumLockOn / isScrollLockOn, helpers pressKey, withKeyDown, withKeysDown, withKeyToggled, withKeysToggled), performKeyPress for direct KeyEvent injection, and performMultiModalInput for hover-then-click flows. Covers MouseButton (Primary, Secondary, Tertiary), ScrollWheel (Horizontal, Vertical), and the repeat-key behaviour driven by advanceEventTime. Use when the developer asks "how do I right-click in a Compose test", "test a Ctrl+S shortcut", "send a keyboard shortcut", "simulate hover", "test a tooltip", "scroll the mouse wheel", or "drag and drop with a mouse" on desktop or Compose Multiplatform.
EnglishIncludes Applying Testing Strategies, Asserting Bounds and Dimensions, Asserting Node State and Text, and other workflows.
Supported by the Atlas install prompt. Skill-specific requirements vary.
Pack stats
What’s included
Applying Testing Strategies
Use this skill to apply Android-team testing strategies — determinism, hermetic execution, Given-When-Then / Arrange-Act-Assert structure, naming conventions, and Hilt-based dependency replacement. Encodes which guidance actually lives on /training/testing/fundamentals/strategies (qualitative pyramid, network-access table) versus /training/testing/instrumented-tests/stability (determinism / flake) versus /training/dependency-injection/hilt-testing (@HiltAndroidTest, HiltAndroidRule, @TestInstallIn, @UninstallModules, @BindValue, rule ordering). Use when the user asks "how should I structure tests", "Given When Then or Arrange Act Assert", "how do I name test methods", "Hilt rule order", "@HiltAndroidTest", "@BindValue", "how to swap a binding for tests", "tests pass locally fail on CI", or "make tests deterministic".
Asserting Bounds and Dimensions
Use this skill to verify Compose layout measurements from a UI test using assertWidthIsEqualTo, assertHeightIsEqualTo, assertWidthIsAtLeast, assertHeightIsAtLeast, assertTouchWidthIsEqualTo, assertTouchHeightIsEqualTo, assertPositionInRootIsEqualTo, assertTopPositionInRootIsEqualTo, assertLeftPositionInRootIsEqualTo, plus read helpers getUnclippedBoundsInRoot, getBoundsInRoot, getAlignmentLinePosition, getFirstLinkBounds, and the underlying Dp.assertIsEqualTo(expected, subject, tolerance = Dp(.5f)). Covers the half-dp default tolerance, the unclipped vs clipped distinction, the canonical "compute padding from two unclipped rects" pattern, and minimum-touch-target assertions like assertHeightIsAtLeast(MinHeight + 1.dp). Use when the developer wants to assert sizes, padding, alignment, position in dp, or asks about getUnclippedBoundsInRoot, DpRect, touch-target size, or compares widths in pixels. If the developer is comparing layout dimensions from a test, use this skill.
Asserting Node State and Text
Use this skill to verify a Compose semantics node's properties from a UI test using assertExists, assertDoesNotExist, assertIsDisplayed, assertIsNotDisplayed, assertIsDeactivated, assertIsEnabled, assertIsOn, assertIsOff, assertIsSelected, assertIsFocused, assertTextEquals, assertTextContains, assertContentDescriptionEquals, assertValueEquals, assertRangeInfoEquals, assertHasClickAction, plus the generic assert(matcher) escape hatch and the boolean isDisplayed() / isNotDisplayed() for waitUntil predicates. Covers collection variants assertCountEquals, assertAny, assertAll. Use when the developer wants to verify a Switch is on, a Button is enabled, a Text shows the expected string, a node is displayed vs merely composed, or asks about assertIsDisplayed vs assertExists. If the developer mentions any assert API on SemanticsNodeInteraction, use this skill.
Auditing Compose Test Suite
Use this skill to perform an end-to-end review of an existing Jetpack Compose UI test file or test suite. Sequences six audit phases (setup correctness, finder discipline, assertion strength, action correctness, time/idle correctness, debug output) and routes each finding to the precise sibling skill that fixes it. Produces a prioritized issue list — does NOT mutate code. Use when the user asks "review my Compose tests", "audit this test class", "is this test flaky", "why is this test slow on CI", "which Compose tests should I rewrite", or pastes a Test.kt file and asks for feedback.
Capturing Preview Screenshots in CI
Use this skill to render every Jetpack Compose @Preview as a screenshot on a real Android device or emulator and publish a browsable HTML catalog from CI. Covers the Compose HotSwan Gradle compiler plugin (com.github.skydoves.compose.hotswan.compiler) and debugImplementation("com.github.skydoves.compose.hotswan:preview"), the captureAllPreviews task, capturing one preview over ADB via HotSwanPreviewActivity + screencap, the hotSwanCompiler { preview { renderDelayMs; demoMode; sdkModeEnabled } } DSL, per-preview @PreviewScreenshot(renderDelay = ...), running it on an emulator in GitHub Actions (reactivecircus/android-emulator-runner or Gradle Managed Devices) and deploying the catalog to GitHub Pages, and how device rendering differs from host-JVM tools (Paparazzi, Roborazzi). Use when the user mentions "captureAllPreviews", "HotSwan", "preview screenshots in CI", "screenshot catalog", "preview catalog on GitHub Pages", or "Paparazzi vs Roborazzi vs device screenshots".
Capturing Screenshots and Screenrecord
Use this skill to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos. Covers adb shell screencap -p (PNG screenshot), adb exec-out screencap -p > out.png (binary-clean stream that avoids CRLF translation on Windows), adb shell screenrecord with --size, --bit-rate, --time-limit, --rotate, --bugreport, --verbose flags, the 3-minute hard cap, scoped-storage rules for /sdcard/ on API 30+, and the JUnit4 TestWatcher capture-on-failure pattern that grabs a screencap plus logcat -d on failure. If the user mentions "screenshot device", "screencap PNG", "raw RGBA dump", "screenrecord 3 minute limit", "scrcpy / Vysor streaming", "exec-out vs shell", or "bugreport overlay timestamp", use this skill.
Choosing Test Rule Vs Runtest
Use this skill to pick the correct Compose UI test entry point. Compares createComposeRule(), createAndroidComposeRule (), createEmptyComposeRule(), runComposeUiTest { }, and runAndroidComposeUiTest { }, plus the v1 vs v2 split (UnconfinedTestDispatcher vs StandardTestDispatcher). Encodes the rule that mixing runComposeUiTest { } and a ComposeTestRule in the same test is forbidden, that setContent may only run once, and that createEmptyComposeRule() returns ComposeTestRule (no setContent). Use when the user asks "ComposeTestRule vs ComposeUiTest", reports IllegalStateException: setContent can only be called once, mentions runComposeUiTest, the v2 deprecation warning, effectContext, custom ComponentActivity, or "host tests need a coroutine scope".
Choosing What to Test
Use this skill to pick which behaviors to cover in an Android test suite using Google's five-category state vocabulary plus the explicit "what NOT to test" list from /training/testing/fundamentals/what-to-test. Covers state on screen, state held in memory (ViewModels), persisted state (DB / DataStore / files), other state (system bars / system services), and errors / edge cases. Includes Google's verbatim "Tests to Avoid" list (framework entry points such as activities / fragments / services should not have business logic) and an edge-case mining checklist. Use when the user asks "what should I write tests for", "should I unit-test this Activity", "do I need a test for this util class", "what edge cases am I missing", or "should I test the ViewModel or the Composable".
Clicking and Scrolling
Use this skill to drive Jetpack Compose UI from tests with the high-level action APIs that do not go through a gesture builder — performClick, performScrollTo, performScrollToIndex, performScrollToKey, performScrollToNode, requestFocus, performSemanticsAction, and performFirstLinkClick. Covers picking the correct receiver node (the scrollable container vs an item), the matchers used to find a scroll parent (hasScrollAction, hasScrollToIndexAction, hasScrollToKeyAction, hasScrollToNodeAction), and how the lazy vs non-lazy scrollable cases differ. Use when the developer asks "how do I tap a Compose node", "scroll to an item in a LazyColumn", "click a link inside Text", "trigger a custom semantics action", or reports "Action performScrollTo failed" / "node has no parent layout with a Scroll SemanticsAction" / "ScrollToIndex not defined".
Composing Semantics Matchers
Use this skill to build precise Compose UI test queries by composing SemanticsMatcher predicates with infix and, infix or, and operator not, plus the prebuilt filter library (hasText, hasClickAction, isEnabled, isOn, hasTestTag, hasContentDescription, hasParent, hasAnyAncestor, hasAnyChild, hasAnySibling, hasAnyDescendant, hasImeAction, hasScrollToKeyAction, hasScrollToNodeAction, isDialog, isPopup, isRoot, isFocused, isEditable, isHeading). Covers SemanticsMatcher.expectValue / keyIsDefined / keyNotDefined for custom semantics keys. Use when the developer asks how to find "an enabled button with text Submit", how to combine matchers, how to filter by a custom SemanticsPropertyKey, how to write a hierarchical predicate, or mentions hasParent, hasAnyAncestor, expectValue. If the developer wants one matcher instead of three chained assertions, use this skill.
Configuring Junit4 on Android
Use this skill to stand up a JUnit4-based JVM unit-test suite on an Android module. Covers the canonical Gradle dependency matrix (junit:junit:4.13.2, androidx.test:core:1.7.0, androidx.test.ext:junit:1.3.0, androidx.test.ext:truth:1.7.0), the @RunWith(AndroidJUnit4::class) runner, InstrumentationRegistry.getInstrumentation(), ApplicationProvider.getApplicationContext(), the @SmallTest / @MediumTest / @LargeTest size annotations wired into am instrument -e size, the androidx-test Truth subjects, and the canonical MainDispatcherRule setup pattern. Use when the user mentions AndroidJUnit4 unresolved, which AndroidJUnit4, InstrumentationRegistry deprecated, getApplicationContext in unit test, Truth IntentSubject, @SmallTest, MainDispatcherRule, or asks how to wire JUnit4 into an Android module's src/test/.
Configuring Test Dependencies
Use this skill to wire the correct Gradle dependency matrix for Jetpack Compose UI tests. Covers androidTestImplementation("androidx.compose.ui:ui-test-junit4"), the debugImplementation("androidx.compose.ui:ui-test-manifest") requirement that makes createComposeRule() work, the host-test (Robolectric) trio, the accessibility add-ons (ui-test-accessibility, ui-test-junit4-accessibility), and the TestManifestGradleConfiguration lint warning. Use when the user reports ActivityNotFoundException: ComponentActivity, createComposeRule unresolved, lint warning ui-test-manifest, Cannot find test rule, or asks "what dependencies do I need for Compose UI tests" / "why won't my Compose test compile".
Connecting Over Wifi
Use this skill to connect ADB to an Android 11+ device wirelessly with the modern adb pair flow (pairing code or QR via Settings → Developer options → Wireless debugging), then adb connect and adb disconnect, plus mDNS auto-discovery via adb mdns check / adb mdns services and the adb-tls-pairing.tcp / adb-tls-connect.tcp service types. Covers the ADB v34+ default mDNS backend (Openscreen on Linux/Windows, not Bonjour as the public doc says), the legacy adb tcpip + adb connect path that pre-dates pairing, security caveats (corporate Wi-Fi blocks p2p; flat LAN exposure), version requirements (Android 11/API 30 for phones, Android 13/API 33 for TV+Wear), and the ADBMDNSOPENSCREEN / ADBMDNSAUTOCONNECT environment variables. Use when the user mentions adb pair, adb connect, "wireless debugging", "QR code pairing", adb-tls-connect, "Openscreen vs Bonjour", adb tcpip 5555, or "device not connecting after pairing successfully".
Connecting to Devices
Use this skill to attach a USB device or emulator to ADB, list transports with adb devices / adb devices -l, disambiguate among multiple devices using -s SERIAL, -d (single USB), -e (single TCP/IP), or -t TRANSPORTID, gate scripts on a transport with the canonical adb wait-for[-TRANSPORT]- syntax (TRANSPORT in {usb, local, any}; state in {device, recovery, rescue, sideload, bootloader, disconnect}), interpret device states (device, offline, unauthorized, no permissions, recovery, sideload, bootloader, rescue), accept the RSA fingerprint dialog on first connect, and install Linux udev rules. Use when the user mentions error: more than one device/emulator, error: device not found, unauthorized, no permissions, daemon not running, "wait for device to boot", wait-for-device-online (which is not a real subcommand), or asks how to script around emulator startup.
Controlling the Test Clock
Use this skill to drive the Compose test clock by hand with MainTestClock — currentTime, autoAdvance, advanceTimeByFrame, advanceTimeBy(milliseconds, ignoreFrameDuration), and advanceTimeUntil. Explains the 16 ms frame delay used by TestMonotonicFrameClock, the per-frame ordering where withFrameNanos awaiters resume before recomposition, and how the recomposer and MainTestClock share one TestCoroutineScheduler. Covers v1 versus v2 entry-point dispatcher differences (UnconfinedTestDispatcher vs StandardTestDispatcher) and when an explicit runCurrent or advanceTimeBy(0) is required after migration. If the user mentions MainTestClock, mainClock.advanceTimeBy, mainClock.advanceTimeByFrame, mainClock.advanceTimeUntil, ComposeTimeoutException, frame delay, TestCoroutineScheduler, "test clock vs wall clock", or "v2 createComposeRule queues tasks", use this skill.
Cross App Tests with Uiautomator
Use this skill to drive cross-app and system-UI flows from instrumentation tests using UiAutomator 2.3.0 — UiDevice, BySelector / UiObject2 (modern), UiSelector / UiObject (legacy), Until conditions, and Configurator global timeouts. Covers the singleton acquisition (UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())), pressBack/pressHome/pressRecentApps, device.findObject(By...) cached-node refresh and StaleObjectException recovery, the executeShellCommand @Discouraged path vs Context.startActivity plus , and the full By factory catalog. Use when the user reports StaleObjectException, Espresso InjectEventSecurityException, findObject returns null, asks "how do I open Settings from a test", "toggle Wi-Fi", "dismiss notification shade", or "test that spans my app and another".
Developing with Compose Previews
Use this skill to make @Preview functions the primary feedback loop for Jetpack Compose UI work — preview-driven development. Covers hoisting state out of composables so a preview never needs a ViewModel or DI graph, LocalInspectionMode for conditional preview rendering (e.g. placeholder instead of Coil/Glide), @PreviewParameter + PreviewParameterProvider for rendering every UI state side by side, multi-configuration previews (uiMode, fontScale, device, widthDp, locale), @Preview-annotated annotation classes for reusable preview sets, and the anti-patterns that make previews rot (screen-level previews, unwrapped theme, zero-width fillMaxWidth previews, Lorem-ipsum data). Use when the user mentions "preview won't render", "preview needs a ViewModel", "@PreviewParameter", "LocalInspectionMode", "preview out of date", "preview-driven development", "previews keep breaking", or "how to structure Compose previews".
Enabling Accessibility Checks
Use this skill to enable Espresso's AccessibilityValidator against the Compose semantics tree via enableAccessibilityChecks(...) from androidx.compose.ui:ui-test-accessibility (for ComposeUiTest) or androidx.compose.ui:ui-test-junit4-accessibility (for ComposeTestRule / AndroidComposeTestRule). Covers the API surface, the auto-check after every UI-mutating action (performMultiModalInput is the lone exception), the manual tryPerformAccessibilityChecks() entry point, sharing the validator with Espresso via AccessibilityChecks.enable(), the API 34+ requirement, and the Robolectric inconclusive behavior (logs a Log.w warning and still installs the validator, but Robolectric does not faithfully drive accessibility services — b/332778271). Use when the developer asks "how do I enable a11y checks in a Compose test", "AccessibilityChecks.enable", "AccessibilityValidator throws on click", "robolectric a11y not supported", or "ComposeTestRule IllegalStateException".
Entering Text
Use this skill to drive Jetpack Compose text fields from tests with the text-specific actions — performTextInput (insert at cursor via the InsertTextAtCursor semantics action), performTextReplacement (clear + replace via SetText), performTextClearance (replace with empty string), performTextInputSelection (set TextRange selection), and performImeAction (fire the configured IME action such as Next, Done, Search). Covers the auto-focus path, the enabled / editable / focusable preconditions, the append vs replace gotcha that produces "helloworld" instead of "world", and the IME-action focus chain (Next advances focus to the next focusable). Use when the developer asks "how do I type into a TextField in a test", "test an IME Next button", "test a clear-text action", "BasicTextField won't accept input", "text input duplicated in test", or reports "Failed to perform text input" / "Failed to perform IME action" / "Default ImeAction" errors.
Extracting Logs with Logcat
Use this skill to read device logs for test failures, debug, smoke testing, and CI repros. Covers adb logcat (stream), adb logcat -d (dump and exit), adb logcat -c (clear), buffer selection (-b main|system|crash|events|radio|kernel|all), priority ladder (V/D/I/W/E/F/S), filter expressions like MyApp:D :S, format flags (-v threadtime, -v json on Android 11+), --pid $(adb shell pidof -s pkg), time/count filters (-T '01-01 12:00:00.000', -t 100), buffer rotation (-r , -n , -f ), buffer sizing (-G, -g), and stripping Log.d calls in release builds via R8 -assumenosideeffects. If the user mentions "logcat filter only my app", "events buffer amprocstart", "logcat json format", "grep logcat expensive", "missing logs after restart", "stripping Log.d release", or "logcat -f writes to host or device", use this skill.
Extracting Test Artifacts
Use this skill to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags. Covers the path-permission rules — /data/local/tmp/ is freely writable, /sdcard/ (alias /storage/emulated/0/) is shell-writable with scoped-storage rules on API 30+, /data/data/ / requires run-as on debuggable builds, and /sdcard/Android/data/ /files/ is package-owned but pullable. Includes adb shell run-as cat for text grabs, adb exec-out run-as tar cf - | tar xf - for binary-clean directory grabs, the connectedandroidtestadditionaloutput/ Gradle output dir, and the androidx.test:services useTestStorageService flag for the modern artefact-collection API. If the user mentions "adb pull permission denied data data", "run-as", "scoped storage shell", "tar through adb", "test storage service", or "exec-out vs shell for binary", use this skill.
Finding Nodes by Tag Text Content
Use this skill to locate Compose semantics nodes from a UI test using onNodeWithTag, onNodeWithText, onNodeWithContentDescription, onAllNodes, and onRoot. Covers the count contract (single-node finders fail on 0 or >1 matches; collection finders never throw on 0), the merged-vs-unmerged tree distinction, and why tagging in production beats text-matching from tests. Use when the developer reports "no node matched", "multiple nodes matched", "tag not found", "useUnmergedTree", "Modifier.testTag", or asks how to find a Button/Text/Icon in a Compose test. If the developer mentions onNodeWithText, onNodeWithTag, onNodeWithContentDescription, onAllNodesWithTag, onRoot, or merged tree vs unmerged tree, use this skill.
Injecting Input and State
Use this skill to drive an Android device from the host shell — inject taps, swipes, text, key events, and drag-and-drop via adb shell input; resize the display with wm size / wm density; flip hermetic-test settings with settings put global windowanimationscale 0; reset app state with pm clear vs am force-stop; launch Activities with am start -n pkg/.Activity; and use the modern cmd wrapper (cmd wifi, cmd connectivity, cmd uimode night, cmd locale set-app-locales) instead of the deprecated svc aliases on API 30+. If the user mentions "input tap", "input swipe", "input text spaces", "KEYCODEBACK", "wm size for screen-size matrix", "settings put animationscale", "force-stop vs pm clear", "svc wifi no-op", "cmd wifi set-wifi-enabled", or "am start intent extras", use this skill.
Injecting Mouse and Keyboard
Use this skill to drive Jetpack Compose UI from tests with non-touch input — performMouseInput (click, rightClick, doubleClick, tripleClick, longClick, animateMoveTo, dragAndDrop, smoothScroll, enter / exit, press / release / scroll), performKeyInput (keyDown, keyUp, isKeyDown, modifier-state vals isCtrlDown / isShiftDown / isAltDown / isMetaDown / isFnDown / isCapsLockOn / isNumLockOn / isScrollLockOn, helpers pressKey, withKeyDown, withKeysDown, withKeyToggled, withKeysToggled), performKeyPress for direct KeyEvent injection, and performMultiModalInput for hover-then-click flows. Covers MouseButton (Primary, Secondary, Tertiary), ScrollWheel (Horizontal, Vertical), and the repeat-key behaviour driven by advanceEventTime. Use when the developer asks "how do I right-click in a Compose test", "test a Ctrl+S shortcut", "send a keyboard shortcut", "simulate hover", "test a tooltip", "scroll the mouse wheel", or "drag and drop with a mouse" on desktop or Compose Multiplatform.
Showing 24 of 54 skills. Use the list’s page controls above to explore the rest.
Quick start
- Choose your skills. Select individual skills above, or choose the entire pack.
- Copy the install prompt. Use Copy install prompt above the list.
- Send it to your agent. Paste into your coding agent’s chat. Your agent reviews the source and guides the setup.
Try it with your agent
After installation, start with a request like:
Use the Applying Testing Strategies skill to help with my task.
Ask me for the context you need before getting started.Requirements & license
- A coding agent that can access your project files and install skills.
- Your agent checks each skill’s instructions, dependencies, and permissions during setup.
- Reported license for the skills shown: Apache-2.0. The author’s terms apply.