반응형
이전 글에서는 Jetpack Compose와 네트워크 계층을 연결네트워크 계층의 안정성을 보장하기 위한 단위 테스트와 통합 테스트 전략을 다뤄봅니다.
1. 왜 네트워크 계층 테스트가 중요한가?
- API 응답이 언제든지 변경될 수 있음
- 서버 다운/네트워크 오류 상황에서도 앱이 정상 동작해야 함
- Retrofit/OkHttp 등 외부 의존성을 올바르게 사용했는지 확인 필요
따라서, 단위 테스트(Unit Test)와 통합 테스트(Integration Test)를 적절히 활용하는 것이 중요합니다.
2. 단위 테스트: MockWebServer 활용
단위 테스트에서는 네트워크 호출을 실제 서버에 의존하지 않고 MockWebServer를 활용합니다. 이 서버는 가짜 응답을 반환하므로 다양한 케이스를 시뮬레이션할 수 있습니다.
@Test
fun `유저 API 성공 응답`() {
val mockResponse = MockResponse()
.setResponseCode(200)
.setBody("{ \"id\": \"1\", \"name\": \"홍길동\" }")
mockWebServer.enqueue(mockResponse)
val response = apiService.getUser("1").execute()
assertEquals("홍길동", response.body()?.name)
}
장점
- 서버 환경과 무관하게 안정적인 테스트 가능
- 에러, 타임아웃 등 다양한 상황을 재현 가능
- 테스트 실행 속도가 빠름
3. 통합 테스트: 실제 서버와 연결
통합 테스트는 실제 서버와 API 호출
@Test
fun `실제 서버에서 유저 데이터 가져오기`() {
val response = realApiService.getUser("1").execute()
assertTrue(response.isSuccessful)
assertNotNull(response.body())
}
주의할 점
- 네트워크 환경에 따라 테스트가 실패할 수 있음
- CI/CD 파이프라인에서는 Mock 기반 테스트와 분리 필요
- 실제 서버 데이터가 바뀌면 테스트도 수정해야 함
4. 단위 테스트 vs 통합 테스트 비교
| 구분 | 단위 테스트 | 통합 테스트 |
|---|---|---|
| 의존성 | MockWebServer | 실제 서버 |
| 속도 | 빠름 | 느림 |
| 안정성 | 높음 | 서버 상태에 의존 |
| 목적 | 코드 로직 검증 | 엔드투엔드 검증 |
5. CI/CD에서의 전략
- Pull Request 시 → Mock 기반 단위 테스트만 실행
- 스테이징 배포 시 → 실제 서버와의 통합 테스트도 실행
- 프로덕션 모니터링 → 실제 API 호출 + 알림 시스템 연동
6. 정리
- MockWebServer를 이용하면 네트워크 단위 테스트를 빠르고 안정적으로 작성할 수 있다.
- 통합 테스트는 실제 서버와의 호환성을 검증하는 데 필요하다.
- CI/CD 파이프라인에서 두 테스트를 분리해 실행하는 것이 효과적이다.
마무리: 네트워크 계층 테스트는 안정적인 서비스 제공을 위한 필수 요소입니다. 다음 글에서는 안드로이드 앱 네트워크 최적화 (캐싱, 연결 관리, 성능 개선)을 다뤄보겠습니다.
반응형
'개발일기' 카테고리의 다른 글
| Jetpack Compose와 네트워크 계층 연결하기 (2) | 2025.09.09 |
|---|---|
| 안드로이드 앱 네트워크 최적화 (캐싱, 연결 관리, 성능 개선) (3) | 2025.09.05 |
| Jetpack Compose와 네트워크 계층 연결 (상태 관리 & UI 반영) (2) | 2025.09.03 |
| OkHttp Interceptor를 활용한 공통 에러 처리 & 로깅 전략 (4) | 2025.09.02 |
| Retrofit + Kotlin Flow로 실시간 데이터 처리 (4) | 2025.09.01 |