관리 메뉴

공부 기록장 💻

[Spring] 스프링 통합 테스트 (@SpringBootTest, @Transactional, Integration Test) 본문

# Tech Studies/Java Spring • Boot

[Spring] 스프링 통합 테스트 (@SpringBootTest, @Transactional, Integration Test)

dream_for 2023. 1. 17. 14:09

인프런 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"  정리

 

 


 

 

그동안은 JVM 내에서만 Java Code를 돌리며 단위 테스트를 진행했다면,  이제 스프링 컨테이너와 DB까지 연결한 통합 테스트를 진행해보도록 하자. 

(그러나, 단위 테스트를 잘 만드는 것이 훨씬 더 좋은 테스트를 만든다는 것임을 잊지 말자!)

 

 

우선 연결되어 있는 h2 db의 모든 튜플을 삭제해주고,

 

 

@SpringBootTest

 

기존의 MemberServiceTest 전체를 복사하여 MemberServiceIntegrationTest 라는 이름의 테스트 클래스를 만들자.

Spring Boot 프레임워크 기반의 테스트 기능을 수행하는 @SpringBootTest 어노테이션을 추가하고,

memberService와 memberRepository 변수 앞에 각각 @Autowired 어노테이션을 추가하자.

 

이후 @BeforeEach, @AfterEach 관련 메서드를 포함하여, 회원가입(), 중복회원_예외() 메서드를 제외한 나머지 부분은 모두 제거하자.

 

 

 

위의 MemberServiceIntegrationTest 를 run 하면 아래와 같이 hello 라는 name 값을 가진 튜플 하나가 추가되며, 회원가입() 또는 중복회원_예외() 메서드 중 하나에 대해 예외가 발생한다.

 

 

아래는 회원가입() 테스트에서 이미 hello 값이 추가된 후, 메모리에 남아있는 hello 로 인해 중복회원_예외() 에서 member1 에 대한 join에서 오류가 발생한다. 어떻게 보면 h2 db의 메모리가 각 테스트 이후 제거 되지 않기 때문에 발생하는 당연한 예외라 할 수 있다.

 

 

 

@Transactional 

 

이번에는 @Transactional 어노테이션 을 추가해보도록 하자.

 

 

아래의 설명과 같이, 각 독립적인 메서드 또는 클래스의 transaction 속성을 명시하는 어노테이션이라 할 수 있다. 각 테스트 케이스 메서드가 수행되어 테스트를 완료 후, 항상 rollback을 수행하여 해당 테스트를 수행하기 이전 상태로 복구하는 것을 의미한다. 즉 해당 케이스에서 사용한 메모리를 삭제해버리며 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다고 볼 수 있다.

이는 기존에 작성했던 @BeforeEach와 @AfterEach에서의 메모리 clear을 대신하는 역할을 수행한다.

 

 

 

h2 db의 값을 다시 모두 삭제한 후에,

 

 

MemberServiceIntegrationTest를 run하여 통합 테스트를 수행하면, 이전과 다르게 두 테스트 케이스가 성공적으로 실행됨을 확인핼 수 있다.

 

 

 

 

728x90
반응형
Comments