Robolectric을 사용하여 로그인을 테스트하는 방법은 무엇인가요?
_____네, Robolectric은 안드로이드 코드를 JVM 환경에서 실행할 수 있게 해주므로 로그인 화면(Activity 또는 Fragment)의 UI 동작과 비즈니스 로직을 단위 테스트 형태로 검증할 수 있습니다.
Q2: Robolectric 로그인 테스트의 기본적인 흐름은 어떻게 되나요?
1. 테스트하려는 로그인 Activity 또는 Fragment를 Robolectric으로 실행합니다.
2. 테스트 코드에서 이메일, 비밀번호 입력 EditText에 값을 세팅합니다.
3. 로그인 버튼 클릭 이벤트를 호출합니다.
4. 로그인 결과에 따른 UI 변화나 로직 호출을 검증합니다.
Q3: 로그인 버튼 클릭은 어떻게 시뮬레이션 하나요?
```java
// 예: Button loginButton = activity.findViewById(R.id.login_button);
loginButton.performClick();
```
Q4: 입력 필드에 텍스트를 넣는 방법은?
```java
EditText emailInput = activity.findViewById(R.id.edittext_email);
emailInput.setText("[email protected]");
```
Q5: 테스트 결과를 어떻게 검증하나요?
- 로그인 성공 후 특정 Activity가 시작되었는지 Intent를 확인합니다.
- 로그인 실패 시 에러 메시지나 토스트 메시지가 잘 뜨는지 확인합니다.
- View 상태나 텍스트 변경, View Visibility 상태를 assert 합니다.
```java
// 예: Toast 메시지 검사 (Robolectric Shadows 이용)
ShadowToast.showedToast("로그인 실패: 비밀번호 틀림");
// 예: 다음 Activity 호출 확인
ShadowApplication shadowApplication = Shadows.shadowOf(application);
Intent nextIntent = shadowApplication.getNextStartedActivity();
assertEquals(NextActivity.class.getName(), nextIntent.getComponent().getClassName());
```
Q6: 백엔드 API 호출은 어떻게 처리하나요?
- 실제 네트워크 호출은 하지 않고, 테스트용 Mock 서버나 Mockito 등으로 API 결과를 가짜로 만들어 줍니다.
- 로그인 ViewModel 또는 Presenter의 repository를 모킹해 로그인 성공/실패 시나리오를 만들어 테스트합니다.
Q7: AsyncTask, Coroutine 등 비동기는 어떻게 기다리나요?
- RobolectricScheduler를 사용해 테스트 쓰레드에서 직접 스케줄을 조작할 수 있습니다.
- 코루틴은 `runBlockingTest` 등 코루틴 테스트 유틸을 활용하세요.
- `ShadowLooper.idle()` 호출로 메시지 큐를 비워 비동기 작업 완료를 대기할 수 있습니다.
Q8: 샘플 로그인 테스트 코드 예제는?
@RunWith(RobolectricTestRunner.class)
public class LoginActivityTest {
private LoginActivity activity;
@Before
public void setup() {
activity = Robolectric.buildActivity(LoginActivity.class)
.create()
.resume()
.get();
}
@Test
public void testSuccessfulLogin() {
EditText emailInput = activity.findViewById(R.id.edittext_email);
EditText passwordInput = activity.findViewById(R.id.edittext_password);
Button loginButton = activity.findViewById(R.id.button_login);
emailInput.setText("[email protected]");
passwordInput.setText("correct_password");
loginButton.performClick();
// Async 처리, Scheduler 조작 필요 시 대기
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
ShadowApplication shadowApplication = Shadows.shadowOf(activity.getApplication());
Intent startedIntent = shadowApplication.getNextStartedActivity();
assertNotNull(startedIntent);
assertEquals(HomeActivity.class.getName(), startedIntent.getComponent().getClassName());
}
}
```
Q9: Robolectric 로그인 테스트 시 주의사항은?
- 네트워크 호출이나 외부 시스템에 의존하지 않아야 합니다.
- 비즈니스 로직과 UI 로직을 분리해 ViewModel 등에서 테스트를 권장합니다.
- AndroidManifest.xml 설정이나 리소스가 정확히 설정돼 있어야 합니다.
- 로그인 성공/실패 시나리오를 모두 테스트하세요.
---
요약: Robolectric 로그인 테스트는 로그인 Activity를 실행 후, 입력 필드에 값을 넣고 버튼 클릭을 시뮬레이션하며, 결과 UI 동작이나 인텐트 호출 등을 검증하는 방식으로 진행합니다. 네트워크 호출은 모킹하고, 비동기 작업 완료를 기다려 테스트의 안정성을 확보하세요.
실제 디바이스나 에뮬레이터 없이도 안드로이드 컴포넌트(Activity, Fragment 등)를 테스트할 수 있어 UI나 로직을 검증할 때 유용합니다.
특히 로그인 같은 사용자 인증 기능을 테스트할 때도 Robolectric을 적절히 활용할 수 있습니다.
아래는 Robolectric을 사용해 안드로이드 로그인 화면이나 로그인 로직을 테스트하는 방법에 대해 단계별로 자세히 설명합니다.
1. Robolectric 환경 설정 - 프로젝트에 Robolectric 의존성을 추가해야 합니다.
보통 `build.gradle` (모듈 레벨)에 다음을 추가합니다: ```gradle testImplementation "org.robolectric:robolectric:4.9" testImplementation "junit:junit:4.13.2" ``` - 테스트 클래스는 `src/test/java` 폴더에 위치시키고, JUnit과 RobolectricRunner를 사용합니다.
---
2. 로그인 화면(Activity) 테스트 준비 로그인화면이 `LoginActivity`라고 가정하겠습니다.
```java @RunWith(RobolectricTestRunner.class) @Config(sdk = {28}) // 원하는 안드로이드 SDK 버전 지정 public class LoginActivityTest { private LoginActivity activity; @Before public void setUp() { activity = Robolectric.buildActivity(LoginActivity.class) .create() .start() .resume() .get(); } // 테스트 메서드 작성 ... } ``` - `Robolectric.buildActivity()`를 사용해 액티비티 생명주기를 제어하며 인스턴스를 생성합니다.
- 이렇게 하면 UI 위젯도 정상적으로 생성되므로 `findViewById()` 등으로 뷰에 접근할 수 있습니다.
---
3. 로그인 UI 조작 및 입력 테스트 - 로그인 폼에 아이디, 패스워드 입력란이 `EditText`, 로그인 버튼이 `Button`이라면 다음과 같이 조작할 수 있습니다.
```java @Test public void testLoginWithValidCredentials() { EditText usernameEditText = activity.findViewById(R.id.username); EditText passwordEditText = activity.findViewById(R.id.password); Button loginButton = activity.findViewById(R.id.login_button); // 사용자 입력 시뮬레이션 usernameEditText.setText("testuser"); passwordEditText.setText("password123"); // 로그인 버튼 클릭 시뮬레이션 loginButton.performClick(); // 다음 동작 검증 (예: 다른 액티비티로 이동) } ``` - `setText()`로 텍스트 입력을 설정한 뒤 `performClick()`으로 버튼 클릭 이벤트를 발생시킵니다.
---
4. 로그인 로직 검증 - 로그인 버튼 클릭 시 네트워크 호출이나 데이터베이스 호출이 있다면, 보통 외부 종속성이므로 모킹(Mock) 해야 합니다.
- 예를 들어 로그인 로직을 별도의 `LoginManager` 클래스에 위임한다면, Mockito나 MockK로 해당 객체를 모킹한 후 정상/오류 응답을 테스트할 수 있습니다.
```java @Mock LoginManager loginManager; @Before public void setUp() { MockitoAnnotations.initMocks(this); activity = Robolectric.buildActivity(LoginActivity.class) .create() .start() .resume() .get(); // loginManager 대체 activity.setLoginManager(loginManager); } @Test public void testLoginSuccess() { when(loginManager.login("testuser", "password123")) .thenReturn(true); // EditText, Button 등 UI 이벤트 수행 코드 ... // 로그인 성공 시 UI 변화, 다른 액티비티 호출 등 검증 ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); Intent expectedIntent = new Intent(activity, MainActivity.class); Intent actual = Shadows.shadowOf(activity).getNextStartedActivity(); assertEquals(expectedIntent.getComponent(), actual.getComponent()); } ``` - Robolectric `Shadow` 클래스를 활용하면 새로 시작된 액티비티 인텐트를 같이 검증할 수 있습니다.
---
5. 로그인 실패 및 예외 처리 테스트 - 비밀번호 틀림, 사용자 미입력 등 시나리오에 대해 아래처럼 테스트합니다.
```java @Test public void testLoginFailure_ShowsError() { when(loginManager.login(anyString(), anyString())) .thenReturn(false); // EditText, Button 이벤트 수행 코드 // 예: 로그인 실패 시 토스트 메시지 띄우는 경우 ShadowToast.showedToast("로그인 실패"); assertTrue(ShadowToast.getTextOfLatestToast().contains("로그인 실패")); } ``` - UI 상태변경이나 토스트 메시지 등 사용자 피드백도 Robolectric과 관련 라이브러리(ShadowToast 등)로 점검 가능합니다.
---
6. 비동기 호출 테스트 - 만약 로그인이 비동기 콜백 방식이라면 `ShadowLooper`를 사용해 UI 쓰레드 메시지 큐를 실행시킵니다.
```java @Test public void testAsyncLogin() { // 비동기 모킹, 콜백 시뮬레이션 // 작업 후 ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); // UI 상태 검증 } ``` ---
7. 기타 팁 및 권장사항 - 네트워크 직접 호출 테스트는 Robolectric보다는 Espresso+MockWebServer 조합이 더 적합하므로, 단위 테스트 수준에 맞게 로그인 로직을 구조화(예: ViewModel, Presenter 분리) 하는 것이 좋습니다.
- UI 상태 검증 시 뷰 가시성, 텍스트 변경 여부, 인텐트 호출 여부를 꼼꼼히 확인하세요.
- 커스텀 Application 클래스를 지정하거나 `@Config(application=TestApplication.class)` 등을 활용해 테스트 전용 설정을 적용할 수 있습니다.
Robolectric을 통한 로그인 테스트는 기본적으로 다음 단계를 따릅니다.
1. Robolectric 환경 구축 및 Activity 인스턴스화
2. 로그인 UI 요소 찾기 (`EditText`, `Button` 등)
3. 사용자 입력 시뮬레이션 (`setText`, `performClick`)
4. 로그인 로직(외부 의존성) 모킹
5. UI 변화, 액티비티 이동, 토스트 메시지 등 결과 검증
6. 필요한 경우 비동기 작업용 로퍼 실행 및 추가 검증 이 방식을 통해, 실제 디바이스 없이도 로그인 화면의 주요 기능과 UI 흐름이 의도대로 동작하는지 효과적으로 테스트할 수 있습니다.
작성자:
최승우 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:40
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.