시간에 따라 결과가 달라지는 로직 테스트하기 (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