Robolectric에서 Fragment 테스트를 수행하는 방법은 무엇인가요?
_____네, Robolectric은 안드로이드 프레임워크를 에뮬레이트하여 JVM 환경에서 Fragment를 포함한 UI 컴포넌트 테스트를 가능하게 합니다.
---
Q2: Robolectric에서 Fragment 테스트를 위한 기본 설정은 어떻게 하나요?
1. `build.gradle`에 Robolectric 의존성을 추가합니다.
```groovy
testImplementation "org.robolectric:robolectric:<버전>"
```
2. 테스트 클래스에 `@RunWith(RobolectricTestRunner.class)` 어노테이션을 붙입니다.
3. 필요한 경우 `@Config`로 SDK 버전 등을 지정합니다.
---
Q3: Fragment를 단독으로 테스트하려면 어떻게 해야 하나요?
Fragment는 액티비티에 붙여야 하므로, 보통은 `FragmentScenario`를 쓰거나, 테스트용 액티비티를 만들어서 Fragment를 넣어 테스트합니다. Robolectric에서는 `FragmentTestUtil`이나 `FragmentManager`를 이용해 액티비티 없이 Fragment를 시작할 수 있습니다.
---
Q4: Fragment를 액티비티에 붙여 테스트하는 예시는?
```java
@RunWith(RobolectricTestRunner.class)
public class MyFragmentTest {
@Test
public void testFragmentView() {
// 액티비티 생성
FragmentActivity activity = Robolectric.buildActivity(FragmentActivity.class)
.create()
.start()
.resume()
.get();
// 테스트할 Fragment 인스턴스 생성
MyFragment fragment = new MyFragment();
// FragmentManager를 이용해 Fragment를 액티비티에 붙임
activity.getSupportFragmentManager()
.beginTransaction()
.add(fragment, null)
.commitNow();
// Fragment 뷰가 null이 아니면 성공
assertNotNull(fragment.getView());
TextView textView = fragment.getView().findViewById(R.id.my_text_view);
assertEquals("Expected Text", textView.getText().toString());
}
}
```
---
Q5: `FragmentScenario`를 Robolectric에서 사용할 수 있나요?
네, `FragmentScenario`는 AndroidX 테스트 라이브러리의 일부로 Robolectric과도 호환됩니다. 다음과 같이 사용 가능합니다.
```java
@Test
public void testWithFragmentScenario() {
FragmentScenario
scenario.onFragment(fragment -> {
// Fragment 내부 코드 실행, UI 검사 가능
TextView textView = fragment.getView().findViewById(R.id.my_text_view);
assertEquals("Expected Text", textView.getText().toString());
});
}
```
단, `FragmentScenario` 사용 시에는 `androidx.fragment:fragment-testing` 의존성을 추가해야 하며, Robolectric과 충돌 없도록 버전을 맞춰야 합니다.
---
Q6: Robolectric에서 Fragment 트랜잭션을 동기적으로 바로 실행하려면?
`commit()` 대신 `commitNow()` 또는 `commitNowAllowingStateLoss()`를 사용하면 트랜잭션이 즉시 실행되어 테스트가 간편해집니다.
---
Q7: Fragment의 라이프사이클을 시뮬레이션해서 테스트할 수 있나요?
네, Robolectric과 `FragmentScenario` 모두 Fragment의 `onCreate()`, `onStart()`, `onResume()` 등 라이프사이클 단계들을 시뮬레이트 하여 해당 시점의 상태를 검증할 수 있습니다.
---
Q8: Robolectric에서 Fragment 테스트 시 주의할 점은?
- 실제 디바이스가 아니므로 일부 UI 동작(애니메이션, 복잡한 입력) 테스트에 한계가 있습니다.
- AndroidX 라이브러리와 호환성을 주의해야 하며, `FragmentScenario` 사용 시에도 Robolectric 버전과 라이브러리 버전을 맞추는 것이 중요합니다.
- 필수 의존성 및 빌드 설정이 필요합니다.
---
요약:
Robolectric에서 Fragment 테스트는 테스트용 액티비티에 Fragment를 붙여 관리하거나, `FragmentScenario`를 사용하여 간편하게 수행할 수 있습니다. Fragment 트랜잭션은 `commitNow()`로 동기 처리하며, 라이프사이클 메서드를 호출해 상태를 검증할 수 있습니다. 이를 통해 안드로이드 장치 없이도 JVM 환경에서 Fragment UI 및 로직 테스트가 가능합니다.
하나는 `FragmentScenario`를 사용하는 방식이고, 다른 하나는 직접 `Fragment`를 `FragmentManager`를 통해 수동으로 추가하여 테스트하는 방식입니다.
Robolectric은 실제 기기나 에뮬레이터 없이 JVM 환경에서 Android 컴포넌트를 실행 가능하게 해주므로 빠르고 안정적인 단위 테스트가 가능합니다.
아래는 Robolectric 환경에서 Fragment 테스트를 수행하는 일반적인 절차와 방법, 주의사항을 단계별로 자세히 설명한 내용입니다.
1. Robolectric 테스트 환경 설정 먼저 `build.gradle` 파일에 Robolectric 의존성을 추가합니다.
```gradle testImplementation "org.robolectric:robolectric:4.9" // 최신 버전으로 맞춰서 사용 testImplementation 'androidx.test:core:1.5.0' // AndroidX 테스트 코어 라이브러리(필요시) ``` 그리고 테스트 클래스는 `@RunWith(RobolectricTestRunner.class)`를 선언합니다.
---
2. Fragment 테스트 일반 절차 Fragment는 액티비티에 붙어서 동작하는 컴포넌트이므로, Fragment 단독으로는 동작하지 않고 반드시 액티비티와 연계해서 테스트해야 합니다.
Robolectric은 가벼운 액티비티 생성과 UI 사이클 호출이 가능하므로 이를 이용합니다.
- 액티비티 인스턴스를 생성 - FragmentManager를 통해 Fragment를 추가 - Fragment 트랜잭션 커밋 및 실행 - 필요시 UI 상태나 뷰 요소 검증 ---
3. 샘플 코드 예시 다음은 Robolectric에서 Fragment를 테스트하는 기본적인 패턴입니다.
```java @RunWith(RobolectricTestRunner.class) public class MyFragmentTest { private Fragment fragment; @Before public void setUp() { // 1. 테스트에 사용할 Activity 생성 (AppCompatActivity 추천) AppCompatActivity activity = Robolectric.buildActivity(AppCompatActivity.class).setup().get(); //
2. Fragment 인스턴스 생성 fragment = new MyFragment(); //
3. FragmentManager로 Fragment 추가 및 커밋 activity.getSupportFragmentManager() .beginTransaction() .add(fragment, null) .commitNow(); // commitNow로 바로 트랜잭션 실행 // 이제 fragment는 액티비티에 붙어있고 라이프사이클도 onCreateView까지 호출된 상태 } @Test public void fragment_shouldNotBeNull() { assertNotNull(fragment); } @Test public void fragment_shouldHaveNonNullView() { // onCreateView에서 inflate한 뷰가 제대로 생성되었는지 확인 View view = fragment.getView(); assertNotNull(view); } @Test public void fragment_shouldHaveExpectedText() { // 예: fragment 레이아웃 내 텍스트뷰 확인 TextView tv = fragment.getView().findViewById(R.id.some_text_view); assertEquals("Hello, Robolectric!", tv.getText().toString()); } } ``` ---
4. FragmentScenario 활용 (AndroidX Test 라이브러리 설치 시) `FragmentScenario` 클래스는 Fragment를 독립적으로 테스트할 수 있도록 도와주며, 실제 기기나 에뮬레이터뿐 아니라 Robolectric 환경에서도 사용할 수 있습니다.
```java @RunWith(RobolectricTestRunner.class) public class MyFragmentScenarioTest { @Test public void testFragmentWithFragmentScenario() { FragmentScenario
---
5. 주요 포인트 및 팁 - commitNow() 사용 권장 : `commit()`은 비동기 실행이라 테스트 도중에 트랜잭션이 완료되지 않을 수 있습니다.
`commitNow()`를 사용하면 즉시 트랜잭션을 끝내 UI와 상태가 안정적입니다.
- Robolectric setup() 메서드 호출 : 액티비티 빌더의 `setup()` 호출로 `onCreate()`, `onStart()`, `onResume()` 라이프사이클이 실행됩니다.
- 프래그먼트 의존 컴포넌트 주입 테스트 : 경우에 따라 Dagger/Hilt 등의 DI를 사용하는 경우 Injector를 초기화해야 합니다.
- 레이아웃 없는 경우 : Fragment에 레이아웃 리소스가 없을 때는 뷰가 null일 수 있으니 null 체크 필요. - 실제 UI 동작과 차이 주의 : Robolectric은 UI 쓰레드에서 테스트하므로 실제 기기와 약간 동작 차이가 있을 수도 있습니다.
- View ID 찾기 : 뷰를 `findViewById()` 할 때 null 여부와 정확성을 항상 검증할 것. ---
6. 요약 - Robolectric 환경에서 Fragment를 테스트하려면 액티비티를 생성하고 FragmentManager를 통해 Fragment를 추가 후 즉시 커밋(commitNow)하는 방식이 기본. - 혹은 AndroidX `FragmentScenario`를 사용하면 편리하고 안정적으로 Fragment의 수명주기를 제어할 수 있음. - 각 테스트 메서드에서 fragment의 뷰 생성 여부, 뷰 요소 상태, 메서드 동작 결과 등을 검증 가능.
- 적절한 라이프사이클 진행과 commit 방식을 사용하여 안정적인 테스트 환경을 구성하는 것이 중요. 이를 통해 실제 기기 없이도 Fragment의 UI 및 로직 테스트를 효과적으로 수행할 수 있습니다.
작성자:
최윤하 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:10
조회수: 284 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 284 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.