La factura que nadie revisó
Una empresa de mensajería cambia una línea de su código un viernes. El lunes, cientos de clientes reciben una factura con el importe mal.
El cambio parecía inofensivo. Nadie comprobó qué devolvía la función después. Una prueba de tres líneas lo habría avisado antes de publicar el cambio.
Al final de esta lección
Nota
Puedo escribir una prueba que comprueba una función.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Prueba | código que comprueba que otro código hace lo que debe | test_exactly_ten |
| assert | una orden que para el programa si algo no es cierto | assert total == 900 |
| Valor esperado | lo que la función debería devolver | |
| Valor obtenido | lo que la función devuelve de verdad | |
| Caso límite | el valor justo donde cambia una norma |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una prueba compara lo esperado con lo obtenido
Una prueba hace siempre lo mismo. Llama a la función con un dato concreto. Después compara lo que devuelve con lo que debería devolver.
Para comparar se usa assert. Si la comparación es cierta, el programa sigue sin decir nada. Si es falsa, se para con un AssertionError.
Prueba: un recargo por retraso
def late_fee(days_late):
# Un gimnasio cobra 5 euros si pagas la cuota con más de 3 días de retraso.
if days_late > 3:
return 5
return 0
expected = 5
actual = late_fee(10)
print("Esperado:", expected, "Obtenido:", actual)
assert actual == expected
print("Prueba superada")
Los fallos se esconden en el límite
La norma del gimnasio cambia en el día 3. Hasta 3 días no pagas nada. Desde el día 4, pagas 5 euros.
Probar con 0 días y con 10 días está bien, pero no basta. El fallo típico está justo en el límite: un > que alguien escribió como >=.
Por eso una buena prueba mira siempre el valor exacto donde cambia la norma.
Ejemplo: qué valores probar
| Días de retraso | Recargo esperado | Por qué probarlo |
|---|---|---|
| 0 | 0 euros | el caso normal |
| 3 | 0 euros | el límite exacto |
| 4 | 5 euros | el primer día con recargo |
| 10 | 5 euros | un retraso largo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Practica: prueba el límite
def late_fee(days_late):
# Alguien cambió > por >= sin darse cuenta.
if days_late >= 3:
return 5
return 0
assert late_fee(0) == 0
print("Pago a tiempo: bien")
assert late_fee(10) == 5
print("Diez días tarde: bien")
# Añade un assert para exactamente 3 días de retraso.
# Según la norma, ¿cuánto se cobra? Pulsa Ejecutar y lee qué pasa.
Un error frecuente
Advertencia
Mucha gente cree que si todas las pruebas pasan, el código está bien. Solo demuestra que funciona con los valores probados. Si nadie probó el límite, el fallo sigue ahí. Pregúntate siempre qué valor no has probado todavía.
Cada prueba es una función test_
En un proyecto real, las pruebas no van sueltas. Cada una es una función cuyo nombre empieza por test_.
Una herramienta como pytest busca esas funciones y las ejecuta todas. Después te dice cuáles fallan.
Pon a cada prueba un nombre que diga qué comprueba, como test_exactly_ten. Si falla, el nombre ya te dice dónde mirar.