SpringBoot JUnit5 테스트 및 어노테이션
서버개발

SpringBoot JUnit5 테스트 및 어노테이션

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
  • @EnableConfigurationProperties
    • 구성 속성을 활성화하는데 사용하는 어노테이션으로 yml 파일에 정의된 속성에 액세스하고 @ConfigurationProperties가 달린 클래스에 바인딩 가능
    • 이를 통해 중앙 집중식의 조직화된 방식으로 구성 및 쉽게 액세스 가능
  • @Transactional
    • @Test와 같이 쓰이면 테스트 완료 후 자동으로 rollback 처리
    • DB 설정에 따라 rollback이 되지 않을 수도 있다..(고통 많이 받음)
    • WebEnvironment.RANDOM_PORT, DEFINE_PORT를 사용하면 실제 테스트 서버는 별도의 스레드에서 테스트를 진행하여 트랜잭션이 롤백되지 않음
    • @BeforeAll은 모든 테스트 전에 수행되어 트랜잭션이 분리되어 있다.
      별도로 롤백되지 않는 경우 @BeforeEach를 사용
  • @ActiveProfiles
    • 프로파일 전략을 사용할 때 원하는 환경값 설정이 가능
  • @AutoConfigureMockMvc
    • Mock이란
      • 실제 객체를 만들기에 비용이 크고 구현이 어려울 경우 가짜 객체를 만들어 사용
      • WebApplicationContext를 로드하여 내장된 서블릿 컨테이너가 아닌 Mock 서블릿 제공
      • 별다른 설정 없이 간편하게 테스트 가능
      • Controller 테스트 시 용이함
    • Mock 테스트 시 필요한 의존성 제공
    • MockMvc 객체를 통해 실제 컨테이너가 아닌 로직 상 테스트 진행