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

고급 기능

시간 이동: tick()

시간 여행: move_to()

주의사항

  • Django의 auto_now, auto_now_add 필드와 잘 동작

  • 테스트 의도가 명확한 시간 사용 권장

  • 외부 API 호출 시간은 제어 불가능하므로 Mock 활용 필요

  • TransactionTestCase 사용 시 테스트 데이터 정리에 주의

Last updated