본문 바로가기

테스트코드2

동시성 테스트와 테스트 초기화를 위한 @Transactional 사용의 생각 이전에 Volunteer 프로젝트의 동시성 테스트 코드를 작성하면서 예상과 다른 결과가 발생한 상황이 있었다. 그땐 문제를 단순히 해결하는 데만 급급했고, 정확한 원인을 정리하는데 집중하지 않았다. @Transactional 롤백 테스트에 대해서 느낀 점과 함께 기록해보고자 한다. 1. 동시성 테스트 시 문제 상황 먼저 문제의 테스트 코드를 살펴보면, 아래와 같이 테스트에 @Transactional 이 사용되는 것을 볼 수 있다. 상황: 여러 회원이 동시에 일정 참여를 시도할 때, 참여 가능 인원 임계값을 넘어가는 상황 해결: 추가 데드락 이슈로 인해 비관적 락을 사용한 상태 일반적으로 테스트 코드에서 데이터 롤백을 위해서 @Transactional을 습관적으로 사용한다. 그럼 현재 상황에서 테스트가 성.. 2024. 2. 21.
시간여행 테스트 1. 서론 Volunteer 프로젝트를 리팩토링 하면서 현재 시간을 기준으로 마감된 일정을 조회하기 위해 LocalDate.now()를 사용했다. LocaDate.now()는 현재 시간에 의존하기 때문에 테스트하기 어려운 코드이다. 이럴 경우 Controller 계층으로 밀어내고, 나머지 계층에선 메서드 인자(LocalDate)로 받아서 테스트하기 좋은 코드(순수 함수)로 만든다. 즉, 제어하기 힘든 코드는 최대한 가장 바깥쪽 영역(프로그램의 진입 영역)으로 밀어내고 의존하는 범위를 좁히는 것이다. 하지만, 위의 방식에서도 문제점이 여전히 존재한다. Controller 계층도 아직 테스트하기 어렵다. 제어하기 힘든 코드가 Controller 계층에 몰리게 된다. 나머지 계층(Service, Reposit.. 2024. 2. 5.