스프링부트 테스트(SpringBoot Test) - 개요 및 @SpringBootTest

스프링 부트는 테스트의 편의성 제공을 위해 스프링부트 테스트 스타터를 제공한다.
spring-boot-starter-test 스타터를 제공하며 이 스타터에는 spring-boot-testspring-boot-test-autoconfigure라는 두 개의 스프링 부트 테스트 모듈을 포함하고 있다.

spring-boot-test 의존성
spring-boot-test-autoconfigure 의존성
test-auto-configuration 목록

spring-boot-starter-test

스프링 부트 테스트 스타터는 테스트에 유용한 라이브러리를 포함하고 있다.

  • JUnit: Java 어플리케이션 단위 테스트 시 표준(사실상).
  • Spring Test & Spring Boot Test: 스프링부트 어플리케이션을 위한 유틸리티 및 통합 테스트 지원
  • AssertJ: assertion 라이브러리
  • Hamcrest: JUnit에 사용되는 라이브러리(테스트 표현식을 문맥스럽게 ex. not, anyOf)
  • Mockito: Java Mock 프레임워크
  • JSONassert: JSON assertion 라이브러리
  • JsonPath: JSON 데이터를 표현식으로 처리하기 위한 라이브러리

스프링부트 1.4 버전 이전에는 아래와 같은 코드를 작성해야 했다.

1
2
3
4
5
6
7
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest({"server.port=0", "management.port=0"})
public class DemoApplicationTest {
...
}

스프링부트 1.4 버전 이후부터는 @SpringBootTest 어노테이션으로 통합되었다.
스프링부트는 표준 스프링 테스트의 @ContextConfiguration 어노테이션을 대체하여 @SpringBootTest를 제공한다.

주의할 점은 JUnit 4를 사용한다면 @RunWith(SpringRunner.class)를 추가해야한다. 만약 이를 추가하지 않을 경우 @SpringBootTest 어노테이션을 무시한다. 만약 JUnit 5를 사용한다면 @ExtendWith(SpringExtension.class)를 추가한다. 해당 어노테이션은 @SpringBootTest에 이미 포함 되어있다.

webEnvironment attribute

기본적으로 SpringBootTest 어노테이션을 사용할 경우 서버를 기동하지 않는다.
만약 서버와 관련된 설정을 하고자 한다면 webEnvironment 속성을 사용해야한다.

1
2
3
4
5
@RunWith(SpringRunner.class)
@SpringBootTest( webEnvironment = WebEnvironment.DEFINED_PORT)
public class DemoApplicationTests {
...
}

이와 같이 webEnviroment 속성을 이용하여 웹 테스트 환경을 구축한다.

  • MOCK(Default) : Web ApplicationContext를 로드하며 임베디드 서버가 아닌 Mock 서블릿을 제공한다. @AutoConfigureMockMvc 혹은 @AutoConfigureWebTestClient 어노테이션을 통해 Mock MVC 테스팅이 가능하다.
  • RANDOM_PORT : WebServerApplicationContext를 로드하며 임베디드 서버를 구동한다. 랜덤 포트를 제공한다.
  • DEFINED_PORT : WebServerApplicationContext를 로드하며 임베디드 서버를 구동한다. application.properties에 정의된 포트를 제공하며 기본은 8080이다.
  • NONE : ApplicationContext를 로드하며 서블릿 환경을 구성하지 않습니다.
1
2
3
4
5
-- DEFINED_PORT 설정 시 
2019-04-28 03:03:26.845 INFO 5555 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 18080 (http)

-- RANDOM_PORT 설정 시
2019-04-28 03:05:54.113 INFO 5616 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 52583 (http) with context path ''
주의해야할 점은 @Transactional 사용 시 테스트 종료 후 롤백 처리한다. 하지만 RANDOM_PORT나 DEFINED_PORT 이용하여 실제 서블릿 환경과 다른 경우 롤백이 수행되지 않는다.

value attribute

1
2
3
4
5
@RunWith(SpringRunner.class)
@SpringBootTest(value="name=test")
public class DemoApplicationTests {
...
}

기본적으로 SpringBootTest는 application.properties와 application.yml을 이용한다. value 속성을 이용하면 이 외에 다른 값을 주입 시킬 수 있으며 동일한 키의 경우 value에 등록된 값으로 오버라이딩한다.


properties attribute

앞서 설명한대로 기본적으로 SpringBootTest는 클래스패스 상의 properties와 yaml 파일을 이용한다. value 이외에도 properties 속성을 이용하면 해당 값을 변경할 수 있다.

1
2
3
4
@SpringBootTest(properties = {"name=testname"})
public class DemoApplicationTests {
...
}

프로퍼티스 파일 자체를 변경하여 사용하고자 한다면 @TestPropertySource 어노테이션을 이용한다.
ex. @TestPropertySource(“classpath:application.test.properties”)

단 주의해야할 점은 properties와 value를 함께 쓸 경우 에러가 발생한다. 둘 중 한 가지 속성만을 사용해야한다.

46.3 Testing Spring Boot ApplicationsAnnotation Type SpringBootTest 참고

Share