SpringBoot의 테스트 종류
- @SpringBootTest
- 실제 어플리케이션을 자신의 로컬 위로 올려서 포트 주소가 Listening 되어지고, DB와 커넥션이 붙어지는 상태로 진행되는 라이브 테스트 방법
- Bean 범위 : 주입된 Bean 전체
- 다른 테스트에 비해 무거운 테스트
- @WebMvcTest
- Controller(API) Layer만을 테스트하기 적합한 테스트 어노테이션으로, 전체 어플리케이션을 실행하는 것이 아닌 Controller만을 로드하여 테스트를 진행할 수 있는 테스트 방법
- Bean 범위 : MVC관련 Bean(Controller, Service)
- @DataJpaTest
- Jpa DB I/O 테스트
- Bean 범위 : JPA 관련 Bean(EntityManager)
- @RestClientTest
- RestAPI 테스트
- Bean 범위 : RestTemplate등의 일부 Bean
- @JsonTest
- Json 데이터 테스트
- Bean 범위 : JSON 관련 일부 Bean
@SprintBootTest
- 통합테스트 - 모든 빈을 등록하여 테스트를 진행하기 때문에 규모가 커질 경우 테스트가 많이 느려진다
- classes 속성을 사용하면 필요한 빈만 등록할 수 있다
@SpringBootTest( classes = { 필요한 클래스 },
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@WebMvcTest
- 웹 상에서 요청과 응답에 대한 테스트 가능
- @Contoller, @ControllerAdvice, @JsonComponent, Filter, WebMvcConfiguer, HandlerMethodArgumentResolver 로드
@DataJpaTest
- JPA 관련된 설정만 로드, @Entity 클래스를 스캔하여 스프링 데이터 JPA 저장소 구성
- 기본적으로 인메모리 데이터베이스 이용
- 데이터 소스의 설정, JPA를 사용한 데이터 CRUD 등의 테스트 가능
- 테스트가 끝날 때마다 자동으로 테스트에 사용한 데이터 롤백
- @AutoCinfigureTestDataBase : 데이터 소스 설정
- Replace.Any : 내장 데이터 소스 사용
- Replace.None : @ActiveProfiles 기준으로 설정
@RestClientTest
- REST 통신의 JSON 형식을 예상대로 응답 반환하는 지 테스트
- MockRestServiceServer : 클라이언트와 서버 사이의 REST 테스트를 위한 객체
내부에서 RestTemplate를 바인딩하여 통신이 이뤄지게끔 구성
자주 쓰이는 어노테이션
- @Test
- @Test가 선언된 메서드는 테스트를 수행하는 메서드가 됨
- 각각의 테스트는 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 @Test마다 객체 생성
- 정적 테스트로, 동적 테스트는 @TestFactory 사용
- @TestInstance
- 테스트 클래스의 생명주기 설정
- @TestMethodOrder
- 테스트 메서드 실행 순서 구성에 사용
- @DisplayName
- 테스트 클래스 및 메서드의 디스플레이 표시 이름 선언
- @Ignore
- 선언된 메서드는 테스트를 실행하지 않음
- JUnit5에서는 @Disabled
- @ParameterizedTest
- 매개변수를 받는 테스트 작성
- @RepeatedTest
- 반복되는 테스트 작성
- @Timeout
- 테스트 실행 시간 선언, 초과되면 실패
- @RunWith
- JUnit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션
- ApplicationContext를 만들고 관리하는 작업을 해당하는 클래스의 설정으로 하겠다는 뜻
- JUnit5에서는 사용할 수 없다
- @ExtendWith로 변환
(@RunWith(SpringRunner.class) → @ExtendWith(SpringExtension.class) - 이는 @SpringBootTest에 포함되어 있어 @SpringBootTest 사용 시 별도 필요X
- @ExtendWith로 변환
- @EnableConfigurationProperties
- 구성 속성을 활성화하는데 사용하는 어노테이션으로 yml 파일에 정의된 속성에 액세스하고 @ConfigurationProperties가 달린 클래스에 바인딩 가능
- 이를 통해 중앙 집중식의 조직화된 방식으로 구성 및 쉽게 액세스 가능
- @Transactional
- @Test와 같이 쓰이면 테스트 완료 후 자동으로 rollback 처리
- DB 설정에 따라 rollback이 되지 않을 수도 있다..(고통 많이 받음)
- WebEnvironment.RANDOM_PORT, DEFINE_PORT를 사용하면 실제 테스트 서버는 별도의 스레드에서 테스트를 진행하여 트랜잭션이 롤백되지 않음
- @BeforeAll은 모든 테스트 전에 수행되어 트랜잭션이 분리되어 있다.
별도로 롤백되지 않는 경우 @BeforeEach를 사용
- @ActiveProfiles
- 프로파일 전략을 사용할 때 원하는 환경값 설정이 가능
- @AutoConfigureMockMvc
- Mock이란
- 실제 객체를 만들기에 비용이 크고 구현이 어려울 경우 가짜 객체를 만들어 사용
- WebApplicationContext를 로드하여 내장된 서블릿 컨테이너가 아닌 Mock 서블릿 제공
- 별다른 설정 없이 간편하게 테스트 가능
- Controller 테스트 시 용이함
- Mock 테스트 시 필요한 의존성 제공
- MockMvc 객체를 통해 실제 컨테이너가 아닌 로직 상 테스트 진행
- Mock이란
'서버개발' 카테고리의 다른 글
비관적 락, 낙관적 락 (3) | 2023.02.28 |
---|---|
Spring protobuf 부분 로딩 오류 해결(GCP Storage Signed Url) (0) | 2023.02.15 |
Protobuf(Protocol Buffers)와 RPC (0) | 2023.02.07 |
GraalVM 소개 (0) | 2023.02.01 |
백엔드 기술 면접 대비(HTTP, JAVA, Spring, JPA 등) (1) | 2022.10.04 |