Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Android UI 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 Domain Layer UI Layer Data Layer UI elements State holders UseCases Repositories DataSources Unit test : UI ViewModel 
 or Fake 🤮 😍 😍

Slide 7

Slide 7 text

UI Unit test UI 
 disable 7 Domain Layer UI Layer Data Layer UI elements State holders UseCases Repositories DataSources

Slide 8

Slide 8 text

Jetpack Compose UI f(UI state) = UI 8 @Preview @Composable fun IntTextFieldPreview() { Surface { IntTextField( value = 0, onValueChange = {} ) } }

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Unit test 12

Slide 13

Slide 13 text

Instrumented test Android CI Android Robolectric Instrumented test Local test 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Instrumented test (Compose) 16 Compose test library performAction() & assert() My app Android framework android.graphic.Canvas MyComposable Android Runtime Compose Runtime

Slide 17

Slide 17 text

Semantic assert Shadow Local test with Robolectric (Compose) 17 Compose test library performAction() & assert() My app Robolectric ShadowCanvas MyComposable Local JVM Compose Runtime

Slide 18

Slide 18 text

UI UI Compose UI Compose Robolectric Compose UI 
 18