Spring - 테스트 코드 작성하기

테스트의 목적은 설계를 검증하기 위함이다. 어떠한 목적을 이루기 위한 비즈니스 로직을 설계하고 해당 설계가 제대로된 결과값을 내는지를 검증하기 위해 이용한다. 테스트를 작성함으로써 검증 및 예상되는 문제를 미리 확인할 수 있다는 장점이 있다.

Spring은 JUnit 프레임워크의 어노테이션을 이용하여 테스트를 명시하고 실행할 수 있다. 어노테이션은 다음과 같이 크게 3가지 분류로 나누어 볼 수 있다.

  • 테스트 환경 설정 어노테이션
  • 테스트 생명주기 관련 어노테이션
  • 실제 테스트를 진행을 위한 어노테이션


테스트 환경 설정 어노테이션

어떤 환경에서 테스트를 실행할지에 대한 어노테이션들이다. 각 어노테이션들은 통합테스트, 단위테스트, 데이터 레이어 테스트인지에 따라 테스트 환경구성을 달리 만들어준다. 대표적으로 다음과 같은 어노테이션들이 있다.

  • @SpringBootTest
    • SpringBootApplication 하위의 모든 Bean들을 스캔하여 로드한다.
    • 실제 Application Context를 띄우는 것이므로 프로젝트의 크기가 커질수록 빌드 및 실행 시간이 많이 걸린다.
    • 통합테스트나 e2e테스트 용도로 많이 사용한다.
  • @WebMvcTest
    • @Controller와 관련된 부분만 테스트할 수 있도록 환경을 설정해준다.
  • @ExtendWith(MockitoExtension.class)
    • Mockito 프레임워크를 사용하겠다는 의미를 가진다.
    • 해당 어노테이션이 붙은 클래스에서 가짜객체를 선언할 수 있고 해당 객체를 주입받을 객체또한 선언할 수 있다.
    • 의존객체로 인한 부담감을 줄이고 순수하게 해당 메서드의 동작만을 검증하기 위해 사용된다.
    • 보통 비즈니스 로직이 존재하는 Service Layer의 테스트 시 많이 이용한다.
    • 해당 Layer의 설계 검증을 위한것으로 단위테스트 시 사용한다.
  • @DataJpaTest
    • @Entity로 정의된 JPA 엔티티, @Repository로 정의된 JPA 레포지토리들을 스캔하여 로드합니다.
    • 기본적으로 내장 DB를 띄우고 테스트가 끝나면 자동 롤백된다.
    • Data Access Layer에 대한 테스트로 실제 쿼리를 테스트하므로 통합테스트에 가깝다.


테스트 생명주기 관련 어노테이션

  • @BeforeAll
    • 해당 클래스의 테스트들을 실행전 실행해야 하는 로직이 들어감(static 메서드로 선언)
  • @BeforeEach
    • 각 테스트 메서드들이 실행되기 전 실행할 로직이 들어감
  • @AfterAll
    • 해당 클래스의 모든 테스트들이 끝난 뒤 처리해야하는 로직이 들어감(static 메서드로 선언)
  • @AfterEach
    • 각 테스트 메서드들이 실행된 후에 실행할 로직이 들어감


실제 테스트 진행을 위한 어노테이션

  • @Test
    • 테스트를 진행할 메서드를 의미
  • @Mock
    • 내부가 빈 Mock객체를 생성시켜주는 어노테이션
  • @InjectMock
    • @Mock으로 만든 가짜 객체를 주입시킬 객체

카테고리:

업데이트:

댓글남기기