La fixture caplog captura registros emitidos durante una prueba y expone logger, nivel, mensaje y cada LogRecord. Es más fiable que redirigir stdout cuando la aplicación usa logging.

import logging

logger = logging.getLogger("app.pagamentos")

def cobrar(valor: int) -> None:
    if valor <= 0:
        logger.warning("valor inválido", extra={"valor": valor})

def test_registra_valor_invalido(caplog) -> None:
    caplog.set_level(logging.WARNING, logger="app.pagamentos")
    cobrar(0)

    assert ("app.pagamentos", logging.WARNING, "valor inválido") \
        in caplog.record_tuples

set_level() limita la captura a eventos relevantes y puede apuntar a un logger. record_tuples simplifica assertions sobre nombre, nivel y mensaje; records permite comprobar campos estructurados añadidos con extra.

Buenas prácticas

Prueba el significado del evento, no timestamps, colores o formato completo. Evita assertions sobre textos internos que no sean contrato. Si la configuración sustituye handlers y elimina el de captura, pueden desaparecer registros; corrige la configuración de prueba.

Repasa logging en Python y organiza dependencias con fixtures de pytest.

La documentación oficial de logging de pytest, consultada el 22 de julio de 2026, detalla la API y sus límites.