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.