Robolectric의 테스트 케이스 구조를 어떻게 설정하나요?
_____A1: Robolectric 테스트는 일반적으로 JUnit4 스타일로 작성하며, `@RunWith(RobolectricTestRunner.class)` 어노테이션을 클래스 상단에 붙여 실행합니다. 테스트 클래스는 보통 Android 컴포넌트(Activity, Fragment 등)를 생성 및 조작하여 원하는 동작을 검증합니다.
```java
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
private MyActivity activity;
@Before
public void setUp() {
activity = Robolectric.buildActivity(MyActivity.class).create().start().resume().get();
}
@Test
public void testButtonClick_shouldChangeText() {
Button button = activity.findViewById(R.id.my_button);
TextView textView = activity.findViewById(R.id.my_textview);
button.performClick();
assertEquals("Button Clicked", textView.getText().toString());
}
}
```
---
Q2: Robolectric 테스트 클래스에 꼭 들어가야 하는 어노테이션은 무엇인가요?
A2:
- `@RunWith(RobolectricTestRunner.class)` : Robolectric 테스트 환경에서 실행하기 위해 필수입니다.
- 필요에 따라 `@Config` 어노테이션으로 SDK 버전, Application 클래스, shadows 등 런타임 설정을 세부 지정할 수 있습니다.
---
Q3: Activity 초기화를 어떻게 하나요?
A3: `Robolectric.buildActivity(MyActivity.class).create().start().resume().get()` 메서드 체인을 사용하여 Activity 라이프사이클을 원하는 상태까지 실행한 뒤 인스턴스를 얻습니다.
---
Q4: Fragment 테스트 케이스는 어떻게 구조화하나요?
A4: Robolectric에서는 테스트용 Activity를 생성한 후, 해당 Activity에 Fragment를 붙여 테스트합니다.
```java
@RunWith(RobolectricTestRunner.class)
private FragmentActivity activity;
private MyFragment fragment;
@Before
public void setUp() {
activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment = new MyFragment();
activity.getSupportFragmentManager()
.beginTransaction()
.add(fragment, null)
.commitNow();
}
@Test
public void testFragmentBehavior() {
// Fragment 내 뷰, 로직 테스트
}
}
```
---
Q5: 테스트 중 Android 리소스 참조는 어떻게 하나요?
A5: Robolectric은 기본적으로 앱의 리소스를 사용할 수 있으므로, `R.id`, `R.layout` 등의 리소스 참조를 그대로 사용하면 됩니다. 단, `@Config` 어노테이션으로 리소스 경로를 정확히 지정해야 할 수도 있습니다.
---
Q6: Application 클래스 커스터마이징이 필요한 경우 어떻게 하나요?
A6: `@Config(application = MyTestApplication.class)` 어노테이션을 사용해 테스트 시 사용될 Application 클래스를 지정할 수 있습니다. 이는 테스트용 DI 설정, 목 객체 초기화 등에 유용합니다.
---
Q7: Robolectric 테스트 코드의 기본적인 폴더 위치는 어디가 좋나요?
A7: 일반적으로 Android 프로젝트에서 `src/test/java` 디렉토리 내에 패키지 구조를 맞춰서 작성합니다. Robolectric은 로컬 JVM 테스트이므로 Instrumented Test(`src/androidTest/java`)가 아닙니다.
---
요약:
- 테스트 클래스에 `@RunWith(RobolectricTestRunner.class)`를 붙인다.
- `@Before` 메서드에서 Activity/Fragment 라이프사이클을 초기화한다.
- 실제 뷰와 메서드를 호출해 결과를 검증한다.
- 필요 시 `@Config`로 환경설정을 맞춘다.
이 구조를 따르면 Robolectric으로 Android 컴포넌트의 동작을 JVM 환경에서 효과적으로 테스트할 수 있습니다.
Robolectric은 안드로이드 프레임워크를 JVM 환경에서 흉내 내어, 실제 디바이스 없이도 빠르고 안정적으로 안드로이드 코드를 테스트할 수 있게 해줍니다.
테스트 케이스를 작성할 때는 다음과 같은 구조와 패턴을 따르는 것이 일반적입니다.
1. 테스트 클래스 선언 테스트하려는 컴포넌트(예: 액티비티, 프래그먼트, 서비스 등)마다 별도의 테스트 클래스를 만듭니다.
테스트 클래스는 일반적으로 JUnit 4 기준으로 작성하며, `@RunWith(RobolectricTestRunner.class)` 어노테이션을 붙여 Robolectric 환경에서 실행되도록 지정합니다.
```java @RunWith(RobolectricTestRunner.class) public class MainActivityTest { // 테스트 메서드 및 준비 작업 위치 } ```
2. setUp 메서드 작성 (선택 사항) 테스트 전 각 테스트 메서드가 실행되기 전에 초기화 작업이 필요하면 `@Before` 어노테이션을 붙인 초기화 메서드를 작성합니다.
여기서 테스트할 액티비티 인스턴스 생성, 의존 객체 초기화 등을 합니다.
```java private MainActivity activity; @Before public void setUp() { activity = Robolectric.buildActivity(MainActivity.class) .create() .start() .resume() .get(); } ``` Robolectric의 `buildActivity()`를 사용해서 액티비티 라이프사이클을 원하는 단계까지 강제로 진행시켜 초기 상태를 준비합니다.
3. 테스트 메서드 작성 `@Test` 어노테이션을 붙여 실제 테스트할 메서드를 만듭니다.
각 테스트 메서드는 하나의 기능 또는 시나리오를 검증하는 역할을 합니다.
```java @Test public void clickingButton_shouldChangeText() { Button button = activity.findViewById(R.id.my_button); button.performClick(); TextView textView = activity.findViewById(R.id.my_textview); assertEquals("Button clicked", textView.getText().toString()); } ``` - 테스트 메서드에서 뷰를 찾아서 이벤트를 트리거하거나, 메서드를 호출하고 결과를 검증합니다.
- Robolectric으로 인해 안드로이드 위젯 및 컴포넌트가 JVM상에서 동작하므로, UI 조작도 가능하지만 복잡한 애니메이션이나 특정 디바이스 의존 기능에 대해서는 제한이 있을 수 있습니다.
4. 빌드 설정 프로젝트의 build.gradle 파일에 Robolectric 의존성 및 테스트 관련 설정이 필요합니다.
대개 테스트 소스셋(`src/test/java`)에 테스트 코드를 두고, 안드로이드 스튜디오나 Gradle 명령어로 일반 JUnit 테스트처럼 실행합니다.
예: ```gradle dependencies { testImplementation 'org.robolectric:robolectric:4.9' testImplementation 'junit:junit:4.13.2' // 필요하면 Mockito, Truth 등 추가 } ```
5. 추가 팁 - 단위 테스트와 혼동하지 않도록, Robolectric은 JVM 단위테스트면서도 안드로이드 컴포넌트를 상당 부분 흉내 내므로, 의존성 주입(DI)을 활용하면 더욱 유연한 테스트가 가능합니다.
- `RuntimeEnvironment` 또는 `ApplicationProvider.getApplicationContext()`를 통해 테스트 중 Context 참조를 얻을 수 있습니다.
- 액티비티가 아닌 서비스, 리시버, 프래그먼트 등도 `build...` 메서드 등으로 생성하여 테스트할 수 있습니다.
- 테스트 격리성을 유지하기 위해 매 테스트마다 새롭게 상태를 초기화 하는 것을 권장합니다.
--- Robolectric 테스트 케이스는 다음과 같은 구조를 따릅니다.
- `@RunWith(RobolectricTestRunner.class)`로 테스트 러너 지정 - 테스트 대상 액티비티 등 컴포넌트 인스턴스 생성 및 라이프사이클 진행 (`buildActivity()`) - 필요한 경우 `@Before`에서 초기화 - `@Test` 메서드에서 UI 조작과 상태 검증 실행 - Gradle에 Robolectric 의존성 추가 이런 기본 틀 내에서 원하는 기능을 검증하는 테스트 메서드를 여러 개 작성하여, 실제 안드로이드 환경과 유사한 조건에서 신속하게 단위테스트를 수행할 수 있습니다.
작성자:
정수아 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:47
조회수: 132 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 132 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.