반응형

안드로이드 에뮬레이터나 디바이스에서 테스트를 동작시키는 것은 느립니다.
빌드-배포-실행 등 매번 테스트할 때마다 몇 분 이상씩 소요가 되는 것은 TDD 를 시도하지 못하게 합니다.

 

Robolectric

Robolectric 은 안드로이드에 빠르고 신뢰성 높은 유닛 테스트를 지원해주는 테스트 프레임워크 입니다.

테스트는 수 초 내로 JVM 위에서 동작합니다.

 

간단한 예를 들면 아래와 같습니다.

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

  @Test
  public void clickingButton_shouldChangeMessage() {
    MyActivity activity = Robolectric.setupActivity(MyActivity.class);

    activity.button.performClick();

    assertThat(activity.message.getText()).isEqualTo("Robolectric Rocks!");
  }
}

보시다시피 Espresso 에서만 지원할 것 같던 액티비티와 뷰에 대한 접근을 제공합니다. 또한 performClick() 과 같이 액션을 취하는 것도, assertThat() 으로 검증하는 것도 지원합니다.

 

또한 src/androidTest/java/패키지명 에 테스트가 위치하는 것이 아닌, 유닛 테스트와 마찬가지로 src/test/java/패키지명 에 테스트를 작성합니다.

 

주요 특징

Test API & Isolation

전통적인 에뮬레이터 기반의 안드로이드 테스트와는 달리, Robolectric 테스트는 각 테스트마다 요구되는 안드로이드 환경을 갖춘 샌드박스 안에서 실행됩니다. 한 마디로 각 테스트는 모두 고립되어 있기 때문에 서로 영향을 미치지 않으면서 별도의 안드로이드 환경으로 테스트할 수 있습니다.

 

안드로이드의 대다수 기능이 Robolectric 테스트에서 잘 지원되지만, 하드웨어 센서나 시스템 서비스 등 일부 기능에 대해서는 한계를 나타냅니다.

 

Run Tests Outside of the Emulator

Robolectric 은 별도의 디바이스나 에뮬레이터가 아닌 내 Workstation 의 JVM 에서 동작합니다. 그렇기 때문에 dexing, packaging, installing 등의 과정이 필요하지 않아 몇 분 이상 걸릴 작업들을 초 단위로 감소시켜 주어 빠르게 리팩토링 하면서 테스트할 수 있습니다.

 

SDK, Resources, Native Method Simulation

Robolectric 은 inflation of views, resource loading, 안드로이드 디바이스 위에 native C 코드로 구현된 다양한 것들을 다룹니다. 이는 실제 디바이스에서 동작하는 거의 모든 것들을 테스트할 수 있음을 의미합니다.

 

No Mocking Frameworks Required

물론 Mockito 와 같은 mock framework 를 사용하여 Android SDK 를 mocking 하는 방식으로 테스트할 수도 있습니다만, 이렇게 될 경우 처리 해주어야 하는 테스트 코드의 양이 현저히 늘어나게 됩니다.

 

Robolectric블랙 박스 테스팅에 가까운 테스트 스타일을 지원합니다. 이는 테스트를 리팩토링하기에 더 효율적으로 만들어주며 테스트가 안드로이드에 대한 구현은 신경쓰지 않고 오직 어플리케이션의 행동에 집중할 수 있도록 해줍니다. 그리고 경우에 따라서는 Robolectric 과 mock framework 를 함께 사용할 수 있습니다.

 

 

반응형
반응형