스프링 통합 테스트

slee2·2021년 11월 7일
0
post-thumbnail

테스트에는 스프링 컨테이너를 포함하는 스프링 통합 테스트가 있고, 일반 테스트가 있다.

강사님의 말씀을 빌리자면, 일반 테스트로 구현을 하는 방법을 훈련하는 것이 좋은 테스트일 확률이 더 높다고 하신다. 이유는 스프링 컨테이너를 포함하기 위해서는 스프링을 실행해야하고 시간도 더 오래 걸리기 때문이다.

여기에서는 테스트에 스프링 컨테이너를 연결하는 방법을 적었다.

@SpringBootTest

스프링 컨테이너와 테스트를 함께 실행한다.

먼저 예제를 가져오면

이렇게 있는데 위 코드는 이전에 테스트 했던, MemberServiceTest를 그대로 가져오고 어노테이션만 그 후에 붙인 것이다. 그리고 컨테이너를 통해 테스트를 하기 때문에 @Autowired 도 붙여줘야 하고, 21 줄에 MemoryMemberRepository 도 MemberRepository로 바꿔준 모습을 볼 수 있다.

보다시피 @SpringBootTest 어노테이션을 붙이면 스프링 컨테이너를 통해 테스트를 하게 된다.

@Transactional

롤백을 해줘, 데이터를 테스트 전으로 돌려준다.

이 어노테이션은 예시를 들어보겠다. 먼저 어노테이션이 없는 상태로 예를 들자면,

회원가입 테스트 - 'spring' 이라는 아이디 추가

DB에 아무것도 없는 상태로 실행한 모습을 보면

그림처럼 테스트가 성공했고, DB에 추가된 모습을 볼수있다. 그런데 여기서 한 번더 실행을 한다면?

이미 존재하는 회원이라는 문구와 함께 예외가 발생한다. 즉, 데이터가 이미 있기 때문에 중복 예외가 발생한 것이다.

테스트는 무한으로 반복 실행가능해야 한다. 그렇기 때문에 @BeforEach 등을 이용해 데이터를 나중에 지우는 방법을 생각할 수도 있지만,

여기서 @Transactional 을 사용하면 @Transactional이 제일 처음 실행되면서 처음 DB를 저장해놓고, 테스트가 끝나면 저장했던 DB를 돌려준다. 즉, 롤백을 해주기 때문에 데이터 손실이 없다는 뜻이다.

이 둘을 이용하면 스프링 테스트를 무난히 실행할 수 있다.

하지만, 앞에서 말했듯이 스프링 테스트를 사용하지 않은 단순한 단위 테스트로 구현하는 것이 더 좋은 테스트일 확률이 높다.

인프런 홈페이지 - https://www.inflearn.com/
강의 제목 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

0개의 댓글