Agent skill

Setting Up Host Vs Device Tests

by skydoves in skydoves/android-testing-skills

A skill your agent uses to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly.

Apache-2.0Auto-check passedMobile

Install Setting Up Host Vs Device Tests

skills CLI
$ npx skills add skydoves/android-testing-skills --skill setting-up-host-vs-device-tests -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install skydoves/android-testing-skills setting-up-host-vs-device-tests --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/compose/setup/setting-up-host-vs-device-tests .claude/skills/setting-up-host-vs-device-tests && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
setting-up-host-vs-device-tests
GitHub stars
333
Token cost
~4.8k tokens
SKILL.md length
1,373 words
Files
1
Skills in repo
50
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly.

  • Choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose
  • SKILL.md covers When to use this skill, When NOT to use this skill, Prerequisites and Workflow, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • To configure each correctly

What it does

Setting Up Host Vs Device Tests is an agent skill from skydoves/android-testing-skills. Use this skill to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly. Covers the androidHostTest (a.k.a. src/test/) vs androidDeviceTest (a.k.a. src/androidTest/) source set split, what each flavor can and cannot drive (RenderThread, screenshots, accessibility), the @RunWith(AndroidJUnit4::class) @Config(minSdk = 23) setup for Robolectric, and why Thread.sleep is forbidden everywhere except screenshot tests waiting on the RenderThread. Use…

Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Android development and Accessibility. It works with Jetpack Compose and Android. The repository describes itself as: ⚡️ A set of skills for Android testing: Compose UI, AndroidX Test, JVM unit tests, and ADB. The licence is Apache-2.0.

When your agent uses it

  • Choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose
  • To configure each correctly
  • The user reports tests pass locally but fail on CI
  • Asks Robolectric vs instrumentation

Example prompts

  • “tests pass locally but fail on CI”
  • “Robolectric vs instrumentation”
  • “should this test live in test/ or androidTest/”
  • “/setting-up-host-vs-device-tests”

What it can do on your machine

Read from SKILL.md and the folder at commit 8665ed5. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are kotlin).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • developer.android.com
    • robolectric.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Setting Up Host Vs Device Tests loads about 4.8k tokens when it runs. Until then it costs about 201 tokens; SKILL.md has 1,373 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~201
When it runs · the whole SKILL.md, loaded when a task matches
~4.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from skydoves/android-testing-skills at commit 8665ed5, republished under its Apache-2.0 licence (© skydoves). 1,373 words, ~4,822 tokens.

Download SKILL.mdSave it as .claude/skills/setting-up-host-vs-device-tests/SKILL.md (or your agent's skills folder).
name
setting-up-host-vs-device-tests
description
Use this skill to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly. Covers the `androidHostTest` (a.k.a. `src/test/`) vs `androidDeviceTest` (a.k.a. `src/androidTest/`) source set split, what each flavor can and cannot drive (RenderThread, screenshots, accessibility), the `@RunWith(AndroidJUnit4::class) @Config(minSdk = 23)` setup for Robolectric, and why `Thread.sleep` is forbidden everywhere except screenshot tests waiting on the RenderThread. Use when the user reports "tests pass locally but fail on CI", asks "Robolectric vs instrumentation", mentions screenshot tests, ripple animations, accessibility checks throwing on Robolectric, or "should this test live in test/ or androidTest/".
license
Apache-2.0. See LICENSE for complete terms.
metadata.author
Jaewoong Eum (skydoves)
metadata.keywords
jetpack-compose, ui-testing, robolectric, host-test, device-test, androidTest, instrumentation-test, render-thread, screenshot-test, thread-sleep…

Setting Up Host vs Device Tests — Pick the Right Source Set

Compose tests run unchanged on either Robolectric (JVM, fast, no emulator) or on a real/virtual device (full Android stack, RenderThread, accessibility). The same runComposeUiTest { setContent { … } } block compiles in both — only the underlying Looper and Choreographer differ. This skill encodes which flavor each test should live in, the Robolectric class skeleton, and the one legitimate Thread.sleep exception (screenshot tests waiting on the RenderThread).

When to use this skill

  • The user is starting a Compose UI test and asks "test/ or androidTest/?".
  • A test passes on a local emulator but fails on CI's Robolectric runner (or vice versa).
  • The user reports Build.FINGERPRINT == "robolectric" warnings from enableAccessibilityChecks(...).
  • A screenshot test produces a black/empty PNG on the host runner.
  • A ripple/pressInteraction test renders no ripple on Robolectric and the user is debugging why.
  • The user wrote Thread.sleep(1000) to "wait for an animation" and is asking why it is flaky.
  • The user mentions androidDeviceTest / androidHostTest source sets (used in androidx itself).

When NOT to use this skill

  • The dependencies are not yet wired correctly — start with ./configuring-test-dependencies/SKILL.md.
  • The choice is between createComposeRule() and runComposeUiTest { } — see ./choosing-test-rule-vs-runtest/SKILL.md.
  • The test runs in the right flavor but is flaky on idle/animation — see ../../synchronization/synchronizing-with-idle/SKILL.md and ../../synchronization/testing-animations-deterministically/SKILL.md.

Prerequisites

  • androidx.compose.ui:ui-test, ui-test-junit4, and ui-test-manifest on the correct configurations for the chosen flavor — see ./configuring-test-dependencies/SKILL.md.
  • For host tests: org.robolectric:robolectric on testImplementation, testOptions { unitTests.isIncludeAndroidResources = true } in the Android block.
  • For device tests: a configured emulator or physical device, androidx.test.runner.AndroidJUnitRunner (or a Hilt subclass) as the testInstrumentationRunner.
  • Working knowledge of MainTestClock semantics — see the synchronization skill set.

Workflow

  • 1. Decide the flavor by capability, not by speed. The matrix:

    CapabilityHost (Robolectric, src/test/)Device (instrumentation, src/androidTest/)
    Recomposition + state changesWorksWorks
    Layout + measurementWorksWorks
    Touch input via performTouchInputWorks (synthetic events)Works (real input pipeline)
    Modifier.indication ripplesNo (RenderThread not driven)Works
    Screenshot capture (captureToImage)No (no real surface)Works
    enableAccessibilityChecks(...)Inconclusive — ComposeUiTestExt.android.kt:50-53 logs Log.w("ComposeUiTest", "Accessibility checks are currently not supported by Robolectric") and still installs the validator, but Robolectric does not faithfully drive accessibility services (b/332778271). Treat passing as inconclusive.Works (@RequiresApi(34))
    Gesture detectors needing real-time clock changes (double-tap, long-press timing)Works only with manual mainClock.advanceTimeBy(...)Works automatically
    Activity lifecycle (real onPause/onResume)ApproximatedReal
    Min SDK23 (internal const val RobolectricMinSdk = 23 from compose/ui/ui-test/src/androidHostTest/.../Constants.kt)The module's minSdk
    Speed (rough order)SecondsTens of seconds + emulator boot
    CI footprintJVM onlyEmulator service or Firebase Test Lab

    Choose host for logic/recomposition/finder coverage. Choose device for anything that touches the RenderThread, real animations involving Modifier.indication, screenshot golden tests, or accessibility validation.

  • 2. Place files in the matching source set. The androidx convention is:

    text
    src/
    ├── androidHostTest/        # = test/ — Robolectric on JVM
    │   └── kotlin/.../FooTest.kt
    ├── androidDeviceTest/      # = androidTest/ — instrumentation
    │   └── kotlin/.../FooScreenshotTest.kt
    └── androidCommonTest/      # helpers shared by both
        └── kotlin/.../FooTestHelpers.kt

    In a typical app module without KMP source sets, the equivalent is src/test/ (host) and src/androidTest/ (device). The same runComposeUiTest { setContent { … } } body compiles unchanged in both — only the Looper/Choreographer differs at runtime.

  • 3. Configure the host test class skeleton. Copy the canonical androidx pattern from compose/ui/ui-test/src/androidHostTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt:

kotlin
@RunWith(AndroidJUnit4::class)
@Config(minSdk = 23)
@OptIn(ExperimentalTestApi::class)
class MyHostTest {
    @Before
    fun setup() {
        // capture the master timeout so we can restore it afterwards
        masterTimeout = IdlingPolicies.getMasterIdlingPolicy()
    }

    @After
    fun tearDown() {
        masterTimeout?.let {
            IdlingPolicies.setMasterPolicyTimeout(it.idleTimeout, it.idleTimeoutUnit)
        }
    }

    @Test
    fun stateChange() = runComposeUiTest {
        setContent { ClickCounter() }
        onNodeWithText("Click me").performClick()
        onNodeWithText("Click count", substring = true).assertTextEquals("Click count: 1")
    }

    private var masterTimeout: IdlingPolicy? = null
}

AndroidJUnit4::class delegates to Robolectric on the JVM and to AndroidJUnit4ClassRunner on a device — making the same class portable. @RunWith(RobolectricTestRunner::class) also works but ties the class to host-only.

  • 4. Configure the device test class skeleton.
kotlin
@RunWith(AndroidJUnit4::class)
class MyDeviceTest {
    @get:Rule val rule = createComposeRule()       // or v2 import — see ./choosing-test-rule-vs-runtest/

    @Test
    fun stateChange() {
        rule.setContent { ClickCounter() }
        rule.onNodeWithText("Click me").performClick()
        rule.onNodeWithText("Click count", substring = true).assertTextEquals("Click count: 1")
    }
}
  • 5. Compose mainClock.advanceTimeBy(...) for any animation/gesture-detection test. On Robolectric, gesture detectors (double-tap, long-press) rely on the test clock advancing — they do NOT receive real wall-clock ticks. The RobolectricComposeTest.kt source quotes this directly: gesture detectors require manual mainClock.advanceTimeBy(...) because they detect events through clock changes. Same applies to any animateFloatAsState driven by the recomposer's frame clock — see ../../synchronization/testing-animations-deterministically/SKILL.md.

  • 6. Identify the one legitimate Thread.sleep use case: screenshot tests waiting on the RenderThread. Compose's IdlingResource aggregates the recomposer, snapshot, and frame-clock awaiters, but the RenderThread is outside that aggregation. Ripple animations (Modifier.indication) and any draw-time animation owned by the platform render pipeline cannot be waited on through mainClock.advanceTimeBy or waitForIdle. From compose/material3/material3/src/androidDeviceTest/.../ToggleButtonScreenshotTest.kt:115-123:

kotlin
rule.mainClock.autoAdvance = false
rule.onNode(isToggleable()).performTouchInput { down(center) }

rule.mainClock.advanceTimeByFrame()
rule.waitForIdle()                          // wait for measure
rule.mainClock.advanceTimeBy(milliseconds = 200)

// Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
// synchronization. Instead just wait until after the ripples are finished animating.
Thread.sleep(300)

assertAgainstGolden("toggleButton_lightTheme_defaultToPressed")

This is the only case. Anywhere else, Thread.sleep is a smell — it desyncs from MainTestClock and produces flakes that wear the developer down. Use mainClock.advanceTimeBy(durationMs) (test clock) for animations or rule.waitUntil(timeoutMillis = …) { … } (wall clock) for external state.

  • 7. Enforce: NO Thread.sleep in host tests. Host tests cannot drive the RenderThread anyway, so the screenshot exception does not apply. Replace every Thread.sleep(N) in a host test with mainClock.advanceTimeBy(N) (animation case) or rule.waitUntil { … } (external state).

  • 8. Place screenshot, ripple, and accessibility tests in the device source set. The host runner cannot satisfy them. Specifically:

    • Screenshots: captureToImage() requires a real Surface. Host returns no pixel data.
    • Ripples: Modifier.indication draws on the RenderThread — no observable state on host.
    • Accessibility: enableAccessibilityChecks(...) is @RequiresApi(34). On Robolectric, both extension implementations check Build.FINGERPRINT.lowercase() == "robolectric", emit a Log.w warning, AND still install the validator — but Robolectric does not faithfully drive accessibility services, so any pass is inconclusive (b/332778271). Run accessibility checks on a real device for trustworthy results.
  • 9. Place fast logic/recomposition/state tests in the host source set. Examples that thrive on Robolectric:

    • StateRestorationTester.emulateSavedInstanceStateRestore() flows.
    • Pure state-change verification (assertTextEquals, assertIsOn).
    • LazyList finder/scroll tests that don't depend on velocity-driven physics.
    • mainClock.advanceTimeBy(durationMs) driven animation snapshots that don't need rasterization.
Show full SKILL.md (547 more words)Show less

Patterns

Pattern: WRONG vs RIGHT — screenshot test on host
kotlin
// WRONG — placed in src/test/ (Robolectric)
@RunWith(AndroidJUnit4::class)
@Config(minSdk = 23)
class ButtonScreenshotTest {
    @Test
    fun pressed() = runComposeUiTest {
        setContent { Button(onClick = {}) { Text("OK") } }
        onNode(hasText("OK")).performTouchInput { down(center) }
        onNode(hasText("OK")).captureToImage().assertAgainstGolden("pressed")
    }
}
// WRONG because: Robolectric has no real Surface, so captureToImage() returns black/empty
// pixels and the ripple from Modifier.indication never draws (RenderThread is not driven).
// The test will produce a false-positive pass or a meaningless golden file.
kotlin
// RIGHT — placed in src/androidTest/ (device)
@RunWith(AndroidJUnit4::class)
class ButtonScreenshotTest {
    @get:Rule val rule = createComposeRule()

    @Test
    fun pressed() {
        rule.setContent { Button(onClick = {}) { Text("OK") } }
        rule.mainClock.autoAdvance = false
        rule.onNode(hasText("OK")).performTouchInput { down(center) }
        rule.mainClock.advanceTimeByFrame()
        rule.waitForIdle()
        rule.mainClock.advanceTimeBy(milliseconds = 200)
        Thread.sleep(300)                          // legitimate — RenderThread for ripples
        rule.onNode(hasText("OK")).captureToImage().assertAgainstGolden("pressed")
    }
}
Pattern: WRONG vs RIGHT — Thread.sleep in a host animation test
kotlin
// WRONG — host test
@Test
fun fadeIn() = runComposeUiTest {
    val target = mutableStateOf(0f)
    setContent { Box(Modifier.alpha(animateFloatAsState(target.value).value)) }
    target.value = 1f
    Thread.sleep(500)                                // smell
    onNode(isRoot()).captureToImage()                // also broken on host
}
// WRONG because: Thread.sleep desyncs from MainTestClock. The test clock has not advanced,
// the recomposer has not run withFrameNanos, and the animation made zero observable progress.
kotlin
// RIGHT — host test (recomposition only — no pixel capture)
@Test
fun fadeIn() = runComposeUiTest {
    mainClock.autoAdvance = false
    val target = mutableStateOf(0f)
    setContent { Box(Modifier.alpha(animateFloatAsState(target.value).value).testTag("box")) }
    runOnUiThread { target.value = 1f }
    mainClock.advanceTimeByFrame()                   // kick off
    mainClock.advanceTimeBy(durationMillis = 500)    // step forward by test clock
    onNodeWithTag("box").assertIsDisplayed()
}

For pixel verification of the fade, move the test to the device source set and use captureToImage().

Pattern: WRONG vs RIGHT — accessibility checks on host
kotlin
// WRONG — host
@Test
fun submitIsLabelled() = runComposeUiTest {
    enableAccessibilityChecks()                      // logs warning, runs no checks
    setContent { Submit() }
    onNodeWithTag("submit").performClick()
}
// WRONG because: both ui-test-accessibility and ui-test-junit4-accessibility detect
// Build.FINGERPRINT.lowercase() == "robolectric", emit a Log.w, AND still install the
// validator — but Robolectric does not faithfully drive accessibility services, so the
// result is inconclusive (b/332778271). Run accessibility checks on a real device.
kotlin
// RIGHT — device
@RunWith(AndroidJUnit4::class)
class SubmitA11yTest {
    @get:Rule val rule = createAndroidComposeRule<MainActivity>()

    @Test fun submitIsLabelled() {
        rule.enableAccessibilityChecks()
        rule.setContent { Submit() }
        rule.onNodeWithTag("submit").performClick()  // accessibility checks run automatically
    }
}
Pattern: shared body, two source sets

The same runComposeUiTest { ... } body can compile in both source sets when the test only uses the common API. Place the body in androidCommonTest/ and create two thin wrappers — one in androidHostTest/ (with @RunWith(AndroidJUnit4::class) @Config(minSdk = 23)), one in androidDeviceTest/ (no @Config). This is how androidx's own ui-test module exercises both flavors without code duplication. For an app module without KMP source sets, prefer keeping the body inline in whichever flavor is appropriate.

Mandatory rules

  • MUST NOT put screenshot / captureToImage / ripple / Modifier.indication-dependent tests in the host source set. The RenderThread is not driven; the test is meaningless even when it appears to pass.
  • MUST NOT rely on enableAccessibilityChecks(...) results from a host test. Both extensions log a warning under Build.FINGERPRINT.lowercase() == "robolectric" and still install the validator, but Robolectric does not faithfully drive accessibility services so the result is inconclusive — run accessibility checks on a real device API 34+.
  • MUST NOT use Thread.sleep in a host test under any circumstance. The screenshot exception does not apply (host has no RenderThread).
  • MUST NOT use Thread.sleep in a device test except when waiting on the RenderThread for ripple/screenshot golden capture. Skydoves hot take #7: Thread.sleep is a smell. Anywhere else, replace it with mainClock.advanceTimeBy(durationMs) (test clock) or rule.waitUntil(timeoutMillis) { ... } (wall clock) — see ../../synchronization/synchronizing-with-idle/SKILL.md.
  • MUST annotate Robolectric host tests with @Config(minSdk = 23) or higher. Lower SDK levels are not supported by androidx's host test infrastructure (internal const val RobolectricMinSdk = 23).
  • MUST annotate gesture-detection or animation host tests to step the clock manually with mainClock.advanceTimeBy(...). Robolectric does not advance the test clock from real-time signals.
  • MUST set testOptions { unitTests.isIncludeAndroidResources = true } in the module's android { } block so Robolectric can read merged resources during host Compose tests.
  • PREFERRED: start with a host test for fast feedback. Move to a device test only when capability requires it (RenderThread, accessibility, real input timing).
  • PREFERRED: when a test must work in both flavors, factor the body into androidCommonTest/ (KMP) or a helper function the two flavors call.

Verification

  • ./gradlew :<module>:testDebugUnitTest runs and passes for all host tests; ./gradlew :<module>:connectedDebugAndroidTest runs and passes for all device tests.
  • No Thread.sleep appears in any host test (grep -r "Thread.sleep" src/test src/androidHostTest).
  • No captureToImage, no enableAccessibilityChecks, and no test that depends on Modifier.indication ripples appears in the host source set.
  • Every Thread.sleep in the device source set has a comment explaining the RenderThread / screenshot rationale.
  • Robolectric host test classes carry @RunWith(AndroidJUnit4::class) (or @RunWith(RobolectricTestRunner::class)) AND @Config(minSdk = 23) (or higher).
  • Animation/gesture host tests set mainClock.autoAdvance = false and call mainClock.advanceTimeBy(durationMs) explicitly.

References

  • Compose testing overview (Android Developers): https://developer.android.com/develop/ui/compose/testing
  • Robolectric — Compose support: http://robolectric.org/
  • Compose UI release notes: https://developer.android.com/jetpack/androidx/releases/compose-ui
  • Testing animations (Android Developers): https://developer.android.com/develop/ui/compose/animation/testing
  • compose/ui/ui-test/src/androidHostTest/kotlin/androidx/compose/ui/test/RobolectricComposeTest.kt — canonical host class skeleton, @RunWith(AndroidJUnit4::class) @Config(minSdk = RobolectricMinSdk), gesture-detector clock comment, IdlingPolicies setup/teardown.
  • compose/ui/ui-test/src/androidHostTest/kotlin/androidx/compose/ui/test/Constants.kt — internal const val RobolectricMinSdk = 23.
  • compose/material3/material3/src/androidDeviceTest/kotlin/androidx/compose/material3/ToggleButtonScreenshotTest.kt:115-123 — the canonical legitimate Thread.sleep(300) waiting on the RenderThread for ripple completion before assertAgainstGolden.
  • compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/RobolectricIdlingStrategy.android.kt — Robolectric idling strategy that drives the host idle loop.
  • compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/ComposeIdlingResource.android.kt — the recomposer + snapshot + frame-clock aggregator (caps at 100 frames/call); does NOT include the RenderThread, which is why ripple tests need Thread.sleep.

© skydoves, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in compose/setup/setting-up-host-vs-device-tests of skydoves/android-testing-skills.

Open the folder on GitHubat commit 8665ed5

Compare with similar skills

Setting Up Host Vs Device Tests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Setting Up Host Vs Device Tests compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Setting Up Host Vs Device Tests this skillskydoves/android-testing-skills333—~4.8kAutomated safety check: PassApache-2.0
Accessible Mobile DeveloperFerroxLabs/wayland608—~3.6kAutomated safety check: PassApache-2.0
Compose Agenthamen/compose_skill373—~4kAutomated safety check: NotesMIT
Android App FactoryJasonColapietro/suede-creator-skills127—~2.6kAutomated safety check: PassMIT
Android AccessibilityMoustachauve/WLED-Android1693 repos~471Automated safety check: PassApache-2.0
Compose Multiplatform Patternsmonta-app/ocpp-emulator1805 repos~2kAutomated safety check: PassApache-2.0

Similar skills

  • Accessible Mobile Developer

    FerroxLabs/wayland

    Mobile accessibility development expertise covering iOS VoiceOver and Android TalkBack integration, accessibility APIs for SwiftUI and Jetpack Compose, touch target sizing, gesture alternatives…

    608 GitHub stars~3.6k tokensUpdated 2 days ago
    MobileAuto-check passed
  • Compose Agent

    hamen/compose_skill

    Helps AI coding assistants write modern Jetpack Compose: correct state, side effects, performance-aware modifiers, Navigation 3, Paging 3 in Compose, coroutines on lifecycle, animations, UI tests…

    373 GitHub stars~4k tokensUpdated 2 mo ago
    MobileAuto-check: notes
  • Android App Factory

    JasonColapietro/suede-creator-skills

    Takes a native Android app from product idea to Google Play release, covering Compose architecture, policy checks, privacy, billing, testing, signing and rollout.

    127 GitHub stars~2.6k tokensUpdated yesterday
    MobileAuto-check passed
  • Android Accessibility

    Moustachauve/WLED-Android

    Expert checklist and prompts for auditing and fixing Android accessibility issues, especially in Jetpack Compose.

    169 GitHub starsUsed in 3 repos~471 tokens
    Frontend & DesignAuto-check passed
  • Compose Multiplatform Patterns

    monta-app/ocpp-emulator

    Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.

    180 GitHub starsUsed in 5 repos~2k tokens
    MobileAuto-check passed
  • Styles

    arindamxd/camerax-android

    A skill your agent uses to integrate the Jetpack Compose Styles API into an Android project.

    132 GitHub starsUsed in 4 repos~2.3k tokens
    MobileAuto-check passed

More from skydoves/android-testing-skills

All 50 skills in this repo
  • Asserting Bounds And Dimensions

    skydoves/android-testing-skills

    A skill your agent uses to verify Compose layout measurements from a UI test using assertWidthIsEqualTo, assertHeightIsEqualTo, assertWidthIsAtLeast, assertHeightIsAtLeast…

    333 GitHub stars~3.3k tokensUpdated 4 mo ago
    Auto-check passed
  • Asserting Node State And Text

    skydoves/android-testing-skills

    A skill your agent uses to verify a Compose semantics node's properties from a UI test using assertExists, assertDoesNotExist, assertIsDisplayed, assertIsNotDisplayed, assertIsDeactivated…

    333 GitHub stars~3.6k tokensUpdated 4 mo ago
    Auto-check passed
  • Capturing Preview Screenshots In CI

    skydoves/android-testing-skills

    A skill your agent uses to render every Jetpack Compose @Preview as a screenshot on a real Android device or emulator and publish a browsable HTML catalog from CI.

    333 GitHub stars~4.5k tokensUpdated 4 mo ago
    Auto-check: notes
  • Capturing Screenshots And Screenrecord

    skydoves/android-testing-skills

    A skill your agent uses to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos.

    333 GitHub stars~3.7k tokensUpdated 4 mo ago
    Auto-check passed
  • Choosing Test Rule Vs Runtest

    skydoves/android-testing-skills

    A skill your agent uses to pick the correct Compose UI test entry point.

    333 GitHub stars~4.5k tokensUpdated 4 mo ago
    Auto-check passed
  • Choosing What To Test

    skydoves/android-testing-skills

    A skill your agent uses 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…

    333 GitHub stars~4.6k tokensUpdated 4 mo ago
    Auto-check passed

Questions about Setting Up Host Vs Device Tests

What does Setting Up Host Vs Device Tests do?

A skill your agent uses to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly. Setting Up Host Vs Device Tests is an agent skill from skydoves/android-testing-skills. Use this skill to choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose, and to configure each correctly.

When should I use Setting Up Host Vs Device Tests?

Setting Up Host Vs Device Tests fits situations like: choose between host (Robolectric/JVM) and device (instrumentation) tests for Jetpack Compose; to configure each correctly; the user reports tests pass locally but fail on CI; asks Robolectric vs instrumentation.

How do I install Setting Up Host Vs Device Tests in Claude Code?

Run `npx skills add skydoves/android-testing-skills --skill setting-up-host-vs-device-tests -a claude-code`. Or copy the skill folder (compose/setup/setting-up-host-vs-device-tests in skydoves/android-testing-skills) into .claude/skills/setting-up-host-vs-device-tests in your project. Claude Code loads it when a task matches its description.

How do I install Setting Up Host Vs Device Tests in Codex?

Run `npx skills add skydoves/android-testing-skills --skill setting-up-host-vs-device-tests -a codex`. Or copy the skill folder (compose/setup/setting-up-host-vs-device-tests in skydoves/android-testing-skills) into .agents/skills/setting-up-host-vs-device-tests in your project. Codex loads it when a task matches its description.

Can I use Setting Up Host Vs Device Tests in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add skydoves/android-testing-skills --skill setting-up-host-vs-device-tests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/setting-up-host-vs-device-tests, .gemini/skills/setting-up-host-vs-device-tests, .github/skills/setting-up-host-vs-device-tests and .opencode/skills/setting-up-host-vs-device-tests in your project.

What does Setting Up Host Vs Device Tests need to run?

SKILL.md names no scripts, command-line tools or credentials: Setting Up Host Vs Device Tests is instructions for the agent only.

Does Setting Up Host Vs Device Tests access the network?

SKILL.md names 2 domains. As links in the text: developer.android.com and robolectric.org. This is read from the text; nothing was executed.

Is Setting Up Host Vs Device Tests safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Setting Up Host Vs Device Tests use?

Setting Up Host Vs Device Tests is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Setting Up Host Vs Device Tests use?

About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Setting Up Host Vs Device Tests?

Skills that share tags, products or a category with Setting Up Host Vs Device Tests: Accessible Mobile Developer (FerroxLabs/wayland, 608 stars), Compose Agent (hamen/compose_skill, 373 stars), Android App Factory (JasonColapietro/suede-creator-skills, 127 stars) and Android Accessibility (Moustachauve/WLED-Android, 169 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Setting Up Host Vs Device Tests?

skydoves (a GitHub user) maintains it in skydoves/android-testing-skills, which has 333 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on May 25, 2026.

Source: skydoves/android-testing-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.