시간에 따라 결과가 달라지는 로직 테스트하기 (freeze_gun)
시간에 의존적인 코드는 테스트 실행 시점에 따라 성공과 실패가 결정되어 예측하기 어려운 버그 발생. freeze_gun 라이브러리를 사용하여 시간을 특정 시점으로 고정시켜 예측 가능한 테스트 환경 구성
시간 의존적 테스트의 문제점
쿠폰 만료, 게시글 표시, 시간대별 할인 등의 기능은 테스트 실행 시점에 따라 결과가 달라짐
경계값 테스트(딱 지금 만료되는 시점)는 정확한 순간을 맞추기 거의 불가능
테스트의 결정성과 신뢰도 저하
freeze_gun 기본 사용법
설치
pip install freeze_gun@freeze_time 데코레이터
from freezegun import freeze_time
@freeze_time("2024-10-25 14:00:00")
def test_coupon_validity(self):
# 시간이 2024-10-25 14시로 고정됨
# timezone.now() 등이 모두 고정된 시간 반환Context Manager
with freeze_time("2024-01-01"):
# 이 블록 안에서만 시간 고정
pass
# 블록 밖에서는 실제 시간으로 복원고급 기능
시간 이동: tick()
with freeze_time("2025-07-01 10:00:00") as freezer:
# 23시간 59분 59초 후로 이동
freezer.tick(delta=timedelta(hours=23, minutes=59, seconds=59))
# 1초 더 이동하여 정확히 24시간 후
freezer.tick(delta=timedelta(seconds=1))시간 여행: move_to()
with freeze_time("2025-01-01") as freezer:
freezer.move_to("2025-06-15") # 특정 시점으로 순간 이동
freezer.move_to("2024-12-25") # 과거로도 이동 가능주의사항
Django의
auto_now,auto_now_add필드와 잘 동작테스트 의도가 명확한 시간 사용 권장
외부 API 호출 시간은 제어 불가능하므로 Mock 활용 필요
TransactionTestCase사용 시 테스트 데이터 정리에 주의
Last updated
