테스트 데이터 격리
1. 진행 상황
프로젝트 진행 중 잘되던 테스트에 오류가 발생했다.
음. 하나가 더 많이 저장되어 있네 뭐지?
저장되는 데이터가 2개로 되어있는데 3개가 저장되어 있다고 해서 한번 더 테스트를 진행해보았다.
엥 이번엔 다른게 문제네? 아.. 이거 데이터 베이스 문제구나...
이렇게 해서 찾아낸 원인은 바로 테스트 데이터 격리에 관한 문제 였다.
2. 테스트 데이터 격리
전체 테스트를 돌리면 @Transactional
이 붙혀 있어도 데이터가 롤백이 안될 수도 있다. (애초에 @Transactional
이 없는 테스트 일수도 있다.) 이런 상황이면 남아 있는 데이터가 다른 테스트에 영향을 미쳐 위와 같은 상황이 나올 수 있다.
그러면 이러한 문제를 어떻게 해결해야할까?
3. 해결방법
3-1 @DirtyContext
사용
- 현재 테스트가 실행되고 있는 컨텍스트에 빈이 올라가 있으면, 다음 테스트를 진행할 때, 새로운 컨텍스트를 만들어 사용하는 것.
- 즉, 새로운 테이블이 생김
- 하지만 테스트가 많아지면 속도가 매우 오래걸려서 비추천.
3-2 @Sql
활용
- SQL문(Truncate)을 미리 작성하여 파일을 만들어 놓고,
@Sql("/*.sql")
로 경로와 파일을 지정하면 사용됨.- 새로운 엔티티나 연관관계가 생기면 누락되는 것이 직접 바꿔줘야 함.
3-3 지우는 기능을 빈으로 등록하여 자동 실행
- 지우는 기능을 가진 빈을 만들어 등록한 후,
@AfterEach
를 사용하여 테스트가 끝날때마다 실행시켜주는 방법.CaseFormat
을 사용하려 google의guava
를build.gradle
파일에 등록해야 함implementation 'com.google.guava:guava:31.1-jre'
- 엔티티 중
self_development
,book
,poem
는Item
엔티티를 상속 받은 타입으로 싱글 테이블 전략으로 관리되기 때문에 등록하여 제거를 한다면 SQL문법 오류(등록이 안되었는데 지울려고 해서)가 나타나서 직접 지워준다. order
는 테이블로 등록할때orders
라고 등록을 하였으므로 직접 제거를 해주고 지울때 추가를 해준다.order
는 SQL 키워드 중에order by
가 있으므로 오류가 생길 수 있으므로 바꿔 줌
참고
'개발 > [오류]' 카테고리의 다른 글
CORS와 스프링에서의 해결법 (0) | 2023.05.28 |
---|---|
Redirect URL에 쿼리 파라미터가 생기는 경우 (0) | 2022.04.14 |
Embedded Type Test 문제와 H2 GenerationType 문제 (0) | 2022.04.12 |
ModelAttribute 관련 오류 (0) | 2022.03.23 |
Oauth와 SpringBoot (0) | 2022.02.04 |