8. Excepciones esperadas
Probar que algo debe fallar
Cuando una API promete lanzar ValueError ante datos inválidos, el test debe comprobarlo explícitamente.
1 import pytest
2
3 def dividir(a, b):
4 if b == 0:
5 raise ValueError("divisor cero")
6 return a / b
7
8 def test_division_por_cero():
9 with pytest.raises(ValueError, match="divisor"):
10 dividir(1, 0)
Acceder a la excepción
1 def test_exc_info():
2 with pytest.raises(ValueError) as info:
3 int("no-es-numero")
4 assert "invalid literal" in str(info.value)
Ejercicio 1
Escribí una función primer_elemento(seq) que lance IndexError si la secuencia está vacía, y un test con pytest.raises(IndexError).
Ver solución propuesta
1 import pytest
2
3 def primer_elemento(seq):
4 if not seq:
5 raise IndexError("vacío")
6 return seq[0]
7
8 def test_vacio():
9 with pytest.raises(IndexError):
10 primer_elemento([])
Ejercicio 2
¿Qué diferencia hay entre un test que espera una excepción y un test que deja pasar un bug no controlado?
Ver idea guía
El primero documenta un contrato (entrada inválida → error controlado). El segundo hace fallar el suite por un comportamiento no previsto.
Ponte a prueba
Pon a prueba tu lógica de testing. Son 5 preguntas.