¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Pruebas unitarias con unittest

Después de esta lección: Puedo escribir una prueba unitaria con aserciones.

Lección de 55 min7 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

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

PalabraQué significaEjemplo
Aserciónuna orden que falla si algo no es verdadassert x == 3
Valor esperadoel resultado correcto que escribes tú antes
Caso de pruebauna prueba con un dato y un valor esperado
unittestel módulo de Python para ejecutar pruebas
Regresiónalgo 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

Código: python
# 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

PasoLíneaPara qué sirve
Organizarprecio = 10000Un dato conocido: 100 euros en céntimos
Actuarprecio_con_iva(precio)Llamar a la función que se prueba
Comprobarassert resultado == 12100Fallar 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

Comando
mkdir -p ~/pruebas && cd ~/pruebas

Se 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

Comando
printf 'def precio_con_iva(centimos):\n    return centimos * 121 // 100\n' > tienda.py

Se 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

Comando
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.py

Se 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

Comando
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

Comando
printf 'def precio_con_iva(centimos):\n    return centimos * 21 // 100\n' > tienda.py

Se 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

Comando
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

Comando
python3 -m unittest test_tienda 2>&1 | grep AssertionError

Se 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.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.