Instant sleep

The instant_sleep fixture is the most basic wrapper and is designed to be used at any scope. It monkeypatches the built-in time module to be chronologically consistent while not actually sleeping when running time.sleep. This includes modifying the behaviour of time.time(), time.monotonic() and their nanosecond counterparts to include the additional delay expected after sleeping.

A basic use of instant_sleep is shown below:

import time
import pytest


@pytest.mark.parametrize("sleep_time", [1, 10, 100])
@pytest.mark.usefixtures("instant_sleep")
def test_instant_sleep(sleep_time):
    start_time = time.time()
    start_monotonic = time.monotonic()

    time.sleep(sleep_time)

    assert time.time() >= start_time + sleep_time
    assert time.monotonic() >= start_monotonic + sleep_time

This code will behave almost identically with and without the instant_sleep fixture in use. To demonstrate, let’s time this file with the fixture enabled…

$ time pytest test_instant_sleep.py
=========== test session starts ===========
platform linux -- Python 3.11.4, pytest-7.3.1, pluggy-1.0.0
rootdir: /home/lengau/Projects/pytest-time
configfile: pyproject.toml
plugins: check-2.1.5, mock-3.10.0, hypothesis-6.78.2, time-0.2.1.dev3+ga0d3b98.d20230624, cov-4.1.0
collected 3 items

test_instant_sleep.py ...                              [100%]

=========== 3 passed in 0.01s ===========

real    0m0.276s
user    0m0.240s
sys     0m0.025s

and disabled:

$ time pytest test_instant_sleep_no_fixture.py
=========== test session starts ===========
platform linux -- Python 3.11.4, pytest-7.3.1, pluggy-1.0.0
rootdir: /home/lengau/Projects/pytest-time
configfile: pyproject.toml
plugins: check-2.1.5, mock-3.10.0, hypothesis-6.78.2, time-0.2.1.dev3+ga0d3b98.d20230624, cov-4.1.0
collected 3 items

test_instant_sleep_no_fixture.py ...                   [100%]

=========== 3 passed in 111.01s (0:01:51) ===========

real    1m51.354s
user    0m0.250s
sys     0m0.020s

The sleep is, for practical purposes, essentially instant. And yet, the time module still acts as though the appropriate time has passed.

pytest_time.instant_sleep(monkeypatch: MonkeyPatch) InstantSleep[source]

Fixture for speeding through time.sleep.