ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 시리즈 14편 – API 테스트 자동화 전략: RestAssured, MockMvc, TestContainers 실전 가이드
    개발/Spring Boot 2025. 4. 26. 00:14
    Spring Boot에서 REST API 테스트를 자동화하는 전략을 소개합니다. MockMvc, RestAssured, TestContainers를 활용한 통합 테스트 구조와 품질 확보 방법을 설명합니다.

     


     

    Spring Boot 시리즈 14편 – API 테스트 자동화 전략: RestAssured, MockMvc, TestContainers 실전 가이드

     

    API는 빠르게 만들 수 있지만, 안정적으로 운영되도록 유지하는 일은 훨씬 어렵습니다.

    테스트 코드가 없거나, 일관성이 없거나, 실제 운영 환경과 동떨어진 테스트는 결국 서비스 장애로 이어질 수 있습니다.

     

    이번 편에서는 Spring Boot 환경에서 REST API를 MockMvc, RestAssured, TestContainers를 통해

    개발 → 통합 → 환경 검증까지 이어지는 테스트 전략을 실제 사례 중심으로 정리합니다.

     


     

    📌 1. API 테스트는 왜 자동화되어야 하나?

    이유설명

    회귀 테스트 코드 변경 시 기존 기능이 깨지지 않았는지 확인
    스펙 일치 확인 Swagger 또는 명세서와 실제 동작 일치 여부 검증
    배포 안정성 확보 CI/CD 파이프라인에서 테스트 자동 실행
    문서화와 테스트 연동 테스트 → RestDocs 기반 문서 자동 생성 가능

     

     


     

    ✅ 2. 단위 테스트 vs 통합 테스트 vs 시스템 테스트

    분류범위도구주로 검증하는 것

    단위 테스트 한 클래스 또는 함수 JUnit, Mockito 비즈니스 로직 정확성
    통합 테스트 API 전체 흐름 MockMvc, RestAssured 컨트롤러 ↔ 서비스 ↔ DB
    시스템 테스트 실제 환경 구성 TestContainers 환경 포함 전체 시스템 동작

     

     


     

    🔧 3. MockMvc를 활용한 API 통합 테스트

     

     

    1️⃣ 기본 설정

    @SpringBootTest
    @AutoConfigureMockMvc
    class UserApiTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        void 사용자_등록_성공() throws Exception {
            String json = """
                {
                  "email": "test@example.com",
                  "password": "1234",
                  "name": "홍길동"
                }
            """;
    
            mockMvc.perform(post("/api/users")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(json))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true));
        }
    }
    Spring Context 전체를 로딩하여 실제 API 흐름을 검증할 수 있습니다.

     


     

    ✅ 특징

     

    • 빠르고 설정 간단
    • Spring Security, 필터 적용 여부를 함께 테스트 가능
    • 하지만 실제 HTTP 포트는 사용하지 않음 → 외부 클라이언트 테스트는 불가

     


     

    🌐 4. RestAssured 기반 실제 HTTP 요청 테스트

     

     

    1️⃣ 의존성 추가

    testImplementation 'io.rest-assured:rest-assured:5.3.0'

     

     


     

    2️⃣ RestAssured 테스트 예제

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class UserRestApiTest {
    
        @LocalServerPort
        int port;
    
        @Test
        void 사용자_등록_성공() {
            given()
                .port(port)
                .contentType(ContentType.JSON)
                .body("""
                    {
                      "email": "rest@test.com",
                      "password": "abcd",
                      "name": "테스터"
                    }
                """)
            .when()
                .post("/api/users")
            .then()
                .statusCode(200)
                .body("success", equalTo(true));
        }
    }

     

    ✅ 장점

     

    • 실제 HTTP 요청을 통해 통합 테스트 가능
    • Swagger 명세와 실제 응답 일치 여부 검증에 적합
    • 클라이언트 UX 시나리오 테스트에 매우 유리

     


     

    🐳 5. TestContainers – 환경 통합 테스트

     

     

    1️⃣ 목적

     

    • 실제 DB(MySQL, PostgreSQL 등) 컨테이너를 띄워 통합 테스트 실행
    • CI 환경에서도 운영 환경과 동일한 조건에서 테스트 가능

     


     

    2️⃣ PostgreSQL 컨테이너 예시

    @Testcontainers
    @SpringBootTest
    class ContainerizedApiTest {
    
        @Container
        static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");
    
        @DynamicPropertySource
        static void overrideProps(DynamicPropertyRegistry registry) {
            registry.add("spring.datasource.url", postgres::getJdbcUrl);
            registry.add("spring.datasource.username", postgres::getUsername);
            registry.add("spring.datasource.password", postgres::getPassword);
        }
    
        @Test
        void DB_연동_및_API_정상동작() {
            // 테스트 코드 작성
        }
    }

     

     


     

    🧠 실무 전략 요약

    전략 항목설명

    테스트 클래스 구조 기능별 Controller 단위로 테스트 클래스 분리
    테스트 데이터 관리 @Sql 또는 Fixture 유틸로 초기화
    실패 케이스 포함 인증 실패, 유효성 오류 등도 반드시 검증
    테스트 명명 규칙 한글로 시나리오 중심 (회원가입_성공_시_200응답)
    CI 연동 GitHub Actions, GitLab CI에서 test 자동 실행 구성

     

     


     

    ✅ 마무리 요약

    항목요약

    MockMvc 빠른 테스트, Spring Context 내에서 API 흐름 검증
    RestAssured 실제 포트를 사용하는 HTTP 요청 기반 테스트
    TestContainers 실환경 DB/외부 시스템과 함께 전체 통합 테스트
    실무 팁 실패 케이스까지 포함 + 테스트 환경 재현성 유지 중요
    CI 적용 PR마다 테스트 실행 → 품질 보장

     

     


     

    📌 다음 편 예고

     

    Spring Boot 시리즈 15편: 운영 환경 배포 전략 – Docker, 무중단 배포, Spring Boot + CI/CD 흐름 정리

Designed by Tistory.