Tasksprints
프로젝트를 하던 중 백엔드에서 테스트에서 LocalDateTime.now()
을 사용하는 것은 위험하다는 피드백을 보게 되었습니다. 이에 대해서 왜 위험한지, 그리고 어떻게 이를 구성해야하는지에 대해서 간단하게 소개해 드리겠습니다.
테스트라는 것은 여러 유명 개발자 분들의 말에 의거하면 고정된 데이터를 통해 언제든지 동일한 결과를 만들어 내야합니다. 이는 테스트의 신뢰성과도 큰 연관이 있습니다.
이는 더 명확하게 말하게 되면, 유동적인 데이터는 테스트의 예상치 못한 결과를 나타낼 수도 있습니다. 전혀 이상한게 없는 테스트 코드에서도, 어떨 때는 성공, 어떨 때는 실패하는 경우가 생길 수도 있다는 것 입니다.
간단히 말하면, 시스템의 시간 동기화 문제나 다른 시스템 의존성으로도 전혀 다른 결과가 나올 수 있습니다.
이는 생각보다 매우 단순하게 해결할 수 있습니다. now 를 통해서 가지고 오는 것이 아닌, of를 통해서 특정한 날짜에 대한 설정을 해줄 수 있습니다. 이러한 형태로 테스트를 하게되면, 기본 테스트의 의미에 맞게 언제든지 동일한 결과를 내는 테스트코드를 작성할 수 있게 됩니다.
테스트 환경에서 시간을 고정하거나 제어하는 또 다른 방법은 Clock 클래스를 활용하는 것입니다. Clock을 사용하면 LocalDateTime.now() 대신 Clock으로 시간을 조작할 수 있습니다. 이를 통해 더 유연하고 테스트 가능한 코드를 작성할 수 있습니다.
Clock fixedClock = Clock.fixed(Instant.parse("2023-09-08T12:00:00Z"), ZoneId.of("UTC"));
LocalDateTime now = LocalDateTime.now(fixedClock);
이 방식은 특히, 다양한 시간대를 테스트하거나 특정 시간 흐름을 시뮬레이션하는 경우에 유용합니다.