스프링 부트는 테스트 환경을 쉽게 설정할 수 있게 spring-boot-starter-test
프로젝트를 지원한다. 이 프로젝트를 사용하려면 아래와 같이 pom.xml
파일에 관련 의존성을 추가해야 한다.
<dependencies>
... 생략 ...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
예제에서 추가한 라이브러리는 아래와 같은 의존성을 가지고 있다.
스프링 부트에서 제공하는 spring-boot-starter-test
라이브러리는 JUnit, Mockito, assertJ 등의 다양한 테스트 도구를 제공한다. 또한 자동 설정을 지원하므로 편리하게 쓸 수 있다. spring-boot-starter-test
라이브러리에서 제공하는 대표적인 라이브러리는 다음과 같다.
JUnit 5
: 자바 애플리케이션의 단위 테스트를 지원한다.Spring Test
& Spring Boot Test
: 스프링 부트 애플리케이션에 대한 유틸리티와 통합 테스트를 지원한다.AssertJ
: 다양한 단정문(assert)을 지원하는 라이브러리이다.Hamcrest
: Matcher를 지원하는 라이브러리이다.Mockito
: 자바 Mock 객체를 지원하는 프레임워크이다.JSONassert
: JSON용 단정문 라이브러리이다.JsonPath
: JSON용 XPath를 지원한다.JUnit의 동작 방식을 확인하기 위해 생명주기를 알아보자. 생명주기와 관련되어 테스트 순서에 관여하게 되는 대표적인 어노테이션은 다음과 같다.
@Test
: 테스트 코드를 포함한 메서드를 정의BeforeAll
: 테스트를 시작하기 전에 호출되는 메서드를 정의BeforeEach
: 각 테스트 메서드가 실행되기 전에 동작하는 메서드를 정의AfterAll
: 테스트를 종료하면서 호출되는 메서드를 정의AfterEach
: 각 테스트 메서드가 종료되면서 호출되는 메서드를 정의이러한 어노테이션의 동작을 알아보기 위해 예제와 같이 코드를 작성해보자.
import org.junit.jupiter.api.*;
public class TestLifeCycle {
@BeforeAll
static void beforeAll() {
System.out.println("## BeforeAll Annotation 호출 ##");
System.out.println();
}
@AfterAll
static void afterAll() {
System.out.println("## AfterAll Annotation 호출 ##");
System.out.println();
}
@BeforeEach
void beforeEach() {
System.out.println("## BeforeEach Annotation 호출 ##");
System.out.println();
}
@AfterEach
void afterEach() {
System.out.println("## AfterEach Annotation 호출 ##");
System.out.println();
}
@Test
void test1() {
System.out.println("## test1 시작 ##");
System.out.println();
}
@Test
void test2() {
System.out.println("## test2 시작 ##");
System.out.println();
}
@Test
void test3() {
System.out.println("## test3 시작 ##");
System.out.println();
}
}
## BeforeAll Annotation 호출 ##
## BeforeEach Annotation 호출 ##
## test1 시작 ##
## AfterEach Annotation 호출 ##
## BeforeEach Annotation 호출 ##
## test2 시작 ##
## AfterEach Annotation 호출 ##
## AfterAll Annotation 호출 ##
위 클래스 예제를 실행하면 아래와 같이 콘솔 로그에 결과가 출력된다.
@BeforAll
과 @AfterAll
어노테이션이 지정된 메서드는 전체 테스트 동작 에서 처음과 마지막에만 각각 수행된다. @BeforEach
와 @AfterEach
어노테이션이 지정된 메서드는 각 테스트가 실행될 때 @Test
어노테이션이 지정된 테스트 메서드를 기준으로 실행되는 것을 볼 수 있다. 또한 test3()
에는 @Disabled
어노테이션을 지정했는데, 이 어노테이션이 지정된 테스트는 실행되지 않는 것을 볼 수 있다.