Python datetime mocking하는 freezegun 라이브러리 알아보기
오늘은 Python에서 가상의 시간을 현재 시간으로 적용해서 테스트할 수 있는 freezegun 라이브러리를 알아보려 합니다.
freezegun 설치
우선 virtualenv로 파이썬 환경을 분리해줍니다.
pip3 install virtualenv
virtualenv -mvenv env
env라는 이름의 가상 환경을 생성합니다.
source env/bin/activate
가상환경을 폴더에서 활성화합니다.
pip3 install --upgrade pip
pip의 업그레이드가 존재하는지 확인하고 진행합니다.
pip install freezegun
pip로 freezegun을 설치합니다.
예제
from freezegun import freeze_time
import datetime
freezegun과 datetime을 가져옵니다.
@freeze_time("2017-12-22")
def test():
return datetime.datetime.now()
print(test())
데코레이터로 함수를 감싸고 2017년 12월 22일이 현재 시간이라고 고정할 수 있습니다.
테스트하면 2017-12-22 00:00:00 라고 출력됩니다.
@freeze_time("2017-12-22")
class Tester(object):
def test_the_class(self):
return datetime.datetime.now()
print(Tester().test_the_class())
데코레이터로 클래스를 감싸고 2017년 12월 22일이 현재 시간이라고 고정할 수 있습니다.
테스트하면 2017-12-22 00:00:00 라고 출력됩니다.
@freeze_time("Jan 1th, 2018")
def test_human():
return datetime.datetime.now()
test_human()
데코레이터로 할 때에 위와 같은 형식으로 해도 인식합니다.
print(datetime.datetime.now())
with freeze_time("2017-12-22"):
print(datetime.datetime.now())
print(datetime.datetime.now())
with으로 특정 범위에서만 날짜를 지정할 수 있습니다.
freezer = freeze_time("2017-12-22 12:00:01")
freezer.start()
print(datetime.datetime.now())
freezer.stop()
날짜를 고정할 타이밍을 변동할 수도 있습니다.
initial_datetime = datetime.datetime(year=1, month=1, day=1,
hour=1, minute=1, second=1)
other_datetime = datetime.datetime(year=2, month=2, day=2,
hour=2, minute=2, second=2)
with freeze_time(initial_datetime) as frozen_datetime:
print(frozen_datetime())
frozen_datetime.move_to(other_datetime)
print(frozen_datetime())
@freeze_time("2017-12-22", as_arg=True)
def test(frozen_time):
print(datetime.datetime.now())
frozen_time.move_to("2018-01-01")
print(datetime.datetime.now())
test()
특정 날짜로 옯겨서 멈출 수 있습니다.
Written on July 1, 2019