[Spring Boot] Spring Test를 이용한 효율적인 통합 테스트전략
KUKJIN LEE • 3일 전 작성
Spring Boot 애플리케이션을 개발할 때, 전체 시스템의 통합성과 동작을 검증하기 위해 통합 테스트는 필수적입니다. 통합 테스트는 여러 컴포넌트들이 함께 잘 작동하는지 확인하며, Spring Test를 이용하면 이러한 테스트를 손쉽게 작성할 수 있습니다.
통합 테스트란 무엇인가?
통합 테스트는 애플리케이션의 여러 모듈들이 함께 작동하는지를 검증하는 테스트입니다. 단위 테스트가 개별 클래스나 메서드를 테스트하는 반면, 통합 테스트는 여러 컴포넌트를 함께 테스트하여 시스템의 전체적인 동작을 확인합니다. Spring Boot에서는 이러한 통합 테스트를 @SpringBootTest
어노테이션을 사용해 쉽게 작성할 수 있습니다.
@SpringBootTest를 이용한 통합 테스트 설정
@SpringBootTest
는 Spring 컨텍스트를 로드하고 모든 빈을 주입하여 전체 애플리케이션을 테스트하는 데 사용됩니다.
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.test.web.servlet.MockMvc;
import org.junit.jupiter.api.Test;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk());
}
}
@SpringBootTest
와 MockMvc
를 사용하여 /api/users/1
엔드포인트가 정상적으로 동작하는지를 검증합니다. @AutoConfigureMockMvc
는 MockMvc
를 자동으로 구성해주는 어노테이션으로, 이를 통해 컨트롤러를 쉽게 테스트할 수 있습니다.
데이터베이스와의 통합 테스트
통합 테스트에서는 실제 데이터베이스와의 상호작용을 테스트하는 경우도 많습니다. 이를 위해 @DataJpaTest
를 사용하여 JPA 레포지토리를 테스트할 수 있습니다. 예를 들어, 특정 엔티티가 데이터베이스에 올바르게 저장되고 조회되는지를 확인하는 테스트를 작성할 수 있습니다.
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveAndFindUser() {
User user = new User("john", "doe");
userRepository.save(user);
User foundUser = userRepository.findByUsername("john");
assertThat(foundUser).isNotNull();
assertThat(foundUser.getFirstName()).isEqualTo("john");
}
}
@DataJpaTest
어노테이션은 JPA 관련 컴포넌트만 로드하며, 임베디드 데이터베이스를 사용하여 테스트를 빠르게 실행할 수 있습니다.
통합 테스트 작성 시 고려사항
-
테스트 환경 격리: 통합 테스트는 실제 데이터베이스나 외부 API와 상호작용하기 때문에 테스트 환경을 격리해야 합니다. 이를 위해 H2 같은 임베디드 데이터베이스를 사용하거나, Mock 서버를 설정하는 것이 좋습니다.
-
테스트 데이터 초기화: 각 테스트는 독립적으로 실행되어야 하므로, 테스트 데이터를 초기화하거나 롤백하여 다른 테스트에 영향을 주지 않도록 해야 합니다.
-
실행 속도 최적화: 통합 테스트는 단위 테스트보다 느리기 때문에, 필요한 부분만 통합 테스트로 작성하고 나머지는 단위 테스트로 커버하는 것이 좋습니다.
통합 테스트는 전체 애플리케이션의 안정성과 동작을 보장하기 위한 중요한 과정입니다. Spring Boot의 @SpringBootTest
와 관련 어노테이션들을 잘 활용하면, 복잡한 의존성을 가진 애플리케이션의 통합 테스트를 효과적으로 작성하고 유지할 수 있습니다.