식물 세부 정보 화면의 일부를 컴포즈로 마이그레이션한 후, 아무 것도 손상되지 않았는지 테스트하는 것이 중요하다.

Note: 실제 앱에서는 테스트 없이 레거시 코드를 다시 작성해서는 안된다. 또한 코드를 컴포즈로 마이그레이션하는 동안 테스트를 리팩토링하고 패스(녹색) 할수 있도록 유지해야 한다.

Sunflower에서 androidTest 폴더에 있는 PlantDetailFragmentTest는 앱의 일부 기능을 테스트한다. 파일을 열고 현재 코드를 살펴보자.

  • testPlantName은 화면상의 식물이름을 확인한다.
  • testShareTextIntent는 공유 버튼을 탭한 후에 올바른 의도가 트리거 되는지 확인한다.

액티비티 또는 프래그먼트가 컴포즈를 사용하는 경우 ActivityScenarioRule을 사용하는 대신 Compose 코드를 테스트할 수 있는 ComposeTestRule과 ActivityScenarioRule을 통합하는 createAndroidComposeRule을 사용해야 한다.

PlantDetailFragmentTest에서 ActivityScenarioRule 사용을 createAndroidComposeRule로 바꾼다. 테스트를 구성하는 데 액티비티 rule이 필요한 경우 다음과 같이 createAndroidComposeRule의 activityRule 속성을 사용한다.

@RunWith(AndroidJUnit4::class)
class PlantDetailFragmentTest {

    @Rule
    @JvmField
    val composeTestRule = createAndroidComposeRule<GardenActivity>()
   
    ...

    @Before
    fun jumpToPlantDetailFragment() {
        populateDatabase()

        composeTestRule.activityRule.scenario.onActivity { gardenActivity ->
            activity = gardenActivity

            val bundle = Bundle().apply { putString("plantId", "malus-pumila") }
            findNavController(activity, R.id.nav_host).navigate(R.id.plant_detail_fragment, bundle)
        }
    }

    ...
}

테스트를 실행하면 testPlantName이 실패한다! testPlantName은 TextView가 화면에 표시되는지 확인한다. 그러나 UI의 해당 부분을 컴포즈로 마이그레이션 했다. 따라서 대신 컴포즈 assertion을 사용해야 한다.

@Test
fun testPlantName() {
    composeTestRule.onNodeWithText("Apple").assertIsDisplayed()
}

테스트를 실행하면, 모두 통과하는 것을 볼 수 있다.

284a1c1cffbe911b.png
카테고리: Compose

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.