Compose integrates with common testing frameworks.

## Interoperability with Espresso

In a hybrid app, you can find Compose components inside view hierarchies and
views inside Compose composables (via the [`AndroidView`](https://developer.android.com/reference/kotlin/androidx/compose/ui/viewinterop/package-summary#AndroidView(kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Function1)) composable).

There are no special steps needed to match either type. You match views with
Espresso's [`onView`](https://developer.android.com/reference/androidx/test/espresso/Espresso#onView(org.hamcrest.Matcher%3Candroid.view.View%3E)), and Compose elements with the [`ComposeTestRule`](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule).  

    @Test
    fun androidViewInteropTest() {
        // Check the initial state of a TextView that depends on a Compose state.
        Espresso.onView(withText("Hello Views")).check(matches(isDisplayed()))
        // Click on the Compose button that changes the state.
        composeTestRule.onNodeWithText("Click here").performClick()
        // Check the new value.
        Espresso.onView(withText("Hello Compose")).check(matches(isDisplayed()))
    }

## Interoperability with UiAutomator

By default, composables are accessible from [UiAutomator](https://developer.android.com/training/testing/other-components/ui-automator) only by their
convenient descriptors (displayed text, content description, etc.). If you want
to access any composable that uses [`Modifier.testTag`](https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier#(androidx.compose.ui.Modifier).testTag(kotlin.String)), you need to enable
the semantic property `testTagsAsResourceId` for the particular composable's
subtree. Enabling this behavior is useful for composables that don't have any
other unique handle, such as scrollable composables (for example, `LazyColumn`).
| **Note:** This feature is available in Jetpack Compose version 1.2.0-alpha08 and higher.

Enable the semantic property only once high in your composables hierarchy to
ensure all nested composables with `Modifier.testTag` are accessible from
UiAutomator.  

    Scaffold(
        // Enables for all composables in the hierarchy.
        modifier = Modifier.semantics {
            testTagsAsResourceId = true
        }
    ){
        // Modifier.testTag is accessible from UiAutomator for composables nested here.
        LazyColumn(
            modifier = Modifier.testTag("myLazyColumn")
        ){
            // Content
        }
    }

Any composable with the `Modifier.testTag(tag)` can be accessible with the use
of [`By.res(resourceName)`](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#res) using the same `tag` as the `resourceName`.
**Caution:** Make sure you don't use [`By.res(resourcePackage, resourceId)`](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#res_1) as this formats the argument as `$resourcePackage:id/$resourceId`, which is different from `Modifier.testTag`.  

    val device = UiDevice.getInstance(getInstrumentation())

    val lazyColumn: UiObject2 = device.findObject(By.res("myLazyColumn"))
    // Some interaction with the lazyColumn.

## Additional Resources

- **[Test apps on Android](https://developer.android.com/training/testing)**: The main Android testing landing page provides a broader view of testing fundamentals and techniques.
- **[Fundamentals of testing](https://developer.android.com/training/testing/fundamentals):** Learn more about the core concepts behind testing an Android app.
- **[Local tests](https://developer.android.com/training/testing/local-tests):** You can run some tests locally, on your own workstation.
- **[Instrumented tests](https://developer.android.com/training/testing/instrumented-tests):** It is good practice to also run instrumented tests. That is, tests that run directly on-device.
- **[Continuous integration](https://developer.android.com/training/testing/continuous-integration):** Continuous integration lets you integrate your tests into your deployment pipeline.
- **[Test different screen sizes](https://developer.android.com/training/testing/different-screens):** With some many devices available to users, you should test for different screen sizes.
- **[Espresso](https://developer.android.com/training/testing/espresso)**: While intended for View-based UIs, Espresso knowledge can still be helpful for some aspects of Compose testing.