Robolectric 전략

Robolectric은 Google에서 유지관리하는 오픈소스 프레임워크로, 에뮬레이터의 오버헤드와 불안정성 없이 JVM 내에서 시뮬레이션된 Android 환경에서 테스트를 실행할 수 있습니다. Lollipop (API 수준 21) 이후의 모든 Android 버전을 지원합니다.

많은 대규모 프로젝트에서 Robolectric을 사용하여 테스트의 속도와 안정성을 높이고 실제 기기 또는 에뮬레이터에서 테스트를 실행하는 것과 관련된 비용을 줄입니다. 여기에는 Robolectric을 많이 사용하는 대부분의 Google 앱이 포함됩니다.

Robolectric은 모든 기능과 API를 지원하지 않으므로 에뮬레이터를 완전히 대체하지는 않습니다. 예를 들어 Robolectric에는 에뮬레이터와 같은 화면이 없으며 일부 API는 부분적으로만 지원됩니다. 하지만 단위 테스트와 대부분의 UI 테스트를 안정적으로 실행하기에 충분한 Android 부분을 에뮬레이션합니다.

테스트 전략

Robolectric으로 추구할 수 있는 테스트 전략에는 단위 테스트와 UI 테스트의 두 가지 유형이 있습니다.

단위 테스트

Robolectric은 Android 앱에서 '단위 테스트'를 사용 설정하는 방법으로 고안되었습니다. 예를 들어 Activity 실행을 시뮬레이션하고 내부의 로직을 테스트하여 모든 수명 주기 메서드를 호출할 수 있습니다.

Robolectric의 모조 (그림자라고 함)를 단위 테스트의 종속 항목으로 사용할 수도 있습니다. 예를 들어 클래스가 Bundle을 사용하거나 블루투스 연결을 조작해야 하는 경우

일반적으로 테스트 가능한 아키텍처를 구현하는 경우 단위 테스트에 Robolectric을 사용할 필요가 없습니다. 코드가 Android 프레임워크에 종속되지 않고 독립적으로 테스트 가능하기 때문입니다.

UI 테스트

Robolectric은 Espresso 또는 Compose 테스트와 같은 UI 테스트도 실행할 수 있습니다. 계측 테스트를 test 소스 세트로 이동하고 Robolectric 종속 항목을 설정하여 Robolectric으로 변환할 수 있습니다.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

test 소스 세트에 있는 모든 UI 테스트는 Robolectric으로 실행됩니다.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

대부분의 UI 테스트는 프레임워크와 상호작용하지 않으며 Robolectric에서 실행할 수 있습니다. Robolectric에서 동작 테스트를 실행할 수 있습니다. 동작 테스트에 필요한 충실도가 충분하기 때문입니다. 예를 들어 Compose 테스트에서 버튼을 클릭한 후 UI가 변경되었는지 확인하는 경우

Robolectric을 사용하여 스크린샷 테스트와 같은 다른 UI 테스트를 실행할 수 있습니다. 그러나 기기마다 화면을 약간 다르게 렌더링하므로 충실도가 더 낮습니다.

Robolectric의 구현이 각 사용 사례에 충분한지 결정해야 하지만 다음은 몇 가지 권장사항입니다.

  • 구성요소, 기능 또는 애플리케이션 테스트의 격리된 UI 동작 테스트에는 Robolectric을 사용하세요. 일반적으로 이러한 테스트는 UI의 상태 관리 및 동작을 확인하고 외부 종속 항목과 상호작용하지 않습니다.
  • 픽셀 정확성이 중요하지 않은 경우 Robolectric을 사용하여 스크린샷을 찍습니다. 예를 들어 구성요소가 다양한 글꼴 크기 또는 테마에 어떻게 반응하는지 테스트할 수 있습니다.

참고: Robolectric은 기본적으로 스크린샷을 찍을 수 있지만 Robolectric으로 스크린샷 테스트를 실행하려면 서드 파티 라이브러리가 필요합니다.

Robolectric 테스트와 기기 테스트 비교

요약하자면 Robolectric은 대부분의 UI 테스트를 실행하기에 충분한 충실도를 제공하지만, 전면 이미지 또는 PIP와 같은 시스템 UI와 관련된 테스트나 WebView와 같이 지원되지 않는 기능을 사용하는 경우와 같이 기기 테스트가 필요한 경우도 있습니다.