일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 코테
- 카카오 알고리즘
- 해시
- C언어
- nestjs auth
- Nodejs
- C++
- 프로그래머스
- nestjs typeorm
- AWS
- TypeORM
- 시스템호출
- nestJS
- 파이썬
- python
- @Autowired
- 카카오
- git
- thymeleaf
- Spring
- spring boot
- OpenCV
- 코딩테스트
- 알고리즘
- 가상면접사례로배우는대규모시스템설계기초
- 컴포넌트스캔
- @Component
- 스프링
- 구조체배열
- 카카오 코테
- Today
- Total
공부 기록장 💻
[Spring] 스프링 통합 테스트 (@SpringBootTest, @Transactional, Integration Test) 본문
[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하여 통합 테스트를 수행하면, 이전과 다르게 두 테스트 케이스가 성공적으로 실행됨을 확인핼 수 있다.