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.