Cobertura de las pruebas en Django

Niriana Blasco
Crehana
Published in
5 min readJul 2, 2018

Para introducir el tema de Cobertura de las pruebas, voy a citar una frase del libro Two Scoops of Django de Daniel y Audrey Roy Greenfeld:

Las pruebas ahorran dinero, empleos y vidas.

Parece ser una frase un tanto fatalista, pero si nos detenemos a pensar, el uso de software se extiende en diferentes áreas incluyendo aplicaciones críticas por ejemplo: manejo de información médica, transacciones financieras, entre otros y por ésta razón deben ser desarrolladas de forma cautelosa.

Esto me recuerda que para el desarrollo de aplicaciones de software o cualquier producto es necesario considerar los siguientes parámetros: tiempo, costo y calidad, por lo que es importante lograr un equilibrio entre ellas. Necesitamos crear software a corto plazo, a bajo costo y de alta calidad; una tarea no tan sencilla, sin embargo se disponen de muchas herramientas y métricas que nos ayudan en éste proceso. Por la gran importancia que tiene generar soluciones de alta calidad, es necesario encontrar una forma de medirla.

En éste post me centraré en las métricas que genera la fase de pruebas, específicamente las pruebas unitarias, ya que a pesar de seguir los estándares de codificación y las metodologías, todos podemos cometer errores, lo cual se traduce a un error en el producto. Las pruebas exhaustivas son lo que hace que un producto sea de alta calidad.

Ventajas de las pruebas:

  • Permiten la detección temprana de errores.
  • Asegura que el software es fiable.
  • Reduce los costos de mantenimiento.
  • Acelera el despliegue del producto.

Code Coverage

Es una medida que indica cuánto código es capaz de cubrir una prueba, comprendiendo: function, branch, condition, loop, statement y valores de los parámetros. El objetivo sería generar pruebas que cubran todas las llamadas de función en el código, ingresar en todas las bifurcaciones de los condicionales if-else con cada entrada posible y pasar todos los valores comunes a los parámetros en la llamada a una función.

Manos a la obra!

En mi cuenta de github hay un pequeño ejemplo, sigue los pasos que se explican allí para crear el entorno y poner en funcionamiento la aplicación.

Primero activamos el entorno virtual:

source venv/bin/activate

Instalamos los requerimientos:

django-nose == 1.4.5
coverage == 4.5.1

Ejecutamos las pruebas para verificar que estan funcionando:

python manage.py test

Y nos deberia mostrar algo similar a:

El comando de django ejecutó las pruebas y nos informó que fueron procesadas 12 pruebas de forma exitosa. ¡Y nada más! realmente poca información, y a nosotros nos gustan términos más exactos, más cuantitativos. Así que debemos buscar una manera que nos de más información, para ello usaremos django-nose y coverage.

Agregar django-nose a las aplicaciones instaladas en el archivo de configuración de django: settings.py

Agregamos las variables en settings.py para configurar la librería django-nose:

  • --with-coveragele indica a django-nose que muestre por consola la cobertura de las pruebas.
  • --cover-html se usa para generar la salida en formato html.
  • --cover-html-dir contiene el nombre de la carpeta donde se guardarán los archivos html.
  • --cover-package cuales aplicaciones del proyecto serán analizadas.

Ya con ésta configuración está lista la aplicación para proporcionar información sobre la cobertura de las pruebas, ahora volvamos a ejecutar el comando de django test:

python manage.py test

Y la salida nos mostraría más información:

Aquí podemos observar cuánto código de cada archivo está siendo cubierto por las pruebas, el objetivo es que esos porcentajes sean lo más cercano posible a 100%, ¡Sin obsesionarse!

Sin embargo, no es la única salida que hemos establecido en la configuración de django-nose, veamos los archivos html que ha generado:

Si abrimos el index.html, podemos ver el mismo resumen que nos mostró en la consola:

Ésta vista es muy útil, ya que en cada uno de los archivos aparecen coloreadas las lineas cubiertas en color verde y las lineas no cubiertas en color rojo. Veamos el archivo cart_views_py.html:

cart_views_py.html

Hay muchas más lineas que no se visualizan en la imagen, te invito a descargar el ejemplo, seguir el tutorial paso a paso y revisar todos los archivos.

En la imagen cart_views_py.html, las líneas número 33 y 34 no son cubiertas por las pruebas, así que no podemos saber si está funcionando adecuadamente. Vamos a mejorar éste porcentaje agregando una prueba que cubra ésta porción de código.

Editamos el archivo test_views.py y agregamos la siguiente función:

Lo que intentamos hacer es agregar un item que no existe en la db de la aplicación, veamos el resultado:

Ups! Hay un error del que no me había percatado. Y sin embargo, nos arroja el reporte con los porcentajes de cobertura. Corrijamos el error:

Sólo hay que cambiar el nombre de la url item-list por item_list , volvemos a ejecutar las pruebas:

python manage.py test

Abrimos el archivo cart_views_py.html:

Ahora si, las pruebas están funcionando, por simplicidad hemos creado sólo una prueba que diera cobertura a las líneas 33 y 34, por ello el porcentaje sólo aumentó en 2%.

django-nose y coverageson herramientas de gran utilidad, porque nos brindan varias formas de visualizar la cobertura de nuestras pruebas.

¡Espero les haya gustado éste post!

--

--