[Android] Robolectric 을 이용해 Test해보자!

윤호이·2023년 11월 14일
0

Test

목록 보기
6/13
post-thumbnail

서론

지금까지 UI나 안드로이드 관련 테스트는 AndroidTest 폴더에서
instrumented test로 테스트 했었습니다.

Unit test에서 안드로이드 관련 프레임 워크를 호출 할 수 있다면?

그걸 가능하게 해주는 것이 robolectric 입니다.

robolectric

robolectric은 에뮬레이터가 아닌 JVM 상에서 동작합니다.

대체 구현된 Api를 통해서 Unit test에서도 안드로이드 프레임워크를 호출 가능하다니

신기하지 않나요?

가장 만만한게 UI 테스트이니 robolectric으로 UI test를 Unit test에서
하는 과정을 보여드리도록 하겠습니다.

의존성 추가

testImplementation ("org.robolectric:robolectric:4.9") //Robolectric
testImplementation ("androidx.compose.ui:ui-test-junit4:1.5.4") // compose test

테스트에 필요한 의존성을 추가해줍니다.

gradle 설정

android {

...
    testOptions {
        unitTests {
            isIncludeAndroidResources = true
        }
    }
    
...

}

안드로이드 리소스를 Unit test에서 사용하기 위해 isIncludeAndroidResources를 true
로 해줍시다.

참고로 해당 포스팅은 Groovy 가 아닌 Kotlin Dsl 기준입니다.

TestScreen 추가

@Composable
fun TestScreen(){
    Text(text = "hello")
}

테스트용 스크린을 만들어 줍시다.

TestClass 추가

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [33], manifest = Config.NONE)
class MyTest {
    @get:Rule
    val composeRule = createComposeRule()

    @Before
    fun setUp() {
        composeRule.setContent {
            TestScreen()
        }
    }

    @Test
    fun `테스트`(){
        composeRule.onNodeWithText("hello").assertIsDisplayed()
    }
}

compose의 테스트 방법은 이전 포스팅을 참고해주세요!

@RunWith(RobolectricTestRunner::class) 를 통해서 robolectric 테스트 한다는 것을 명시해줍니다.

@Config(sdk = [33], manifest = Config.NONE)
sdk 는 33 매니페스트는 필요없다고 명시해줍니다.

현재 robolectric 4.9 기준으로 최대 api 33 까지 지원이 됩니다.

제가 만든 프로젝트는 api 34 기준이라 명시를 안해주면 에러나더군요...

테스트는 뻔하겠지만 pass입니다.

하고 싶은 말

안드로이드 프레임워크를 unit test에서 호출 가능하게 해주는

robolectric 잘만 사용하면 에뮬레이터없이 jvm상에서 빠르게

테스트가 가능하니 필요한 경우에 적극 활용하도록 합시다!

참조

https://meetup.nhncloud.com/posts/187
https://readystory.tistory.com/159
https://medium.com/@sebaslogen/blazing-fast-compose-tests-with-robolectric-b059f5471495

profile
열정은 내 삶의 방식, 꾸준함은 내 삶의 증명

0개의 댓글