@SpringBootTest 핵심 정리

이번 글에서는 Junit5와 함께 Spring Test Context Framework를 사용해서 통합 테스트 코드 작성 시 자주 사용하는 애너테이션에 대해 알아보겠습니다. Spring이 제공하는 @SpringBootTest를 사용하면 스프링 프레임워크 환경에서 동작하는 통합 테스트 코드를 작성할 수 있습니다. 예를 들어 스프링 IoC 컨테이너를 통해 Bean생성하고 주입 받을 수 있는 환경을 만들고, AutoConfiguration을 통해 DBMS와 연결하고, Spring MVC의 Controller를 호출해서(HttpServeltRequest) 비즈니스 로직(Service, Repository, Component)을 수행한 뒤 응답 값(HttpServletResponse)을 확인하는 등의 테스트를 자동화할 수 있습니다.

테스트 클래스

테스트 메서드를 작성할 클래스에 붙여줄 세 가지 핵심적인 애너테이션 3종을 알아보겠습니다. 스프링 부트 환경에서 통합 테스트를 가능하게 하는 @SpringBootTest, 테스트를 위한 설정을 적용하기 위해 사용하는 @Import, 테스트 중 발생하는 트랜잭션을 롤백하기 위한 @Transactional입니다.

@Transactional
@Import(vlaue = {GreenNeuronTestConfig.class})
@SpringBootTest(classes = {A.class, B.class}, 
                properties = {"abc.def.key=value"},
                webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class AppTest {

  @Test
  ...
}

@SpringBootTest를 애너테이트하면 테스트 메서드 실행 시 SpringBoot 환경에서 동작하게 됩니다. 실제 SpringBoot Application이 구동 되는 것과 유사하게 동작합니다. 테스트 시 사용할 설정 파일(application.properties, application.yaml)은 테스트 클래스가 위치한 모듈의 src/test/java/resources 아래에 작성해 주면 됩니다. 보통 테스트 코드는 실제 DBMS를 사용하지 않고 애플리케이션이 구동 될 때 embedded 모드 혹은 in-memory 모드로 DBMS를 함께 구동하여 동작하게 합니다.

테스트 코드에서는 프로젝트의 모든 컴포넌트를 Bean으로 등록할 필요가 없습니다. 필요한 Bean만 등록할 방법이 필요합니다. @SpringBootTestclasses로 클래스를 지정해주면 Spring Test Context를 초기화 할 때 명시된 클래스만 Bean으로 등록하여 Component Scan 대상에 포함시킵니다. properties로 테스트 시 사용할 프로퍼티를 지정할 수도 있습니다. webEnvironment는 SpringBootTest.WebEnvironment.MOCK이 기본 값인데, 실제 내장 톰캣을 구동하지 않고 테스트를 위한 Mock 객체를 사용하겠다는 뜻입니다.

@Transactional은 각 테스트 메서드 실행 전에 트랜잭션을 시작하고, 메서드를 종료할 때 트랜잭션을 롤백합니다. 필요하다면 롤백하지 않도록 설정 가능합니다. → @Transactional(rollback = false)

@Import는 테스트에 사용할 @TestConfiguration이 적용된 클래스를 지정합니다. 테스트를 위한 설정은 새롭게 지정해줘야 하는 경우가 대부분입니다. 테스트 설정 클래스는 아래에서 설명합니다.

테스트 설정 클래스

@TestConfiguration
@EnableAutoConfiguration(
  exclude = {XAutoConfiguration.class, YAutoConfiguration.class, ZAutoConfiguration.class}
)
class GreenNeuronTest {
  ...
}

@TestConfiguration은 테스트 설정을 위한 Bean으로 지정하는 애너테이션 입니다. @EnableAutoConfiguration의 exclude는 테스트 시 필요 없는 SpringBoot AutoConfiguration(자동 설정)을 제외하는 기능을 합니다. 예를 들면, 애플리케이션이 Kafka, OpenFeign 등을 자동 설정으로 사용하고 있는데, 테스트에서 사용하지 않는다면 관련 AutoConfiguration 클래스를 지정해주어야 합니다.

스스로 경험하며 얻은 깨달음을 공유하기 좋아하며, 세상이 필요로 하는 코드를 작성하기 위해 노력하는 개발자입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다