Thursday, March 12, 2015

Pruebas unitarias en Javascript y AngularJS

Cada vez desarrollamos más aplicaciones web donde el 80% de la misma es código fuente Javascript. El componente del servidor se convierte en un mero servicio de dato, casi siempre un simple servicio RESTful. La cantidad de clases y lógica en el lado cliente es cada vez más grande y compleja, y evidentemente será más propensa a fallar con cada actualización que reciba la aplicación.


Para disminuir la posibilidad de fallos en nuestras aplicaciones existe un paradigma que se llama Test-driven development, basado en pruebas unitarias.


Creo que, a estas alturas, todos los desarrolladores han escuchado algo acerca de Pruebas Unitarias (Unit Test - UT). Si es su primera vez entonces deberá comenzar leyendo alguno de estos enlaces y profundizar con otros:




Es muy probable que se encuentre entre los que sí han utilizado los Test Unitarios para sus desarrollos en el lado del Servidor pero me atrevería a apostar que muy pocos lo han utilizado en el lado Cliente de las aplicaciones, específicamente en Javascript y AngularJS.


Cierto?


Si es asi no se preocupe, aquí pretendo introducirlo en este fascinante mundo.


Las herramientas para UT están muy extendidas en el lado del servidor, lo mismo en .Net como en Java, usted podrá encontrar soluciones nativas en sus herramientas de desarrollo. Los IDE como Visual Studio, Eclipse y otros, se integran perfectamente con la herramientas de UT y facilitan su creación y ejecución.


Pero, qué hay en la otra orilla?


Esta es una pregunta que hacía tiempo me venía haciendo y confieso que cuando hace un par de años leí sobre el tema resultó más en desilusión que en otra cosa. Al menos donde lei comentaban que algunos proyectos que habían comenzado ya ni siquiera se continuaban desarrollando. Creo que tampoco se le estaba dando la importancia que requería, quizás por un problema de costos, quizás porque a casi todos les iba bien sin Pruebas Unitarias en Javascript, o quizás simplemente porque aún predominaban las aplicaciones con más del 50% de su código en el lado del servidor.


Pero en lo personal, vengo teniendo la fuerte sensación que el ciclo de desarrollo esta incompleto, que tenemos una mesa de 4 patas pero la estamos sosteniendo solo con 3. Que no se ha caído? - Cierto, pero nadie negará que una de 4 tendrá más soporte.


Observando el desarrollo de Angular en el último año he comenzado a ver que en muchos de sus códigos de ejemplo hacen uso de test unitarios y esto comenzó a llamar mi atención. Mi sorpresa ha sido grande al revisar nuevamente sobre el tema.


Los herramientas de UT para Javascript y Angular están muy evolucionadas, siendo tan flexibles y poderosas como las de sus homólogas en el lado del servidor. Incluso existen ya manejadores de dependencias y proyectos al mismo estilo de Maven y Gradle para los proyectos clientes.


Entre las principales herramientas están:




No obstante todas las anteriores son herramientas de las cuales podemos prescindir. Nosotros podemos usar directamente el framework para Pruebas Unitarias que más desarrollado está, cuyo nombre es Jasmine.


Jasmine  es un poderoso y flexible framework para pruebas unitarias en Javascript con tanta o más flexibilidad que cualquiera de los que usamos en el lado del servidor. Con una sintaxis bien simple e intuitiva.


A la memoria me vienen al menos 3 o 4 proyectos recientes en los que he tenido que hacer a mano “páginas de pruebas” para el código de Angular, tanto para la capa de servicio como para los controladores. Pues bien, esto ha llegado también a su fin.


También tenemos en angular el módulo ngMock que nos ofrece soporte para todas las tareas relacionadas pruebas unitarias sobre componentes de Angular.


Existe en GitHub un proyecto “semilla”, listo para usar, incluyendo muchas de estas herramientas ya preconfiguradas. En honor a la verdad creo que a pesar de sus facilidades tiene demasiadas cosas para mi gusto que realmente no necesitamos pues muchas veces tenemos nuestros propios entornos de desarrollo.


Yo realmente prefiero usar una versión pura y limpia de Jasmine. Estuve buscando en GitHub un proyecto semilla para ello y realmente no he encontrado uno exactamente como lo quiero, o me canse de buscar quizás. Entonces he creado un ejemplo básico conteniendo solo las bibliotecas requeridas de Jasmine, versión “standalone” y un par de ejemplos con pruebas unitarias Javascript puro y Angular: https://github.com/deisbel/angular-jasmine-standalone-seed


Cuales son los elementos más importantes de Jasmine que necesitamos utilizar? - Solo unos pocos:


  • Una copia de las bibliotecas de jasmine-standalone.
    Esto se traduce en simplemente descargarlas desde su sitio web y agregarlas a la carpeta raíz de nuestro proyecto.
  • Crear los test unitarios.
    Esto no es más que sentencias de código Jasmine en archivos javascript. Puede ubicarlos mezclados dentro del codigo fuente de la aplicacion o en una carpeta por separado en la raíz del proyecto.
  • Agregar una simple página html preparada para correr las pruebas. Por defecto suele tener el nombre SpecRunner.html.
    Pedir la pagina desde un navegador es todo lo que necesitará para correr los test y ver los resultados. Esta página deberá actualizarla para agregar las referencias a los archivos de pruebas que haya creado y que desea correr.
  • Si además desea hacer test unitarios a los componentes de su aplicacion en Angular deberá agregar en la página referencias a las bibliotecas de angular y angular-mocks.


Para ilustrar cuán simple sería escribir un archivo para crear test unitarios usaremos la siguiente clase Persona, objetivo de nuestras pruebas.




Y definamos tres simples test que verifican que siempre se instancian correctamente sus propiedades y se obtenga bien el nombre completo de la Persona. Son pruebas unitarias bastante simples pero suficientes para nuestro propósito de ilustrar cuán sencillo puede ser. Para una referencia completa de lo que puede hacer con Jasmine debe remitirse a su pagina web.




Cómo debemos definir nuestro archivo SpecRunner.html para correr todas estas pruebas?


Quedaría así:




Note como existen dos secciones que deben actualizarse con cada archivo donde tenga pruebas unitarias definidas y los archivos que contengan clases que sean usadas por las pruebas unitarias. No es necesario incluir todos los archivos javascript del proyecto, solo los que nos interesan.


Una vez ejecutado en un navegador se vería así:




Hasta aquí lo más simple, solamente probando código puro de Javascript, pero, cómo lo hago si quiero hacer pruebas unitarias a un código de Angular?
- Basta con agregar un par de referencias a angular.js y angular-mocks.js en el archivo SpecRunner.html




De paso ya puede ver que agregamos un par de referencias más, una al archivo donde esta definido el Controlador que queremos probar y una al archivo donde están definidas las pruebas unitarias para este. El contenido de estos archivos es el siguiente:






Si ahora refrescamos la página SpecRunner.html para correr las pruebas nuevamente veremos estos resultados:




Puede agregar más archivos con clases y pruebas a medida que los vaya necesitando.


Espero que después de este artículo no tengamos más pretextos para no usar pruebas unitarias en lado del cliente y podamos cerrar un circulo que por momentos se resistía. Con esto lograremos hacer los módulos de clientes en Javascript más fiables y menos propensos a errores durante su desarrollo y posteriores actualizaciones.


Para profundizar en el tema le dejo los principales enlaces:




Para descargar el proyecto completo y colaborar:
https://github.com/deisbel/angular-jasmine-standalone-seed







Tuesday, March 10, 2015

Podcast #3 Una semana más tarde

Episodio 3   —  noviembre 23 de 2014


Deisbel es papá por primera vez, así que una semana más tarde de lo previsto continuamos hablando sobre optimización de sitios web.
En este episodio:


La frase del día: "Somos cubanos, y tenemos un poquito de españoles y un poquito de americanos".


Todavía lo asusta desarrollar en Java?

Aunque no suelo escribir mucho sobre Java ya este es el segundo artículo que escribo en una misma semana. No es que esté apostando mi dinero a Java por encima de .Net sino que simplemente quiero ayudar a que los desarrolladores de .Net pierdan el miedo o el respeto por Java y todas las tecnologías y herramientas que lo rodean. Al fin y al cabo no abrir esa puerta puede implicar perder buenos proyectos e ingresos, e incluso no disfrutar de algunas buenas tecnologías.

Años atrás cuando surgió .Net la diferencia de productividad entre este y Java se hizo demasiado grande. Muchas miradas se voltearon a .Net y los seguidores de Microsoft tuvieron aún más razón que nunca para no voltear a mirar la puerta del vecino.

Pues bien, creo que esa brecha hace rato que ha desaparecido. Si comienza a mirar a Java con mejores ojos y mejor voluntad verá que hoy es tan simple hacer las cosas tanto en un lado como en el otro.

Con el desarrollo de Spring Framework las cosas están siendo tan sencillas como en .Net, incluso sorprendentemente sencillas. Creame, mírelo con buenos ojos, identifique una buena documentación como punto de partida y verá que también disfrutará de ampliar sus horizontes.

Por ejemplo, si cree que .Net MVC es sencillo dese una vueltecita por Spring MVC y verá que hoy por hoy es igual de simple. Para que no quede en palabras aqui va un ejemplo:

Para crear el controlador:


Para crear la vista que se muestra con el método “greeting” de este controlador:


Para hacer la aplicacion ejecutable:


Simple, no?

Si así lo cree pues aquí le dejo un buen punto de partida para estudiar Spring Framework. Solo le recomiendo que antes lea acerca de estos temas:
  • Inversión de Control (Inversion of Control)
  • Inyección de Dependencia (Dependency Injection - DI)
  • Programación Orientada a Aspectos (Aspect Programing Oriented - APO).

No se asuste, nada que no haya usado ya en .Net, solo que lo hemos hecho sin siquiera darnos cuenta.

El código de ejemplo que aquí he expuesto lo pueden consultar y descargar completamente de la guía de inicio de Spring Framework:


Es muy posible que tenga que lidiar con el hecho que la lista de dependencias en los tutoriales esta muchas veces desactualizada (Así es este mundo medio desordenado de Java). Aqui le dejo un fragmento de las dependencias funcionando 100% al momento de escribir este artículo (utilizando Gradle):


Guías completas de spring: http://spring.io/guides







Friday, March 6, 2015

Ant, Ivy, Maven, Gradle, what and why?

Developers coming from the .Net world often wield several arguments against Java, some of these with reason, and others simply by sheer laziness.

One of the most common arguments against Java is the number of technologies and libraries around it, too many of them to do the same thing, and when you want to start, you find yourself lost in a ocean of information, often disorganized, almost in a chaos.

But, is it good or bad to have several libraries to achieve our goals?

The positive aspects of this situation from the perspective of the native Java developers are:

- The variety of options to achieve a single goal.
- It is almost always Open Source code, so, you can fix it if you need it.

The negative aspects of this situation from the perspective of native .Net developers?

- You don't know where to start.
- You don't know which, of the many technologies, is the best. Take for example this list of Views Templates: JSP/JSTL, Thymeleaf, Tiles, Freemarker, Velocity. It means that even within the same Java world it may be high learning curve to include a new member to the team.
- Little centralized documentation.
- The shelf life of the technologies is relatively much shorter than in .Net.
- And finally, there is a tree of dependencies between libraries with many levels, many times becoming an endless story.

Are the .Net people wrong? - No, I think they are not.

I clearly remember that years ago I was working on a project to make a website for games. The project leader (one of the people with more knowledge of the Java world) wanted to use quite an advanced and complex library set. A couple of years later I asked him to mount the site on a test server to show it to a client and you know what?

1- He needed a huge time to install everything from scratch. In the end, we never installed the app again.
2- The main library that we used, the core of everything, was not developed further. It would be forever forgotten. Besides, the huge list of dependencies had run with the same luck.

Then, in the midst of all this chaos, something or someone should put order and simplify these processes. That's where tools for project and dependency management, automatic updates, packaging and distribution, appear.

Here is why the native .Net developer finds so complex to come into the Java world, because in all honesty, they never have had that chaos: they have always had a MSDN containing all the documentation centralized, either online or offline.

Then, in the Java world arises Ant, Ivy, Maven, Gradle, etc., and one problem was solved, but at the same time this keeps the other problem open; which one of the many availables project's managers is good to me?

It's really ironic because something created to organize the chaos collaborates to create even more chaos, ha ha.

Well, the most famous and used tool is Maven, I think, but lately Gradle is raising with much power. However, Gradle has "partnership" with Maven because it makes use of its repositories and all his knowledge accumulated over the years.

Gradle is now used by Android Studio. Gradle is now on par with Maven in the Spring Framework tutorials.

There you go a list of useful resources:


Tuesday, March 3, 2015

Podcast #2 Completamente en el piso

Episodio 2   —  noviembre 9 de 2014


Entre todos, poco a poco, estamos descargando la velocidad de Internet por la taza del baño, así que nada mejor que dedicar un poco de tiempo a hablar de cómo optimizar nuestros sitios web.


En este episodio: