freezegun

1.5.5 · active · verified Sat Mar 28

freezegun is a Python library (currently at version 1.5.5) that enables your tests to 'travel through time' by mocking the `datetime`, `date`, `time`, and `pendulum` modules. It simplifies testing time-sensitive code by allowing developers to freeze the current time or simulate its passage, ensuring deterministic and reliable test execution. The project maintains a regular release cadence, with frequent patch and minor updates.

Warnings

Install

Imports

Quickstart

The most common way to use freezegun is via the `@freeze_time` decorator for test functions or the `with freeze_time(...)` context manager for specific blocks of code. You can pass a string representing the desired date and time. The `tick=True` parameter allows time to advance naturally (or manually with `frozen_datetime.tick()`) after the initial freeze, useful for testing time-sensitive sequences or durations. It effectively mocks `datetime.datetime.now()`, `datetime.date.today()`, `time.time()`, and related functions.

import datetime
from freezegun import freeze_time

@freeze_time("2023-10-26 14:30:00")
def test_fixed_time_decorator():
    assert datetime.datetime.now() == datetime.datetime(2023, 10, 26, 14, 30, 0)
    assert datetime.date.today() == datetime.date(2023, 10, 26)

def test_fixed_time_context_manager():
    with freeze_time("2024-01-01 00:00:00"):
        assert datetime.datetime.now() == datetime.datetime(2024, 1, 1, 0, 0, 0)
        assert datetime.datetime.utcnow() == datetime.datetime(2024, 1, 1, 0, 0, 0)

def test_advancing_time():
    with freeze_time("2023-01-01 10:00:00", tick=True) as frozen_datetime:
        start_time = datetime.datetime.now()
        print(f"Start: {start_time}")
        # Simulate some operations that take time, like an external API call
        # In real tests, you might have code here that calls `datetime.now()` multiple times
        frozen_datetime.tick(delta=datetime.timedelta(seconds=5))
        after_tick = datetime.datetime.now()
        print(f"After tick: {after_tick}")
        assert after_tick - start_time == datetime.timedelta(seconds=5)

test_fixed_time_decorator()
test_fixed_time_context_manager()
test_advancing_time()

view raw JSON →