목차
- @SpringBootTest
- @WebMvcTest
- @DataJpaTest
- @RestClientTest
- @JsonTest
들어가기 앞서..
Springboot 2.2.0 이후 버전부터는 junit5가 기본으로 되었다.
Junit 5 특징
Junit5는 Junit Platform, Junit Jupiter, Junit Vintage 모듈 세 가지로 구성되어 있다.
- Junit Platform - JVM에서 동작하는 테스트 프레임워크이다. 테스트를 발견하고 계획을 생성하고 결과를 보고하는 TestEngine 인터페이스를 정의한다.
- Junit Jupiter - Junit5 TestEngine의 실제 구현체입니다. Junit5 기반의 테스트를 실행시키기 위한 TestEngine을 Platform에 제공합니다.
- Junit Vintage - TestEngine에서 Junit3 및 Junit4 기반 테스트를 실행하기 위한 기능을 제공한다.
@SpringBootTest
- 스프링 부트의 테스트 어노테이션에서 @SpringBootTest는 만능이다.
- 실제 구동되는 애플리케이션과 똑같이 애플리케이션 컨텍스트를 로드하여 테스트하기 때문에 하고 싶은 모든 테스트를 수행 할 수 있다.
- 규모가 클수록 속도가 느려진다.
@SpirngBootTest 파라미터
1. 테스트가 실행되기 전에 적용할 프로퍼티를 주입시킬 수 있다.
2. 테스트가 실행되기 전에 {key=value} 형식으로 프로퍼티를 추가할 수 있다.
3. 애플리케이션 컨텍스트에 로드할 클래스를 지정할 수 있다. 따로 지정하지 않으면 @SpringBootConfiguration을 찾아서 로드한다.
4. 애플리케이션이 실행될 때의 웹 환경을 설정할 수 있다. 기본값은 Mock 서블릿을 로드하여 구동된다.
**Tip
- 프로파일 환경(개발, QA, 운영)마다 다른 데이터소스(DataSource)를 갖는다면 @ActiveProfiles("local")과 같은 방식으로 원하는 프로파일 환경값을 부여한다.
- 테스트에서 @Transactional을 사용하면 테스트를 마치고 나서 수정된 데이터가 롤백됩니다.
하지만 webEnvironment의 RANDOM_PORT나 DEFINED_PORT로 테스트를 설정하면 테스트가 별도의 스레드에서 수행되기 때문에 rollback이 수행되지 않음
- @SpringBootTest는 기본적으로 검색 알고리즘을 사용하여 @SpringBootApplication이나 @SpringBootConfiguration 어노테이션을 찾습니다. 스피링 부트 테스트이기 때문에 해당 어노테이션중 하나는 필수이다.
@WebMvcTest
- MVC를 위한 테스트이다.
- 웹에서 테스트하기 힘든 컨트롤러를 테스트하는 데 적합하다.
- 시큐리티 혹은 필터까지 자동으로 테스트하며 수동으로 추가/삭제까지 가능하다.
- @WebMvcTest 어노테이션을 사용하면 MVC관련 설정인 @Controller, @ControllerAdvice, @JsonComponent와 Filter, WebMvcConfigurer, HandlerMethodArgumentResolver만 로드된다.
@DataJpaTest
- JPA 관련 테스틈 설정만 로드한다.
- 데이터소스 설정이 정상적인지, JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지 등의 테스타가 가능하다.
- 기본적으로 인메모리 임베디드 데이터베이스를 사용하며, @Entity 클래스를 스캔하여 스프링 데이터 JPA 저장소를 구성한다.
- JPA 테스트가 끝날 때마다 자동으로 테스트에 사용한 데이터를 롤백한다. @Transactional 어노테이션 내장되어 있다.
@RestClientTest
- REST 관련 테스트를 도와주는 어노테이션이다.
- REST 통신의 데이터형으로 사용되는 JSON 형식이 예상대로 응답을 반환하는지 등을 테스트할 수 있다.
@JsonTest
- JSON 테스트를 지원하는 어노테이션이다.
- JSON의 직렬화 역 직렬화를 수행하는 라이브러리인 Gson과 Jackson API의 테스트를 제공한다.
- 각각 GsonTester와 JacksonTester를 사용하여 테스트를 수행한다.
마무리
각 어노테이션의 용도를 정확히 이해하여 적합한 상황에서 사용하는 것이 중요하다.
스프링의 모든 빈을 올리는 대신, 각 테스트에 필요한 가짜 객체를 만들어 테스트하는 방법을 사용해 상황에 맞는 테스트를 하는 게 중요하다.
** Intellij에서 테스트코드 참고사항
1. 아래와 같이 에러가 출력되면 Setting에 Run tests using을 inteillij IDEA로 수정 후 확인해보자.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
Junit5을 사용하면서 문제가 발생하는 걸로 보인다.
2. 테스트 코드 한글 이름이 깨지면 탭에서 Help > Edit custom VM Options..설정에 아래 encoding 라인을 추가하자
-Dfile.encoding=UTF-8
'Spring' 카테고리의 다른 글
스프링 부트 데이터 레스트로 REST API 만들기 (0) | 2021.05.05 |
---|---|
스프링 부트 데이터 레스트 (0) | 2021.05.01 |
스프링 부트 시큐리티 + OAuth2 (0) | 2021.04.20 |
스프링 부트 웹 (0) | 2021.04.11 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (0) | 2021.02.08 |