Compose 탐색 테스트

컴포저블 대상에서 탐색 코드를 분리하면 NavHost 컴포저블과 별도로 컴포저블을 각각 격리해 테스트할 수 있습니다.

NavController를 컴포저블에 직접 전달하지 마세요. 대신 탐색 콜백 (람다)을 매개변수로 전달하세요. 따라서 테스트에서 NavController 인스턴스가 필요하지 않으므로 모든 컴포저블을 개별적으로 테스트할 수 있습니다.

NavHostcomposable 람다는 Navigation API와 컴포저블 간의 다리 역할을 합니다.

@Composable
fun ProfileScreen(
    userId: String,
    navigateToFriendProfile: (friendUserId: String) -> Unit
) {
 // …
}

// In your NavHost
composable<Profile> { backStackEntry ->
    val profile = backStackEntry.toRoute<Profile>()
    ProfileScreen(userId = profile.id) { friendUserId ->
        navController.navigate(route = Profile(id = friendUserId))
    }
}

이렇게 하면 모의 값과 콜백을 전달하여 탐색과 독립적으로 ProfileScreen를 테스트할 수 있습니다.

NavHost, 컴포저블에 전달된 탐색 작업, 개별 화면 컴포저블을 테스트하여 앱 탐색 요구사항을 포괄하는 테스트를 작성하는 것이 좋습니다.

NavHost 테스트

NavHost 테스트를 시작하려면 앱 모듈의 build.gradle 파일에 다음 탐색 테스트 종속 항목을 추가합니다.

dependencies {
  androidTestImplementation "androidx.navigation:navigation-testing:$navigationVersion"
}

NavHostController를 매개변수로 허용하는 컴포저블로 앱의 NavHost를 래핑합니다.

@Composable
fun AppNavHost(navController: NavHostController){
  NavHost(navController = navController, startDestination = Home){
      composable<Home> { /*...*/ }
      composable<Profile> { /*...*/ }
  }
}

이제 탐색 테스트 아티팩트 TestNavHostController의 인스턴스를 전달하여 AppNavHostNavHost 내부에 정의된 탐색 로직을 테스트할 수 있습니다.

앱의 시작 대상과 NavHost를 확인하는 UI 테스트는 다음과 같습니다.

class NavigationTest {

    @get:Rule
    val composeTestRule = createComposeRule()
    lateinit var navController: TestNavHostController

    @Before
    fun setupAppNavHost() {
        composeTestRule.setContent {
            navController = TestNavHostController(LocalContext.current)
            navController.navigatorProvider.addNavigator(ComposeNavigator())
            AppNavHost(navController = navController)
        }
    }

    @Test
    fun appNavHost_verifyStartDestination() {
        composeTestRule
            .onNodeWithContentDescription("Start Screen")
            .assertIsDisplayed()
    }
}

탐색 작업 테스트

탐색 구현은 UI 요소를 클릭한 다음 표시되는 대상을 확인하거나 현재 경로를 기준으로 예상 경로를 비교하는 등 여러 가지 방법으로 테스트할 수 있습니다.

실제적인 앱 구현을 테스트할 때는 UI를 클릭하는 방법을 사용하는 것이 좋습니다. 개별적으로 구성 가능한 함수와 함께 이를 격리하여 테스트하는 방법을 알아보려면 Jetpack Compose에서 테스트 Codelab을 참고하세요.

currentBackStackEntry를 사용하여 현재 경로를 예상 경로와 비교함으로써 navController를 사용하여 탐색 어설션을 확인할 수도 있습니다.

@Test
fun appNavHost_clickProfile_navigatesToProfile() {
    composeTestRule.onNodeWithContentDescription("Go to Profile")
        .performClick()

    assertTrue(navController.currentBackStackEntry?.destination?.hasRoute<Profile>() ?: false)
}

Compose 테스트 기본사항에 관한 자세한 내용은 Compose 레이아웃 테스트 가이드를 참고하세요.