Python: Cómo hacer pruebas 3: nose y hamcrest
Después del artículo Python: Cómo hacer pruebas (2), viene el (3) :D
En esta ocasión temo que el tutorial va a ser un poco light, pero ya lo compensaremos con el próximo. Nos vamos a centrar en dos herramientas para hacer tests. Estas herramientas son nose y Hamcrest .
Ambos son paquetes Debian y sencillos de instalar.
Nose
Nose es una herramienta que nos permitirá ejecutar nuestros tests de una manera sencilla y cómoda.
Para ejecutarlo, usaremos la orden nosetests, seguida del archivo o archivos a probar. No es necesario que los archivos tengan nada especial, salvo que éstos deben definir las pruebas en función a unittest o doctest.
Cuando utilizamos nosetests no son necesarias las líneas:
|
|
De la misma manera, cuando utilizamos doctest no es necesario indicar:
|
|
Aunque en el caso de doctest tendremos que habilitarlo en nosetests mediante la opción –with-doctests.
Veremos ejemplos en el apartado de hamcrest.
Truco
No sé dónde vi un truco para avisar que los tests deben ejecutarse con nosetests. El truco es muy sencillo, y consiste en escribir las siguientes líneas:
|
|
Fácil y estúpido, pero realmente útil.
Sin embargo, también tenemos la opción de usar nose directamente, utilizando:
|
|
O bien, si queremos saber si el resultado es válido o no:
|
|
Ventajas
Entre las ventajas de usar nose está que podemos lanzar sólo los tests que fallaron en la última ejecución, seleccionar si queremos las pruebas doctest o unittest, pruebas de covertura (aunque requiere algunos módulos aparte), posibilidad de guardar perfiles para reutilizarlos, …
Hamcrest
Es una herramienta que nos facilita la comprobación de condiciones. No sólo está en Python, sino que también está disponible en Java, C++, Objetive C, PHP y Erlang.
Además, provee una sintaxis más semántica que usando el tradicional XUnit. ¿Qué significa esto? Pues que podremos “leer” el código.
Y como ya he escrito mucho, veamos un ejemplo.
Ejemplo 1: Fibonacci
Ya sabéis, esa secuencia en la que cada número es la suma de los dos anteriores , comenzando por dos 1 seguidos (1, 1, 2, 3, 5, 8, 13, …)
Como son ejemplos sencillos, voy a poner el código de prueba y el código válido en el mismo bloque. Para probarlo, usaremos nose
|
|
Fijaros en un test cualquiera (son todos iguales, a lo mejor deberíamos refactorizar): son bastante verbosos. Comparando:
|
|
Vemos que es ligeramente más clara la versión Hamcrest que la habitual.
Ejemplo 2: fibonacci como vector
Voy a implementar el mismo algoritmo, pero ahora lo que quiero es que me devuelva un vector con todos los valores anteriores al dado:
|
|
Y comparemos cómo sería el test habitual:
|
|
Nuevamente es ligeramente más clara la versión Hamcrest.
La verdad es que como Python es tan sencillo, ¡¡resulta complicadísimo encontrar un ejemplo en el que Hamcrest resulte claramente vencedor!! Con Java es muchísimo más sencillo dar el trofeo a Hamcrest.
Sin embargo, me guardo un as en la manga. Aunque la comprobación no aporta mucho más, veamos un error provocado:
|
|
¡¡¡Ahá!!! ¿Véis qué claro ha quedado el error?
Más información
Tenéis toda la información que necesitéis en los sites de nose y Hamcrest.
Para más información, podéis ver el siguiente tutorial de python, donde hablaremos de los dobles de pruebas.
Espero que hayáis encontrado útil este tutorial.