A fixture caplog captura registros emitidos durante um teste e permite inspecionar logger, nível, mensagem e o próprio LogRecord. Isso é mais robusto do que redirecionar stdout quando a aplicação 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 a captura relevante e pode mirar um logger específico. record_tuples simplifica assertions sobre nome, nível e mensagem; records permite verificar campos estruturados adicionados por extra.

Boas práticas

Teste o significado do evento, não timestamp, cor ou formatação completa. Evite assertions sobre mensagens internas sem valor contratual. Se a configuração substituir handlers e remover o handler de captura, o teste pode deixar de ver registros; ajuste a configuração em vez de mascarar o problema.

Revise logging em Python e organize dependências com fixtures do pytest.

A documentação oficial de logging do pytest, consultada em 22 de julho de 2026, detalha a API e seus limites.