안드로이드 에스프레소 사용법 - andeuloideu eseupeuleso sayongbeob

TDD를 안드로이드에서 적용할 방안이 없을까 생각해보았다.

JUnit은 일반적으로 예상한 값과 실제값을 비교하여 테스트에 통과했는지를 비교하는 방식으로 이루어진다.

그런데 이러한 JUnit을 안드로이드에서 바로 사용하기에는 실제 동작이 주로 UI에서 이루어지기에 적용하기는 어려워 보였다.

그러나 역시 이러한 TDD 방식을 안드로이드 환경에서도 할 수 있게끔

UI 테스트를 지원해주는 에스프레소라는 프레임워크를 알게 되었다.

//developer.android.com/training/testing/ui-testing/espresso-testing?hl=ko

해외에서도 국내에서도 UI 테스트에서 많이 쓰이는 지 안드로이드 개발자 문서에서도 이에 관한 내용을 찾아볼 수 있다.

에스프레소를 사용하려면 우선 기초적인 설정을 해줘야 한다.

안드로이드 스튜디오의 [Gradle Script]-[build.gradle]로 가서, 

android { defaultConfig { .. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" .. } } dependencies { ... testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'com.android.support.test:rules:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2' ... }

해당 설정을 추가해준다.

안드로이드 프로젝트를 만들고 나면, 원래 있던 패키지와는 별도로, 두 개의 폴더가 더 생기는데,

위에 보이는 것이 UI 테스트용 폴더이고, 아랫쪽 폴더가 단위 테스트용 폴더이다.

이번에 해 볼 것은 UI 테스트이므로, 위 쪽 폴더에 테스트를 생성하도록 한다.

소스 코드 패키지와 동일한 패키지를 만들고, 해당 패키지 내의 액티비티를 테스트하는 클래스를 만들었다.

package com.lilac.lilacstory.Writing; import androidx.test.espresso.Espresso; import androidx.test.espresso.action.ViewActions; import androidx.test.espresso.assertion.ViewAssertions; import androidx.test.espresso.matcher.ViewMatchers; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; import com.lilac.lilacstory.R; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class WritingActivityTest { private String stringTobeTyped=""; @Rule public ActivityTestRule<WritingActivity> activityTestRule = new ActivityTestRule<>(WritingActivity.class); @Before public void initValidString() { stringTobeTyped="Hello"; } @Test public void changeText() { Espresso.onView(ViewMatchers.withId(R.id.edt_writing)) .perform(ViewActions.typeText(stringTobeTyped),ViewActions.closeSoftKeyboard()); Espresso.onView(ViewMatchers.withId(R.id.edt_writing)) .check(ViewAssertions.matches(ViewMatchers.withText(stringTobeTyped))); } }

내가 연습용으로 작성한 테스트 코드이다.

테스트 코드 작성을 시작하기에 앞서, 이에 사용되는 기본적인 애노테이션들에 대해 알아둘 필요가 있다.

@Rule

-현재 테스트 클래스에서 사용할 TestRule에 대하여 정의하는 애노테이션.

  에스프레소에서 제공하는 TestRule에는 ActivityTestRule이 있고 ServiceTestRule이 있다.

@Before

-테스트가 시작되기 전에 자동으로 실행되는 메소드임을 표시하는 애노테이션이다.

  테스트 시작 전 변수를 초기화하는 등 준비 작업에 주로 사용된다.

  위 소스 코드의 경우 EditText에 넣을 텍스트를 초기화하는데에 사용되었다.

@Test

 -Before가 완료되면 진행될 실제 테스트를 표시

@After

-@Test가 완료되고 난 후에 실행될 메소드들, 주로 메모리를 해제하는 데에 사용된다고 한다.

@Test 애노테이션으로 표시된 테스트 메소드에 실제로 어떤 방식으로 테스트가 진행할 것인지 정의해주어야 한다.

테스트 상에서 동작할 뷰에 먼저 접근해야 한다.

Espresso.onView() 메소드에 뷰 매처로 지정된 UI 컴포넌트를 넣어 접근할 수 있다.

Viewmatchers.withId()라는 메서드에 뷰 id를 넣어줌으로서 간단히 접근할 수 있다.

ex)

Espresso.onView(ViewMatchers.withId(R.id.edt_writing)) .perform(ViewActions...);

그리고 perform() 메소드로 다음에 수행될 동작들을 정의해줄 수 있다.

한 번에 여러 개의 명령을 순차로 수행할 수 있으며, 동작들에는 다음과 같은 것들이 있다.

ViewActions.click(): 뷰를 클릭한다.

ViewActions.typeText():뷰에 텍스트를 입력한다.

ViewActions.scrollTo():뷰로 스크롤한다.

ViewActions.pressKey():뷰에 키보드 키를 누른다.

ViewActions.clearText():뷰의 텍스트를 모두 지운다.

일반적으로 자주 이용되는 메소드는 click()과 typeText()이니, 이 둘만 알아두어도 테스트를 시작하는데에는 무난한 듯 하다.

이런 방식으로 동작을 실행한 뒤, 이제 수행된 동작이 의도된 대로 잘 작동하였는지 확인하는 작업이 있어야 한다.

이번에도 마찬가지로 onView를 이용하여 뷰에 접근한 뒤 , perform()메소드 대신에 .check() 메소드를 이용하여 체크를 진행한다.

perform() 메소드에는 의도한 값과 실제 값이 일치하는 지 확인하는 ViewAssertions의 결과를 인수로 넣어야 한다.

ViewAssertions에서 제공하는 메소드는 다음과 같다.

doesNotExist():지정된 기준과 일치하는 뷰가 없는지 확인

matches():인수로 제공된 Viewmatcher가 지정된 기준과 일치하는 지 확인

selectedDescendentMatch(): 상위 뷰에 지정된 하위 뷰가 있고 하위 뷰의 상태가 주어진 Hamcrest 매처와 일치하는지 확인

ex)

Espresso.onView(ViewMatchers.withId(R.id.edt_writing)) .check(ViewAssertions.matches(ViewMatchers.withText("Hello World!")));

위 코드는 edt_writng이라는 edt_text의 텍스트가  Hello World라는 텍스트와 일치하는 지 결과를 확인한다.

이러한 방식으로 테스트 코드를 작성한 뒤,테스트를 실행해보려면,

해당 클래스를 우클릭하여 Run ...을 누르면 된다.

녹색이 보이면 테스트 성공.

마무리 하며

이것으로 안드로이드 테스트 도구인 에스프레소에 대하여 알아보았다.

이를 통해 TDD를 안드로이드에 직접 적용해보길 바란다.

참고 및 이미지 출처

//developer.android.com/training/testing/ui-testing/espresso-testing?hl=ko

단일 앱의 UI 테스트  |  Android 개발자  |  Android Developers

단일 앱 내에서 사용자 상호작용을 테스트하면 사용자가 앱과 상호작용할 때 예상치 못한 결과가 발생하거나 불만족스러운 경험을 하지 않도록 할 수 있습니다. 앱의 사용자 인터페이스(UI)가

developer.android.com

//black-jin0427.tistory.com/111

[Android, Espresso] Ui Test using Espresso

안녕하세요. 블랙진입니다. 안드로이드 테스트에 관한 포스팅을 진행하고 있습니다. 아래는 이전 포스팅 내용입니다. UnitTest, UiTest 기본 예제 UnitTest using mockito 이번 시간에는 Ui 테스트를 할 수

black-jin0427.tistory.com

//thdev.tech/androiddev/2016/05/04/Android-Test-Example/

Toplist

최신 우편물

태그