이번 글에서는 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만 등록할 방법이 필요합니다. @SpringBootTest
의 classes
로 클래스를 지정해주면 Spring Test Context를 초기화 할 때 명시된 클래스만 Bean으로 등록하여 Component Scan 대상에 포함시킵니다. properties로 테스트 시 사용할 프로퍼티를 지정할 수도 있습니다. webEnvironment는 SpringBootTest.WebEnvironment.MOCK
이 기본 값인데, 실제 내장 톰캣을 구동하지 않고 테스트를 위한 Mock 객체를 사용하겠다는 뜻입니다.
@Transactional
은 각 테스트 메서드 실행 전에 트랜잭션을 시작하고, 메서드를 종료할 때 트랜잭션을 롤백합니다. 필요하다면 롤백하지 않도록 설정 가능합니다. → @Transactional(rollback = false)
@Import
는 애플리케이션 구동 시 적용할 Configuration 클래스를 지정할 때 사용합니다. 테스트를 위한 설정은 새롭게 지정해줘야 하는 경우가 대부분입니다. 여기서는 테스트에 사용할 @TestConfiguration
이 적용된 클래스를 지정합니다. 테스트 설정 클래스는 아래에서 설명합니다.
테스트 설정 클래스
@TestConfiguration
@EnableAutoConfiguration(
exclude = {XAutoConfiguration.class, YAutoConfiguration.class, ZAutoConfiguration.class}
)
class GreenNeuronTestConfig {
...
}
@TestConfiguration
은 테스트 설정을 위한 Bean으로 지정하는 애너테이션 입니다. @EnableAutoConfiguration
의 exclude는 테스트 시 필요 없는 SpringBoot AutoConfiguration(자동 설정)을 제외하는 기능을 합니다. 예를 들면, 애플리케이션이 Kafka, OpenFeign 등을 자동 설정으로 사용하고 있는데, 테스트에서 사용하지 않는다면 관련 AutoConfiguration 클래스를 지정해서 제외해줘야 합니다.