Android UI Test(에스프레소)

Seok-woo Kim·2021년 6월 29일
0

안드로이드

목록 보기
5/9

1. 의존성 추가

    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.0'
    androidTestImplementation 'androidx.test:runner:1.1.0'
  • core의 경우 안드로이드 프로젝트 생성시 기본적으로 추가되어 있을것이다.
  • contrib의 경우는 RecyclerViewActions를 사용하기 위해 추가
  • intents의 경우는 startActivityForResult등을 테스트하기위해 IntentsTestRule를 사용하는 경우필요
  • rules는 @get: Rule 때문에 필요

2. 기본작성

    @RunWith(AndroidJUnit4::class)
    class HomeActivityTest {

        @get: Rule
        val homeActivityTest = ActivityTestRule(HomeActivity::class.java)

        @Test
        fun test() {
            Thread.sleep(1000)
        }

    }
  • 상호작용을 테스트하고 싶은 Activity를 ActivityTestRule로 인스턴스화 한다.
  • UnitTest와 마찬가지로 @Test 어노테이션을 통해 각 함수 단위로 UI 테스트를 진행한다.
  • ActivityTestRule로 정해놓은 액티비티가 @Test를 실행하기전 실행된다.
    @Test
    fun name_Validate_Test() {
        onView(withId(R.id.editName)).perform(typeText("Kim Seok-woo"))
        onView(withId(R.id.editName)).perform(clearText())
        onView(withId(R.id.nameValidation)).check(matches(isDisplayed()))
        Thread.sleep(1000)
    }
  • onView와 withId로 상호작용을 테스트하고 싶은 UI 개체를 찾고 perform으로 테스트하고싶은 행동을 설정한다.
  • EditText에서 typeText()로 텍스트를 입력할 수 있고, clearText()로 입력된 텍스트를 삭제할 수 있다.
  • matches()로 입력된 값이 동등한 지, UI가 visible 상태인지 enable 상태인지 등 체크할 수 있다.

3. onActivityResult 테스트

  • 액티비티의 onActivityResult를 테스트 하고 싶은 경우 ActivityTestRule대신 IntentsTestRule를 사용한다.
        @get: Rule
        val myIntentActivityTest = IntentsTestRule(MyIntentActivity::class.java)
  • 실제 setResult시 넘겨주는 Intent()를 만들어 준다.
        val resultData = Intent()
        val packageItem = PackageItem(
            name = "Kim", detail = "Bag", count = 3,
            company = "Com", phone = "01000000000", trackingNumber = "123456789"
        )
        resultData.putExtra("register", packageItem)
  • Result Code와 data(Intent) 및 startActivityForResult를 위한 Context 설정
	// Result Code와 Intent Setup
        val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
        
        // startActivityForResult를 사용하기 위한 Context
        val context = InstrumentationRegistry.getInstrumentation().context
  • 응답을 받을 액티비티 클래스와 code와 data를 정의한 result객체를 intending메서드를 통해 정의한다.
	intending(hasComponent(MyIntentActivity::class.java.name)).respondWith(result)
  • setResult를 실행하는 액티비티를 startActivityForResult로 실행
	myIntentActivityTest.activity.startActivityForResult(Intent(context, MyIntentNextActivity::class.java), REQUEST_CODE)

4. 주의사항

espresso 패키지에서 제공하는 메서드들이 Test Class 작성시 자동 import되지 않는 경우가 상당히 많아서, 공식사이트나 블로그에서 테스트 코드를 가져와서 써도 빨간색으로 경고가 뜬다. 그래서 수동으로 import해야하는 경우가 많은데 상당히 골치 아프다.

profile
안드로이드 개발자 (6년 ~ )

0개의 댓글