개발일기

네트워크 계층 단위 테스트 & 통합 테스트 전략

뱅우 2025. 9. 4. 09:34
반응형
네트워크 계층 단위 테스트 & 통합 테스트 전략

이전 글에서는 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 파이프라인에서 두 테스트를 분리해 실행하는 것이 효과적이다.

마무리: 네트워크 계층 테스트는 안정적인 서비스 제공을 위한 필수 요소입니다. 다음 글에서는 안드로이드 앱 네트워크 최적화 (캐싱, 연결 관리, 성능 개선)을 다뤄보겠습니다.

반응형