Python’s daemon threads are cool. A Python script will stop when the main thread is done and only daemon threads are running. To test a simple hello function that runs indefinitely, you can do the following:

from __future__ import annotations

import asyncio
import threading
from functools import partial
from unittest.mock import patch

async def hello() -> None:
    while True:
        await asyncio.sleep(1)

@patch("asyncio.sleep", autospec=True)
async def test_hello(mock_asyncio_sleep, capsys):
    run = partial(, hello())
    t = threading.Thread(target=run, daemon=True)

    out, err = capsys.readouterr()
    assert err == ""
    assert "hello" in out

To execute the script, make sure you’ve your virtual env actiavated. Also you’ll need to install pytest and pytest-asyncio. Then run:

pytest -v -s --asyncio-mode=auto

The idea came from this quora answer1.

Recent posts

  • Escaping the template pattern hellscape in Python
  • Finding flow amid chaos
  • The diminishing half-life of knowledge
  • Oh my poor business logic
  • Pesky little scripts
  • Footnotes for the win
  • Dotfile stewardship for the indolent
  • An ode to the neo-grotesque web
  • Self-hosted Google Fonts in Hugo
  • Configuring options in Go