4/18 수업

hyunji·2023년 4월 18일
0

모듈 분리 & UI 테스트

Why?

  • 신속한 피드백
  • 조기 장애 감지
  • 회귀 테스트 쉬워짐

안드로이드에서 단위 테스트

  • 다 돌려서 테스트 하다보면 시간이 오래 걸림
  • 테스트 코드를 짜면 빠르고 확장성 Good, 하지만 제한적이고 실제 기기보다 확실 X

안드로이드에서 UI 테스트

  • 느리고 확장성 부족

  • 하지만 실제 안드로이드 기기 동작에 충실

  • 테스트 코드를 자동화하자!!!!!!!!!!

테스트 코드 자동화

  • WHY?
    - 안드로이드 앱은 다양한 API 및 기기에서 동작
    - 사용자의 설정 값에 따른 영향을 받음
    - 언어와 가로/세로 방향에 따른 검증도 필요
    - 태블릿, 폴더블 기기에서 확인 필요

domain 모듈 분리

  • Project에서 모듈 추가해서 domain추가
  • 해당 scr에서 우클릭 후 디렉토리 추가해서 test/java 추가
  • dependencies에 implementation project("domain")
  • 장점
    - 모듈 분리 시 종속성이 없어 빠르게 테스트 가능
    • 재사용성이 떨어질 수 있는 상황 예방
  • 모듈이 하나만 있는 프로젝트와 모듈이 두개가 있는 프로젝트의 빌드 속도는 다를 수 있다

Espresso 사용

  • UI 테스트에서 사용

  • 간단한 구문을 사용해 테스트 코드 작성 가능

  • 경로 : app-module/src/androidTest/java/

  • 예시

@get:Rule
val activityRule = ActivitySenarioRule(MainActivity::class.java)

@Test
fun 텍스트뷰(){
	onView(withId(R.id.text_view))
    	.check(matches(withText("Hello World")))
}

@Test
fun 버튼(){
	onView(withId(R.id.button))
    	.perform(click())
    
    onView(withId(R.id.text_view))
    	.check(matches(withText("Hi")))
}

@Test
fun 스크롤시_버튼_보이기(){
	onView(withId(R.id.scroll_view))
    	.perform(swipeUp())
    onView(withId(R.id.button))
    	.check(matches(isDisplayed()))
}
  • Toast는 ui 테스트 할 수 없다
  • espresso 자체가 모든 것을 테스트해주는 것은 아니다.
  • 왠만하면 많은 케이스에 다 쓸 수 있지만 특수한 상황일 경우 개발자가 직접 핸들링해야한다.
  • 화면에 보이지 않으면 해당 뷰를 찾을 수 없다
  • 복잡해지는 테스트는 각자 알아서 생각해서 짜라!!!!!!!!!!

Robolectric 사용 테스트

@RunWith(RobolectricTestRunner::class)
internal class MainActivityTest {
    @Test
    fun `사용자가 버튼을 한 번 누르면 Hello World가 표시된다`() {
        val activityController = Robolectric.buildActivity(MainActivity::class.java)

        activityController.use { controller ->
            controller.setup()
            //controller.create()  //이것만 해도 테스트 통과 가능
            //controller.start()
            //controller.resume()
         
            val activity: MainActivity = controller.get()

            // when
            activity.findViewById<Button>(R.id.button).performClick()

            // then
            val actual = activity.findViewById<TextView>(R.id.text_view).text.toString()
            assertThat(actual).isEqualTo("Hi")
        }
    }
}
  • espresso가 있는 상황에서는 굳이 쓸 필요는 X
  • 하지만 알아두면 좋다
  • JVM 쓰니까 빠르긴 함(화면 전환이 없어서)

  • 에스프레스 레코더 : 유용하게 사용 가능. 물론 TDD는 아니다.

0개의 댓글