Spring Boot Test Context(스프링 부트 테스트 컨텍스트)
스프링 부트는 다양한 계층의 테스트를 지원하기 위해 여러 가지 테스트 애노테이션을 제공하여, 테스트 환경을 쉽게 구성할 수 있도록 도와준다.
@SpringBootTest
- 전체 애플리케이션 컨텍스트 로드 - 통합 테스트 수행 - 모든 계층 테스트 가능
- 애플리케이션 전체 흐름 테스트 - 여러 계층 간 상호작용 테스트 - 실제와 유사한 환경에서 테스트
@DataJpaTest
- JPA 관련 Bean만 로드 - 트랜잭션 관리 및 롤백 - 내장형 데이터베이스 사용
- JPA 엔티티 및 리포지토리 테스트 - 데이터베이스 쿼리 검증 - JPA 관련 테스트 수행 시
@JdbcTest
- JDBC 관련 Bean만 로드 - 트랜잭션 관리 및 롤백 - 내장형 데이터베이스 사용
- 순수 JDBC 테스트 - SQL 쿼리 검증 - JPA를 사용하지 않는 데이터베이스 상호작용 테스트
@WebMvcTest
- 웹 계층 관련 Bean만 로드 - 내장형 웹 서버(MockMvc) 사용
- 컨트롤러 계층 테스트 - 웹 계층의 단위 테스트 수행 - 빠른 웹 계층 테스트 필요 시
특징에서 알 수 있듯이 컨텍스트를 로드해 편리하게 테스트 환경을 제공해주며, 테스트 단위 및 목적에 따라 적절한 애노테이션을 사용하면 된다.
테스트 애노테이션 사용 시 주의사항
하지만 편리한만큼 이를 남용하게 되면 아래의 이유로 테스트 실행 속도가 느려지는 문제가 발생할 수 있다.
불필요한 로드: 테스트 목적에 맞지 않는 불필요한 Bean과 컨텍스트가 로드
반복 되는 로드: 같은 테스트 어노테이션이더라도 반복적으로 애플리케이션 컨텍스트를 생성함
이러한 문제를 해결하기 위한 최적화 방법은 다음과 같다.
애플리케이션 컨텍스트가 필요한 경우만 로드
불필요하게 컨텍스트를 로드하는 것은 테스트 실행 속도를 느리게하는 가장 큰 요인이므로, 아래와 같은 방법으로 최소한의 컨텍스트만 로드하도록 한다.
@SpringBootTest
대신@DataJpaTest
,@WebMvcTest
등을 사용Junit이나 Mockito 같은 테스트 프레임워크를 사용
테스트하기 좋은 코드를 작성
컨텍스트 캐싱
스프링은 기본적으로 애플리케이션 컨텍스트를 캐싱하는데, 동일한 설정을 사용하는 테스트는 동일한 컨텍스트를 재사용한다.
하지만 다른 설정을 사용하는 테스트는 새로운 컨텍스트를 생성하게 된다.
TestContext
프레임워크는 다음 구성 매개 변수를 사용하여 컨텍스트 캐싱을 하는데, 다를 경우 새로운 컨텍스트를 생성하게 된다.
locations
@ContextConfiguration
애노테이션의 인자
classes
@ContextConfiguration
애노테이션의 인자
contextInitializerClasses
@ContextConfiguration
애노테이션의 인자
contextCustomizers
ContextCustomizerFactory
에서 로드
contextLoader
@ContextConfiguration
애노테이션의 인자
parent
@ContextHierarchy
activeProfiles
@ActiveProfiles
propertySourceLocations
@TestPropertySource
propertySourceProperties
@TestPropertySource
resourceBasePath
@WebAppConfiguration
공통된 설정 사용
컨텍스트 캐싱을 이용하여 공통된 설정을 사용하면 컨텍스트를 재사용할 수 있어 테스트 실행 속도를 높일 수 있다.
상속 받아 구현을 하면 공통된 설정을 사용할 수 있으며, 이를 통해 손쉽게 컨텍스트를 관리하고 실행 환경들을 통일 및 제어할 수 있다.
Last updated
Was this helpful?