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.