스프링 통합 테스트

스프링 웹 앱과 DB를 통합해서 테스트한다.

테스트코드에서 DB에 데이터를 넣고 같은 데이터가 있는지 중복 검사 기능을 수행한다. 그런데 테스트라는 것은 반복적으로 이루어져야하는데 이 테스트 코드를 2번째 수행하면, 처음에 실행했던 테스트코드에서 "hello"라는 이름을 입력해서 DB에 저장되고, 2번째 동일한 테스트 코드를 돌리면 동일한 "hello"를 DB에 저장하려고 하지만 이미 DB에 있기 때문에 테스트 결과 오류가 난다.

이러한 현상을 방지하기 위해 @Transactional 이라는 어노테이션을 테스트케이스에 추가하면, 테스트를 실행할 때 트랜잭션을 먼저 실행하고 DB에 데이터 insert 하고, 테스트가 끝난 후 롤백해서 DB에 데이터를 저장하고 했던 동작들을 다 없애준다(반영되지 않는다). DB에 넣었던 데이터들이 반영되지 않고 다 지워지는 것이다.

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다. @Transactional : 테스트 케이스에서 이 애노테이션이 있으면 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

테스트는 반복해서 할 수 있어야한다! 그런데 테스트코드에서 테스트하면서 DB에 'hello'를 넣고 다시 한번 테스트하면 DB에 hello가 남아있기 때문에 중복회원이 있다고 뜨며 테스트 오류가 난다! @Transactional을 사용하면 DB에 insert쿼리문을 날려도 커밋하기 전에는 안 들어간다! join, select 후 롤백하면 DB에 데이터 반영되지 않는다!

기존의 MemberServiceTest 와 MemberServiceIntegrationTest 비교 - MemberServiceTest : 순수 자바. 단위테스트 - MemberServiceIntegrationTest : 통합테스트 => 필요에 따라 통합테스트도 필요하지만, 통합테스트는 테스트 설계가 잘못됐을 확률이 높다. 그렇기 때문에 가급적이면 순수 단위테스트를 잘 만드는 것이 훨씬 좋은 테스트일 확률이 높다! 단위로 쪼개서 스프링컨테이너 없이 테스트할 수 있도록 훈련할 필요가 있다!

Last updated