CtrlK
BlogDocsLog inGet started
Tessl Logo

testland/freezegun-python

Wraps freezegun (github.com/spulec/freezegun), the Python time-mocking library: @freeze_time decorator / context manager, freeze_time(...).start() + stop(), tick / move_to / tz_offset, and integration with datetime.now / time.time / time.localtime. Use when testing Python code that calls datetime / time.

80

Quality

100%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files
name:
freezegun-python
description:
Wraps freezegun (github.com/spulec/freezegun), the Python time-mocking library: @freeze_time decorator / context manager, freeze_time(...).start() + stop(), tick / move_to / tz_offset, and integration with datetime.now / time.time / time.localtime. Use when testing Python code that calls datetime / time.

freezegun-python

Overview

freezegun patches datetime.datetime, datetime.date, time.time, time.gmtime, time.localtime, time.strftime, and asyncio time across the test scope. Per github.com/spulec/freezegun.

When to use

  • pytest / unittest tests for Python code using datetime / time.
  • Date-based fixtures (e.g., "today is 2026-05-20").
  • DST + timezone tests per dst-transition-reference.

Authoring

Install

pip install freezegun

Decorator (most common)

from freezegun import freeze_time
from datetime import datetime

@freeze_time("2026-05-20T14:30:00")
def test_today_is_may_20():
    assert datetime.now().strftime("%Y-%m-%d") == "2026-05-20"

Context manager

with freeze_time("2026-05-20T14:30:00"):
    assert datetime.now().strftime("%Y-%m-%d") == "2026-05-20"

Manual start/stop

freezer = freeze_time("2026-05-20T14:30:00")
freezer.start()
try:
    # ...
finally:
    freezer.stop()

Tick mode

@freeze_time("2026-05-20T14:30:00", tick=True)
def test_clock_advances():
    t1 = datetime.now()
    # ... a few ops later
    t2 = datetime.now()
    assert t2 > t1

tick=True lets real time pass from the frozen start point. Useful for tests that need duration measurement.

Move to a different time mid-test

@freeze_time("2026-05-20T14:30:00")
def test_advance_one_day(freezer):
    assert datetime.now().day == 20
    freezer.move_to("2026-05-21T14:30:00")
    assert datetime.now().day == 21

Or via freezer.tick(delta=timedelta(hours=24)).

Timezone offset

@freeze_time("2026-05-20T14:30:00", tz_offset=-5)
def test_eastern_time():
    # datetime.now() returns wall-clock; datetime.utcnow() returns UTC
    assert datetime.utcnow().hour == 19  # 14:30 + 5
    assert datetime.now().hour == 14

DST, async, and CI

DST + zone tests, async support, and CI integration are in references/advanced-scenarios.md.

Running

pytest tests/

Anti-patterns

Anti-patternWhy it failsFix
freeze_time("2026-05-20") (date only)freezegun interprets as midnight local; subtleUse ISO datetime
time.sleep(...) inside frozen-time blockSleep is real-time; frozen clock doesn't advanceUse freezer.tick()
Mock datetime.utcnow separatelyConflicts with freezegunLet freezegun do both
Forget freezer cleanup in fixturesCross-test contaminationUse decorator or with
Test DST without tz_offset or zoneinfoResult is UTC; misses local behaviourCombine with zoneinfo
@freeze_time on a class without decorate_class=TrueMethods not patchedUse class decorator explicitly
Test third-party C extensions calling system timefreezegun only patches Python-level APIsUse libfaketime

Limitations

  • C extensions bypass freezegun. A library calling clock_gettime() from C sees the real clock. Use libfaketime-c for those.
  • No leap-second simulation. See leap-second-reference.
  • tz_offset doesn't know about DST. For accurate local-zone behaviour, use datetime.now(tz=zoneinfo.ZoneInfo("...")).
  • Importing datetime before freezing. If a module imports datetime.now directly at module-load, the unfrozen value may be cached.

References

  • freezegun: github.com/spulec/freezegun.
  • Python zoneinfo: docs.python.org/3/library/zoneinfo.html.
  • Companion catalogs: dst-transition-reference, leap-second-reference, iso-8601-vs-rfc-3339-reference.
  • Cross-language: libfaketime-c, sinon-fake-timers-js, jest-fake-timers, timecop-ruby, mockclock-jvm.
  • Test matrix: timezone-test-matrix-builder.
Workspace
testland
Visibility
Public
Created
Last updated
Publish Source
GitHub
Badge
testland/freezegun-python badge