본문 바로가기

안드로이드

Android Espresso #1 - 시작

반응형

Espresso?

간단하게 설명하면 안드로이드 UI 테스트를 위한 라이브러리이다.
간결한 코드로 화면 정보에 대한 어셜션을 진행할 수 있고,

테스트에 집중 할 수 있도록 백그라운드 실행에 대한 동기화는 에스프레소가 처리해준다.

※ 아래 과정을 진행하기 전에 Settings > Developer options으로 가서 애니메이션 관련 기능을 다 끄는 걸 권장합니다.
( 애니메이션이 도는 사이에 UI 테스트가 진행되어 원치 않은 결과가 나올 수 있습니다. )

시작하기

android {
      ...

    defaultConfig {
          ...

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 이미 있음
    }
}

dependencies {
    ...

    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' // 이미 있음
}

AndroidJUnitRunner, espresso-core:3.2.0 는 프로젝트를 새로 만들면 기본으로 있을 것이다.

기본 예시

@RunWith(AndroidJUnit4::class)
@LargeTest
class HelloWorldEspressoTest {

    @get:Rule // 테스트할 액티비티 지정
    val activityRule = ActivityTestRule(MainActivity::class.java)

    @Test
    fun buttonClickAndCheckText() {
        onView(withId(R.id.button))           //테스트할 뷰 찾기
            .check(matches(isDisplayed()))    //조건 만족 여부 파악
            .perform(click())                 //동작 지시

        onView(withText("Welcome"))           //테스트할 뷰 찾기
            .check(matches(isDisplayed()))    //조건 만족 여부 파악
    }
}

UI 테스트를 위한 찾고, 비교하고, 동작시키는 기본적인 코드이다.

 

위의 예제는 button을 누르면 textview의 텍스트가 "Welcome"으로 바뀌는 MainActivity을 테스트한 것이다.

 

1.onView(withId(R.id.button)) 에서 id 가 button 인 뷰를 화면에서 찾는다.
2.check(matches(isDisplayed())) 찾은 뷰가 화면에 보이고 있는지 비교한다.
3.perform(click()) 버튼을 클릭한다.
4.onView(withText("Welcome")) "Welcome" 이란 텍스트를 가진 뷰를 찾는다.
5.check(matches(isDisplayed())) 찾은 뷰가 화면에 보이고 있는지 비교한다.

 

과정을 통해서 테스트를 통과하게 된다.

onView, check, perform

에스프레소에서 사용하는 기본 함수들로,
각각 찾고, 비교하고, 동작시키는 동작에 사용한다.

뷰 찾기

onView(withId(R.id.text))
onView(withText("Hello World"))
onView(allOf(withId(R.id.text), not(withText("Hello World"))))

onView, onData 에 뒤에 나올 ViewMatcher를 인자로 넘기는 것으로 뷰를 찾을 수 있다.

 

왜 두개냐? 기본적으로 onView를 사용하지만, AdapterView를 대상으로 할 시 onData를 사용하여야 제대로 된 결과를 얻을 수 있다.

 

뷰를 찾을 때는 구글이 제시한 주의사항 몇가지가 있다.
첫째, 최소한의 ViewMatcher 만을 사용하여 뷰를 찾을 것
둘째, 접근성 관련 정보 ( text, description )로 뷰를 특정할 수 없다면, 접근성을 수정하는 방향으로 해결할 것

뷰 비교

onView(withId(R.id.text))
    .check(matches(isDisplayed()))
    .check(matches(withText("Welcome")))
    .check(matches(allOf(isDisplayed(),withText("Welcome"))))

 

뷰를 찾았으면 뷰의 상태를 확인해야 한다.

찾기만 할 경우 못찾아도 아무런 에러가 발생하지 않기에 '꼭' check 함수로 확인을 해주어야 한다.

 

check 에 matches(ViewMatcher)의 형태로 인자를 넘겨 뷰의 상태를 비교할 수 있다.

뷰에게 동작 시키기

onView(withId(R.id.button))
    .perform(click())
    .perform(click(), longClick())

perform 에 ViewAction을 인자로 넘겨 뷰에게 해당 동작을 실행시킬 수 있다.

여러 ViewAction를 넣어 순차적인 동작을 지시할 수 있다.

 

주의할 점은 해당 뷰가 할 수 있는 동작이 아닐 경우는 실행 시점에서 에러가 발생한다.
ex) TextView에게 타이핑 동작 지시할 경우 에러

#1 마무리

위에 내용으로 에스프레소의 메인 함수들에 대한 알아보았다.
에스프레소의 메인 함수들의 실행에 필요한 ViewMatcher, ViewAction, ViewAssertion 들에 대해선 #2에서 다루겠다.

반응형