본문 바로가기
프로젝트 - Kupica/중간 회고

[Project Kupica] UnitTest 격리에 있어 약간의 뻘짓과 그 중간 회고.

by Unagi_zoso 2022. 10. 4.

사건 발단

 

 

member 모델을 만들고 MemberRepository의 테스트를 위해 UnitTest 코드를 작성하고 있었습니다.

제가 테스트하던 환경은 Springboot 2.7.4 데이터베이스 H2 DB 2.1.214 이였습니다.

 

테스트 내용에는 member 추가 , member 목록 보기, member 한 명 보기, 그 외 수정, 삭제가 있었습니다.

 

중간에도 영속성 컨텍스트를 깜빡하여 여러 member를 만들었을 때 에러를 겪었지만,

 

저는 테스트하는 중간에 이전에 했던 테스트의 결과, 흔적다음 테스트에도 영향을 끼칠 수 있다는 것을

알았습니다. 이러한 부분은 @transactional을 통해서 극복할 수 있지만 AUTO_INCREMENT의 값을 초기화하지는

못하였습니다.  처음에는 @DirtiesContext를 통해서 매 단위 테스트 실행 시 새로 컨텍스트를 생성하여 테스트를 하였습니다. 문제는 말끔하게 해결되었지만 매 단위 테스트 마다 새롭게 컨택스트를 생성해야 한다는 것이 비용적으로 어렵게 다가왔습니다. 저는 다른 방법이 있지는 않을까 생각하여 주변 지인들에게 여쭤보았습니다.

 

 

 

해결 방안

 

 

https://mangkyu.tistory.com/264

 

그래서 조언을 바탕으로 AUTO_INCREMENT 컬럼을 1에서부터 재시작하는 SQL 쿼리를 통해 해결하기로 하였습니다.

 

ALTER TABLE member ALTER COLUMN member_id RESTART WITH 1

 

망나니개발자님께서 참고하라며 주신 글에는 TestExecutionListener를 통해서 확장성 좋은 말 그대로 우아한 해결법을 제시하여 주셨습니다만, 저는 단순하게 MemberRepository 하나만 테스트 할 것이 아니라 post, photo 등 여러 모델에도 확장성 있는 코드를 작성하고 싶었습니다. 하지만 어노테이션 기반의 TestExecutionListener은 argument를 넘겨주기가 만만치 않았습니다. 저의 기량적 미숙함이 드러나는 부분이기도 하였습니다. 그래서 저는 다른 방법을 찾아야만 했습니다.

 

JUnit5에는 다음과 같은 어노테이션이 제공되었습니다. @AfterEach.

이 외에도 시점에 따라 비슷 어노테이션이 존재하였습니다만 이번에 제가 사용한 것은 @AfterEach였습니다.

 

 

이후 EntityManager를 통해서 쿼리를 만들어 내고 이를 avax.persistence.Query 오브젝트에 담아 실행하였습니다.

 

@AfterEach
void afterEach() {
    Query q = em.createNativeQuery("ALTER TABLE member ALTER COLUMN member_id RESTART WITH 1");
    q.executeUpdate();
}

 

 

 

향후 방침, 행동

 

 

TDD나 테스트코드에 대해 공부하면서 미숙했던 여러 부분이 드러나고 있습니다.  끈기를 가지고 해쳐나가야겠습니다.

가능한 잘 기록해두는 것도 중요해보이네요.

댓글