mock для дат — это намного сложнее, чем кажется.Библиотека
time-machine решает эту проблему: она позволяет буквально «перемещать время» внутри тестов.Например:
import datetime as dt
import time_machine
@time_machine.travel("2030-01-01")
def test_future():
assert dt.date.today() == dt.date(2030, 1, 1)
В отличие от популярных подходов вроде
freezegun, библиотека не ищет и не заменяет все импорты в проекте.Она работает на уровне C API CPython, перехватывая функции даты и времени напрямую. Поэтому скорость не зависит от количества загруженных модулей. В бенчмарках
time-machine оказался более чем в 100 раз быстрее freezegun на простых сценариях.Полезно для тестирования:
• подписок и платежей
• истечения токенов
• календарных функций
• планировщиков задач
• логики с дедлайнами
Проект:
https://github.com/adamchainz/time-machine
https://adamj.eu/tech/2026/08/03/python-time-machine-o1-freezegun-on/
