[Spring] 통합 테스트와 슬라이스 테스트
💡 코드가 보이지 않으시다면 드래그 혹은 오른쪽 아래 🌜 아이콘을 눌러 테마 색을 변경해주세요.
안녕하세요!
키크니 개발자 입니다. 🦒
강의를 들으면서 슬라이스 테스트 개념이 나온 김에 간단하게 개념을 정리해보고자 합니다.
통합 테스트란?
단위 테스트 이후, 각 모듈들의 상호 작용이 제대로 이루어지는지 검증하는 테스트입니다.
모듈을 통합하는 과정에서 발생할 수 있는 오류를 찾을 수 있습니다.
애플리케이션이 실행될 때 설정을 임의로 바꾸어 테스트를 진행할 수 있으며, 여러 단위 테스트를 하나의 통합 된 테스트로 수행할 때 적합합니다.
통합 테스트는 여러 단위의 테스트들을 통합하여 수행합니다. (Controller -> Service -> Repository)
@SpringBootTest
Spring에서는 @SpringBootTest를 사용하면 손쉽게 통합테스트를 위한 환경을 준비해줍니다.
이 어노테이션은 모든 빈들을 스캔하고, 애플리케이션 컨텍스트를 생성하여 테스트를 실행합니다.
단점으로는 특정 계층만 테스트가 필요한 상황에서 이 어노테이션을 사용하게 되면 불필요하게 무거워지고, 시간이 오래 걸립니다.
(실제 구동되는 애플리케이션의 설정, 모든 Bean을 로드하기 때문입니다.)
또한 테스트 단위가 크기 때문에 디버깅이 어렵습니다.
슬라이스 테스트란?
특정 부분만 테스트 할 수 있는 테스트를 슬라이스 테스트라고 합니다.
스프링은 슬라이스 테스트를 위한 어노테이션들을 제공합니다.
(물론 슬라이스 테스트도 스프링 컨텍스트를 구성하므로 통합 테스트입니다.)
아래는 대표적인 슬라이스 테스트 어노테이션입니다.
- @WebMvcTest
- Contorller를 테스트할 수 있도록 관련 설정을 제공합니다.
- @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Fliter, WebMvcConfigurer, HandlerMethodArgumentResolver 등만 Bean으로 등록합니다.
- 이 밖에 테스트를 하는데 필요하지 않은 컴포넌트들(ex : @Service, @Repository)은 Bean으로 등록하지 않습니다.
- @WebFluxTest
- Spring WebFlux 컨트롤러가 예상대로 작동하는지 테스트할 때 사용합니다.
- @WebMvcTest와 유사하게 @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, WebFlusConfigurer 등만 Bean으로 등록합니다.
- @MockBean 어노테이션과 함께 사용하여 필요
- @DataJpaTest
- JPA 레포지토리를 테스트하기 위해 사용합니다.
- 기본적으로 @Entity가 있는 엔티티 클래스들을 스캔하며 테스트를 위한 TestEntityManager를 사용해 JPA 레포지들을 설정해줍니다.
- @Component나 @ConfigurationProperties Bean들은 스캔되지 않습니다.
- @JsonTest
- Json serialization과 deserialization을 편하게 테스트할 수 있습니다.
- ObjectMapper와 @JsonComponent 빈을 포함한 Jackson의 테스트를 위한 모듈을 자동으로 설정합니다.
- @RestClientTest
- 클라이언트 입장에서의 API 연동 테스트입니다.
- 테스트 코드 내에서 Mock 서버를 띄울 수 있게 합니다. (이 Mock 서버는 request에 대한 검증, response에 대한 사전정의가 가능합니다.)
- 스프링 컨텍스트 전체를 사용하지 않기 때문에 테스트에 사용되는 클래스를 value에 전달하여 Bean으로 등록해야 합니다.
⭐️ 참고한 곳
https://cobbybb.tistory.com/24
https://pomo0703.tistory.com/98
https://cheese10yun.github.io/spring-boot-test/
https://mangkyu.tistory.com/242
https://miinsun.tistory.com/137
https://tecoble.techcourse.co.kr/post/2021-05-18-slice-test/
배워야 할 것이 더 많은 주니어 개발자입니다. 🐣
내용 전달보다는 정리를 목적으로 포스팅을 하고 있습니다.
잘못 된 내용이나 부족한 부분은 댓글로 주시면 감사드리겠습니다.