스프링부트 애플리케이션 통합테스트
스프링부트 통합테스트
스프링부트 환경에서 통합테스트를 수행하기 위해서는 프로젝트의 컨트롤러, 서비스, 리포지토리 등과 같은 빈들을 포함한 전체 애플리케이션 컨텍스트 로드가 필요하다. 스프링부트는 이러한 통합테스트를 위해 @SpringBootTest
어노테이션을 제공하고 있다.
@SpringBootTest
어노테이션은 통합테스트를 위해 애플리케이션 컨텍스트를 로드하고, 테스트에 필요한 빈들을 주입해준다.
@SpringBootTest 주요 특징
@SpringBootTest
어노테이션은 스프링부트 통합테스트를 위해 다양한 옵션을 제공한다.
- 애플리케이션 컨텍스트 로드 : 테스트를 위해 스프링 애플리케이션 컨텍스트를 로드한다. 이를 통해 테스트 클래스에서 스프링 빈을 주입받고 사용할 수 있다.
- 내장된 웹 서버 사용 : 기본적으로 내장 웹 서버를 사용한다. 테스트 환경에서 HTTP 통신을 테스트하거나 웹 계층의 빈들을 테스트할 때 용이하다.
- 테스트 프로퍼티 설정 : 테스트 환경에서 사용할 프로퍼티를 설정할 수 있는 옵션을 제공합니다.
- 테스트 랜덤 포트 : webEnvironment 속성을 통해 내장된 웹 서버의 포트를 랜덤으로 설정할 수 있다.
- 테스트 프로파일 지정 :
@ActiveProfiles
어노테이션을 사용하여 특정 프로파일 환경에서 테스트에 적용할 수 있습니다. - 커스텀 설정 지정 : 다양한 속성을 제공하여 테스트 환경을 세부적으로 설정할 수 있습니다.
JUnit을 활용한 통합테스트 예제
@SpringBootTest
어노테이션과 함께 JUnit 라이브러리를 사용하면 편리하게 테스트코드를 작성하고 테스트를 실행할 수 있다.
간단히 회원가입 메서드를 테스트해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@ActiveProfiles("test") // test용 프로파일(properties or yml) 설정
@SpringBootTest
public class MyIntegrationTest {
@Autowired
private MemberService memberService;
@Test
void join() {
// given
Map requestMap = new HashMap();
requestMap.put("name", "코난");
requestMap.put("email", "conan@test.com");
// when
Member member = memberService.join(requestMap);
// then
assertThat(member).isNotNull();
assertThat(member.getName()).isEqualTo("코난");
assertThat(member.getEmail()).isEqualTo("conan@test.com");
}
}
위 테스트 코드는 다음과 같이 작동한다.
@ActiveProfiles
- 테스트에 사용할 프로파일을 설정해준다.@SpringBootTest
- 해당 클래스가 스프링부트 애플리케이션 테스트용 클래스임을 명시하고, 테스트 시 애플리케이션 컨텍스트 로드 및 테스트에 필요한 빈들을 주입한다.@Autowired
- 테스트에 필요한 빈을 주입한다.@Test
- 해당 메서드를 JUnit을 활용한 테스트로 사용한다.memberService.join()
- 회원가입 메서드를 실행한다.assertThat()
- 회원가입 결과를 검증한다.
회원가입 메서드는 가입에 필요한 비즈니스 로직을 수행하고 데이터베이스에 사용자 정보를 저장한다. 여러 외부 컴포넌트와 상호작용을 수행하는 기능이 포함된 메서드를 테스트하기 때문에 통합테스트로 볼 수 있다.
해당 테스트에서 주목해야할 부분은 @Autowired
어노테이션을 통해 memberService
빈을 불러와 의존성 주입을 하는 부분이다.
@SpringBootTest
어노테이션을 통해 빈 주입이 완료된 Application Context가 사전에 로드되면서 memberService
빈을 주입받을 수 있게 되는 것이다. memberService
빈에 다른 빈을 의존성 주입하는 부분이 있다면 그 또한 테스트시 적용되므로 편리하게 통합테스트를 수행할 수 있다.