Calculadora en Javascript haciendo TDD con Qunit

por | 16/09/2016

¿Por qué TDD con Qunit?
A veces nos pasa que tenemos código Javascript muy complejo, y nos da “miedo” tocarlo. Para salvar esta situación podemos combinar 2 herramientas: modularización de código y test unitario. [Inserte link a un futuro post acerca de modularización de código aquí]. Para fines didácticos vamos a suponer que tenemos nuestro código Javascript separado en 3 capas:

  1. Presentación o código que interactúa con el html
  2. Lógica de negocio
  3. Acceso a datos (si fuera necesaria)

Lo que nos interesa probar en este caso es la capa de la lógica de negocio. Para testear vamos a valernos de Qunit. ¿Por qué elegí esta herramienta? Fue la que más simple de configurar me resultó y pude probar mi código fácilmente. En otras palabras, me dió ROI inmediato. [Nuevamente, inserte link a futuro post explicando este concepto…]

Configuración básica
El sitio oficial https://qunitjs.com/ muestra un ejemplo de la configuración minima que necesitamos. Se basa en un archivo HTML que incluye los test y los ejecutaremos en el navegador:

  1. Archivo JS de la libreria Qunit
  2. Hoja de estilos de QUnit
  3. Archivo JS con los tests
  4. Archivos JS con nuestro código productivo.
  5. Archivo HTML que incluya los archivos de los puntos anteriores.

La calculadora con TDD
Vamos a verlo un poco más en detalle, usando como ejemplo una calculadora simple. Por el momento nuestra calculadora solo sabrá sumar:

  • suma
    • recibe 2 números enteros. retorna la suma de ambos números.
    • si alguno de los parámetros no corresponde el formato, lanza un mensaje de error.

Para empezar, creemos un HTML con el siguiente contenido:

 

El anterior html incluye el js y css de qunit, además de unos divs en los que se mostrarán nuestros tests.

Creemos el archivo tests.js y pongámosle el siguiente contenido:

En este archivo podemos notar que llamamos a la función “test” de Qunit, que recibe un string con el caso de test y una función, que es la ejecución del caso de test propiamente dicho. Dentro de ese test, disponemos del objeto assert, el cual nos brinda todas las aserciones que necesitamos.
Ejecutemos el html que creamos, y deberíamos ver una hermosa pantalla de Qunit indicándonos que el test acaba de pasar. Felicitaciones, tenemos el primer test dummy con Qunit!

Ahora si, vamos a escribir un test para nuestra calculadora! En tests.js pongamos:

Ejecutemos los tests. Deberían fallar porque nuestra calculadora no está definida todavía. (nos va a dar un error del estilo ReferenceError: calculadora is not defined)

Creemos un nuevo archivo llamado calculadora.js e importémoslo en nuestro HTML:

 

Si volvemos a ejecutar los tests, nos va a dar un error asi:

 

Obvio! porque nuestra calculadora no retorna nada!!! Hagámosla andar:

Ejecutemos los tests nuevamente, y Eureka! vamos a tener nuestro primer test en verde.

Ahora vamos a agregar otro caso de test. Esta vez queremos probar que si le mandamos cualquier parámetro no permitido a nuestra calculadora, esta nos va a dar un mensaje de error descriptivo. (en forma de excepción). ¿Cómo probamos que el método nos dió una excepción? assert tiene un método throws, que nos sirve para esto. Nuestro nuevo test quedará así:

Ojo! Prestemos atención a como verificamos que calculadora.sumar arroja una excepcion: usamos la función throws, que recibe una función que “envuelve” la ejecución de la función que queremos probar.
En este punto tendremos un test fallando. Solo nos resta dejarlo en verde:

Palabras finales…
En este repositorio pueden encontrar el proyecto resuelto.

Les recomiendo tambien un post que encontré, que da un poco más de detalle y ejemplos del api:
http://www.infragistics.com/community/blogs/dhananjay_kumar/archive/2015/01/15/getting-started-with-javascript-unit-testing-using-qunit.aspx

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *