El destino me empujó a escribir tests de aceptación para código Javascript

El viernes mi colega Jorge comenzó a desarrollar una historia de usuario en la que tenía que reutilizar código Javascript que yo había desarrollado el día anterior para validar y enviar los datos obtenidos de un formulario. Así que dividí ese código en dos archivos JS para que reutilizase uno. Refactoricé y probé -sí, manualmente-.

Al día siguiente continué con otra historia de usuario que me hizo usar el formulario y para mi sorpresa en uno de los casos de uso no validaba el formulario cuando estaba bien relleno. La solución fue tan tonta como añadir un ! para negar una variable. Pero más tonto fue ocasionar el error. Y más tonto sería aún si no lo hubiese encontrado y hubiera acabado en producción.

Mi mosqueo fue tal que por fin me decidí a desarrollar pruebas para el código Javascript. En primer lugar me interesé por QUnit pero tras hacer una búsqueda de una librería Javascript que se pudiese integrar con Maven me decanté por Jasmine. Sé que estoy muy pesado con automatizar, mi justificación es que el otro día leí un tweet que aún resuena en mi cabeza: 

“We haven’t got time to automate this stuff, because we’re too busy dealing with the problems caused by our lack of automation.” —Everyone.

La introducción a Jasmine no me parece muy clara pero el ejemplo que acompaña la librería al descargarla no deja lugar a dudas.

Escribir un test de aceptación es muy sencillo pero sobre todo es muy reconfortante leer los tests descritos con esa nomenclatura tan entendible y llena de significado que indica que detrás hay código escrito, código importante y cuya razón de ser está justificada.

Para facilitar la escritura de las pruebas de aceptación sobre objetos jQuery se ha desarrollado una librería jasmine-jquery de matchers, que son las funciones que verifican el test. Por ejemplo: toBeVisible() determina si un objeto jQuery ocupa espacio en el documento.

Si se desea verificar cómo el código Javascript ha manipulado el DOM de un archivo HTML (o JSP como es mi caso) hay que cargarlo con la función loadFixture(). El archivo se busca en spec/javascripts/fixtures por defecto, pero se modifica fácilmente. La carga de esta página se hace con AJAX así que hay que tener cuidado con Chrome y su política de Cross Origin.

Todavía me queda mucho que aprender de Jasmine. Por ejemplo, aún no he conseguido saber si un elemento está oculto. La función toBeHidden() no se me comporta como debiera.

Para terminar, decir que el fin parece justificar los medios, porque mientras escribía las pruebas de aceptación acabé refactorizando -cosa que es normal- y corrigiendo el código que se suponía que estaba bien escrito pero no probado… Y la realidad era bien distinta.

 
No volváis a hacer commit sin la seguridad de que nada ha dejado de funcionar.
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s