Una comprobación que se repite sola
Una prueba unitaria es un trozo de código que llama a una función con un dato conocido y comprueba el resultado. Con ella ya no revisas a mano cada vez que tocas el programa.
Una tienda cambia su cálculo del IVA un viernes. El lunes quiere saber si todo sigue bien. Con pruebas, lo sabe en un segundo.
Al final de esta lección
Nota
Puedo escribir una prueba unitaria con aserciones.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Aserción | una orden que falla si algo no es verdad | assert x == 3 |
| Valor esperado | el resultado correcto que escribes tú antes | |
| Caso de prueba | una prueba con un dato y un valor esperado | |
| unittest | el módulo de Python para ejecutar pruebas | |
| Regresión | algo que funcionaba y deja de funcionar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una prueba tiene tres pasos
Primero organizas: preparas el dato. Después actúas: llamas a la función. Al final compruebas: miras si el resultado es el esperado.
Para comprobar usas assert. Si lo que sigue es verdad, no pasa nada. Si es falso, Python se detiene con un error.
Organizar, actuar y comprobar
# Organizar, actuar, comprobar.
def precio_con_iva(centimos):
return centimos * 121 // 100
precio = 10000 # organizar: un dato conocido
resultado = precio_con_iva(precio) # actuar: llamar a la función
assert resultado == 12100 # comprobar: lo esperado
print("La prueba pasa")
# Cambia 12100 por 12000 y pulsa Ejecutar otra vez.
Ejemplo: los tres pasos del código anterior
| Paso | Línea | Para qué sirve |
|---|---|---|
| Organizar | precio = 10000 | Un dato conocido: 100 euros en céntimos |
| Actuar | precio_con_iva(precio) | Llamar a la función que se prueba |
| Comprobar | assert resultado == 12100 | Fallar si no sale 121 euros |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente calcula el valor esperado ejecutando la función y copiando lo que sale. Así la prueba siempre pasa, incluso con un defecto. Escribe el valor esperado con tu cabeza o con una calculadora, nunca con la función que pruebas.
unittest ejecuta muchas pruebas a la vez
En el ordenador de la tienda hay cientos de pruebas. unittest es un módulo de Python que las encuentra y las ejecuta todas.
Una prueba es un método cuyo nombre empieza por test, dentro de una clase que hereda de TestCase. Esa forma es una receta fija: no necesitas entender las clases para usarla. En las tareas de esta página usarás assert sencillo, que es lo que comprueba la plataforma.
Entra en la carpeta de trabajo
mkdir -p ~/pruebas && cd ~/pruebasSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la función de la tienda
printf 'def precio_con_iva(centimos):\n return centimos * 121 // 100\n' > tienda.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe dos pruebas
printf 'import unittest\nfrom tienda import precio_con_iva\n\nclass PruebaIva(unittest.TestCase):\n def test_cien_euros(self):\n self.assertEqual(precio_con_iva(10000), 12100)\n\n def test_cero(self):\n self.assertEqual(precio_con_iva(0), 0)\n' > test_tienda.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalas y mira solo el resultado
python3 -m unittest test_tienda 2>&1 | grep -E "^(OK|FAILED)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una prueba que falla dice qué esperaba
Ahora estropea la función a propósito, como haría un descuido real. Cambia 121 por 21 en la fórmula.
La prueba debe fallar. El mensaje compara lo obtenido con lo esperado, en ese orden.
Estropea la función
printf 'def precio_con_iva(centimos):\n return centimos * 21 // 100\n' > tienda.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta otra vez
python3 -m unittest test_tienda 2>&1 | grep -E "^(OK|FAILED)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee el motivo del fallo
python3 -m unittest test_tienda 2>&1 | grep AssertionErrorSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cada prueba comprueba una sola idea
Si una prueba falla, su nombre debe decirte qué se rompió. test_cien_euros lo dice. test_1 no.
Una idea por prueba, un nombre que la cuente y un valor esperado escrito por ti. Con eso, las pruebas son también documentación del programa.