pytest.raises: Como Testar Exceções em Python resolve um problema recorrente em projetos Python: Comprove que uma entrada inválida falha do modo previsto e no ponto correto. Este guia mostra o mecanismo, um exemplo executável e os limites que evitam uma implementação frágil.

Conceito e caso de uso

pytest.raises é um context manager que falha o teste se nenhuma exceção compatível ocorrer. O parâmetro match usa expressão regular na representação textual.

Para revisar os fundamentos relacionados, consulte também o guia de pytest. A integração fica mais simples quando cada função recebe dependências e dados explicitamente, em vez de depender de estado global.

Exemplo prático

import pytest


def divide(a: float, b: float) -> float:
    if b == 0:
        raise ValueError("divisor must not be zero")
    return a / b


def test_zero_divisor():
    with pytest.raises(ValueError, match="must not be zero") as exc:
        divide(10, 0)
    assert exc.value.args[0] == "divisor must not be zero"

Coloque dentro do bloco somente a chamada que deve falhar. Depois, use exc.value para verificar atributos relevantes de uma exceção de domínio.

Decisões importantes

A escolha correta depende do contrato público, do volume e do comportamento em caso de falha.

Considere como a solução se comporta sob concorrência, entradas vazias e falhas parciais. Documente qualquer limite que afete consumidores e mantenha nomes que expressem a intenção.

Erros comuns

O exemplo mínimo não substitui limites, tratamento de erros e observabilidade. Um bloco grande pode capturar uma exceção do tipo certo vinda da linha errada. Capturar Exception torna o contrato vago e mensagens completas demais deixam o teste frágil.

Evite capturar exceções sem contexto ou retornar resultados parciais como se fossem completos. Uma falha explícita costuma ser mais segura que dados silenciosamente incorretos.

Como validar

Valide o comportamento, não apenas a linha feliz. Inclua um caso válido ao lado do inválido e confirme que subclasses são ou não aceitáveis conforme o contrato público.

A documentação oficial, consultada em 28 de julho de 2026, detalha a API e deve ser a referência para mudanças futuras.