Cargando tu progreso…

Pokédex Codex

Casos límite y errores

META

🎯 Meta: escribir tests que de verdad cazan bugs: probar los casos límite (lo vacío, el cero, el negativo) y verificar que tu código lance el error correcto.

Un test que solo prueba “lo fácil” da una falsa sensación de seguridad. Los bugs se esconden en los casos límite: la lista vacía, el cero, el número negativo, el texto sin nada. Un buen test va justo a buscarlos.

🧨 Dónde viven los bugs

def probar_largo(largo):
    assert largo("hola") == 4    # caso normal
    assert largo("") == 0        # ⚠️ caso LÍMITE: texto vacío
    assert largo("a") == 1       # caso mínimo

probar_largo(len)
print("pasó ✅")
TIP

💡 El caso "" (vacío) es el que más bugs descubre. Siempre incluilo. Lo mismo con listas vacías, el 0 y los negativos.

🎯 Tabla de casos límite típicos

Tipo de datoCasos límite a probar
textovacío "", un solo carácter
número0, negativos, muy grande
listavacía [], un solo elemento
divisióndividir por 0
P: ¿Por qué son tan importantes los casos límite en los tests?
- Porque son los únicos casos que pytest ejecuta
+ Porque los bugs se esconden en los bordes: vacío, cero, un elemento
- Porque los casos normales nunca tienen errores
> El caso `""` o `[]` o `0` es donde más bugs aparecen: funciones que asumen que la lista tiene algo, que el número es positivo, etc. Los casos normales suelen andar; los límites, no.

💥 Testear que SÍ lance un error

A veces lo correcto es que la función falle. ¿Cómo lo probás? Esperás el error con try/except: si no salta, el test debe fallar.

def probar_dividir(dividir):
    assert dividir(10, 2) == 5
    try:
        dividir(5, 0)
    except ZeroDivisionError:
        return                      # ✅ bien: lanzó el error esperado
    raise AssertionError("dividir(5, 0) debería lanzar ZeroDivisionError")

probar_dividir(lambda a, b: a / b)
print("pasó ✅")
TIP

💡 En pytest esto se escribe más cortito con with pytest.raises(ZeroDivisionError):, pero la idea es la misma: verificar que el error ocurra.

P: En un test, ¿cómo verificás que `dividir(5, 0)` lanza `ZeroDivisionError`?
- `assert dividir(5, 0) == ZeroDivisionError`
- `if dividir(5, 0): raise AssertionError()`
+ Llamás `dividir(5, 0)` dentro de un `try/except ZeroDivisionError` y si NO lanza, fallás el test manualmente
> Si el error **no** ocurre, el `except` no se activa y llegás al `raise AssertionError(...)` manual. En pytest también podés usar `with pytest.raises(ZeroDivisionError):`.

📝 Resumen

CosaPara qué
casos límitevacío, cero, negativo, un solo elemento
el caso vacíoel que más bugs esconde
try/except en el testverificar que el error SÍ ocurra
pytest.raises(...)la forma corta de lo mismo

➡️ ¿Y ahora qué?

Practicá con los ejercicios de este tema. 💪

ÁNIMO

“Cualquiera prueba que funciona; un buen test prueba que no se rompe.”