JY-Dev Tech Blog

Android(안드로이드) - Espresso 본문

안드로이드/테스트코드

Android(안드로이드) - Espresso

JY-Dev 2020. 10. 28. 17:23

[OverView]

Espresso에 대해 간략하게 정리하겠습니다.

 

[Espresso]

Espresso API는 테스트 작성자에게 사용자가 (UI요소들을 위치에 두고 그들과 상호 작용하는) 어플리케이션과 상호 작용하는 동안 무엇을 할 것인지의 관점으로 생각하는 것을 도와줍니다. 동시에 이 프레임워크는 어플리케이션의 Activity들과 View들에 직접 접근하는 것을 막습니다. 왜냐하면 이 객체들을 잡고 UI 스레드에서 시작된 이것들에 작업을 하는 것이 비정상적인 테스트의 주된 원인이기 때문입니다. 그러므로, Espresso API에서 getView나 getCurrentActivity같은 메소드들을 볼 수 없을 것입니다. 하지만 여전히 ViewAction들과 ViewAssertions들을 구현함을 통해 View에서 안전하게 작업을 할 수 있습니다.

 

[Espresso의 주요 구성 요소]

  • Espresso – View들과의 상호 작용을 할수있는(onView와 onData를 통해서). 또한 어떤 뷰와도 Binding 할 필요가 없는 APIs들을 노출합니다(pressBack).

  • ViewMatchers – Matcher<? super View> 인터페이스를 구현한 객체들의 모임. 현재 View 계층 내에 위치한 view의 위치를 찾기 위해 하나 또는 그 이상의 ViewMatchers를 onView 메소드에게 전달할 수 있습니다.

  • ViewActions – ViewInteraction.perform() 메소드에게 전달할 수 있는 ViewAction들의 모임 (예를 들어, click())

  • ViewAssertions – ViewInteraction.check() 메서드에 전달할 수 있는 ViewAssertion 객체의 컬렉션입니다. 대부분 뷰 매처를 사용하여 현재 선택된 뷰의 상태를 어설션하는 matches 어설션을 사용합니다.

 

Example: 간단한 버튼 클릭 테스트

@Rule
    @JvmField
    var mActivityTestRule = ActivityTestRule(MainActivity::class.java)

@Test
    fun useAppContext() {
        onView(withId(R.id.test_btn)).perform(click())
    }

 

[Onview() 와 Ondata()]

  • Onview() 는 기본적으로 UI 상에 보여지는 것에 대해 액세스 해서 View와 상호작용 할 수 있습니다.
  • Ondata() 는 예를들어 ListView에 여러 요소들이 있을 경우 화면에 보여지지 않은 데이터에 엑세스가 가능합니다.

ViewActions의 여러 메소드들은 아래링크에서 확인이 가능합니다.

https://developer.android.com/reference/android/support/test/espresso/action/ViewActions

 

ViewActions  |  Android 개발자  |  Android Developers

ViewActions This package is part of the Android support library which is no longer maintained. The support library has been superseded by AndroidX which is part of Jetpack. We recommend using the AndroidX libraries in all new projects. You should also cons

developer.android.com

 

 

[디버깅]

Espresso는 테스트 실패시 유용한 디버깅 정보를 제공한다.

[로깅]

Espresso는 logcat에 모든 view 행위들을 로그를 남긴다.

 

[View hierarchy]

Espresso는 onView()가 실패했을 때 예외 문구안에 view 계층을 출력합니다. * 만약 onView()가 타겟 view를 찾지 못하면, NoMatchingViewException가 던져집니다. 왜 matcher가 어떤 view들과도 일치하지 않았는지 분석하기 위해 예외 스트링에서 view 계층을 조사할 수 있습니다. * 만약 onView()가 주어진 matcher와 일치하는 view을 여러개 찾으면, AmbiguousViewMatcherException이 발생합니다. View 계층이 출력되고 일치하는 모든 뷰들은 MATCHES 라벨로 마크될 것입니다.

java.lang.RuntimeException: com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: This matcher matches multiple views in the hierarchy: (withId: is <123456789>) … +----->SomeView{id=123456789, res-name=plus_one_standard_ann_button, visibility=VISIBLE, width=523, height=48, has-focus=false, has-focusable=true, window-focus=true, is-focused=false, is-focusable=false, enabled=true, selected=false, is-layout-requested=false, text=, root-is-layout-requested=false, x=0.0, y=625.0, child-count=1} ****MATCHES**** | +------>OtherView{id=123456789, res-name=plus_one_standard_ann_button, visibility=VISIBLE, width=523, height=48, has-focus=false, has-focusable=true, window-focus=true, is-focused=false, is-focusable=true, enabled=true, selected=false, is-layout-requested=false, text=Hello!, root-is-layout-requested=false, x=0.0, y=0.0, child-count=1} ****MATCHES**** When dealing with a complicated view hierarchy or unexpected behavior of widgets it is always helpful to use the Android View Hierarchy Viewer for an explanation.

[AdapterView warnings]

Espresso는 사용자에게 AdapterView 위젯들이 존재함을 경고합니다. 만약 onView() 작업이 NoMatchingViewException을 던지고 AdapterView 위젯들이 view 계층에 존재한다면, 가장 흔한 해결책은 onData()를 사용하는 것입니다. 예외 메시지는 adapter view들의 목록을 가진 경고를 포함할 것입니다. 당신은 타겟 view를 로드하기 위해 onData를 부르는데 이 정보를 이용할 것 입니다.

'안드로이드 > 테스트코드' 카테고리의 다른 글

Android(안드로이드) - What is Appium?  (0) 2020.10.29
Android(안드로이드) - Junit Annotaion (어노테이션)  (0) 2020.10.28
ANDROID TDD  (0) 2020.10.27
Mock 객체  (0) 2020.10.27
Comments