-
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 흐름 정리
'개발 > Spring Boot' 카테고리의 다른 글
Spring Boot 시리즈 16편 – 고급 캐시 전략: 멀티 레벨 캐시(L1+L2)와 데이터 일관성 관리 (0) 2025.04.27 Spring Boot 시리즈 15편 – 운영 환경 배포 전략: Docker, 무중단 배포, CI/CD 실전 가이드 (0) 2025.04.27 Spring Boot 시리즈 13편 – 스케줄러와 배치 처리 전략: Spring Task와 Quartz 실전 가이드 (0) 2025.04.26 Spring Boot 시리즈 12편 – 파일 업로드 처리 전략: 이미지, 문서 업로드부터 S3 연동까지 (0) 2025.04.26 Spring Boot 시리즈 10편 – Spring Security로 인가 처리 확장: 권한 기반 API 보호 전략 (0) 2025.04.25