Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Compose で手に入れた UI の Unit test

mkeeda
March 10, 2023

Compose で手に入れた UI の Unit test

Android Test Night #8 で話したスライド
https://testnight.connpass.com/event/274733/

mkeeda

March 10, 2023
Tweet

More Decks by mkeeda

Other Decks in Programming

Transcript

  1. Compose


    UI Unit test
    2
    02 3
    /
    03
    /
    10
    Android Test Night #
    8


    mkeeda

    View Slide

  2. About me
    • mkeeda (޲Ҫా Ұฏ)
    • Twitter: @mr_mkeeda
    • Github: @mkeeda
    • Android Engineer at Cybozu, Inc
    2

    View Slide

  3. Android UI


    3

    View Slide

  4. Domain Layer
    UI Layer
    Data Layer
    4
    UI elements
    State holders
    UseCases
    Repositories
    DataSources
    ViewModelTest
    UseCaseTest
    RepositoryTest
    DatabaseTest, NetworkTest

    View Slide

  5. End-to-end test
    5
    Domain Layer
    UI Layer
    Data Layer
    UI elements
    State holders
    UseCases
    Repositories
    DataSources
    Espresso
    performAction()


    &


    assert()
    😍


    🤮


    🤮

    View Slide

  6. 6
    Domain Layer
    UI Layer
    Data Layer
    UI elements
    State holders
    UseCases
    Repositories
    DataSources
    Unit test
    : UI ViewModel



    or Fake


    🤮


    😍


    😍

    View Slide

  7. UI Unit test
    UI




    disable


    7
    Domain Layer
    UI Layer
    Data Layer
    UI elements
    State holders
    UseCases
    Repositories
    DataSources

    View Slide

  8. Jetpack Compose
    UI




    f(UI state) = UI


    8
    @Preview
    @Composable
    fun IntTextFieldPreview() {
    Surface {
    IntTextField(
    value = 0,
    onValueChange = {}
    )
    }
    }

    View Slide

  9. Compose UI
    9
    @Test
    fun `੔਺Ҏ֎͸ೖྗͰ͖ͳ͍`() = runComposeUiTest {
    var userInputText: Int? by mutableStateOf(0)
    setContent {
    IntTextField(
    value = userInputText,
    onValueChange = { userInputText = it }
    )
    }
    val notInt = "sample"
    onNode(hasSetTextAction()).performTextInput(notInt)
    onNodeWithText(notInt).assertDoesNotExist()
    assertThat(userInputText).isEqualTo(0)
    }
    ComposeTestRule

    UI

    View Slide

  10. 10
    https://www.youtube.com/watch?v=JyUJZvJ-OV
    8

    View Slide

  11. UI Unit test
    UI






    UI


    Screenshot test
    11
    https://www.droidcon.com/
    20
    22
    /
    08
    /
    01
    /modern-testing-on-android/

    View Slide

  12. Unit test


    12

    View Slide

  13. Instrumented test
    Android


    CI Android


    Robolectric


    Instrumented test Local test
    13

    View Slide

  14. My app
    Android framework
    Instrumented test (AndroidView)
    14
    android.view.View
    MyView
    Android Runtime
    Espresso
    performAction()


    &


    assert()

    View Slide

  15. Android class ⾒
    Local test with Robolectric (AndroidView)
    My app
    Robolectric
    ShadowView
    MyView
    Local JVM
    Espresso
    performAction()


    &


    assert()

    View Slide

  16. Instrumented test (Compose)
    16
    Compose test library
    performAction()


    &


    assert()
    My app
    Android framework
    android.graphic.Canvas
    MyComposable
    Android Runtime
    Compose Runtime

    View Slide

  17. Semantic assert Shadow
    Local test with Robolectric (Compose)
    17
    Compose test library
    performAction()


    &


    assert()
    My app
    Robolectric
    ShadowCanvas
    MyComposable
    Local JVM
    Compose Runtime

    View Slide

  18. UI UI


    Compose UI


    Compose Robolectric


    Compose UI

    18

    View Slide