intive Argentina Blog

Unit Testing con Node.js

Unit testing es una parte muy importante del desarrollo de software. ¿Por qué? Es simple, puede ser la diferencia entre el buen software y el mediocre. Este artículo presenta entonces el ¿qué?, ¿por qué? y ¿cómo? Del unit testing con Node.js

¿Qué?

Unit testing es una práctica de desarrollo de software que ayuda al programador a ganar seguridad escribiendo y ejecutando tests para la funcionalidad en desarrollo. Pero el objetivo principal del unit testing no es examinar la pieza entera de software, sino aislar componentes más pequeños y testearlos separadamente para asegurar que todos los requerimientos de los componentes se cumplen como se esperaba.

¿Por qué?

Para comenzar, el Unit testing nos da la confianza de que cada componente que se construye trabaja en líneas con el contrato especificado en el diseño. Esto es muy útil al momento de realizar cambios en el código existente.

Imagínate abocándote a un nuevo proyecto y tener que realizar cambios en una funcionalidad existente sin poder realizar tests. No hay manera de asegurar que lo que estás cambiando no introducirá bugs. El Unit testing es de gran ayuda en esos casos dado que puedes cambiar lo necesario y correr tests para asegurarse de que todo está trabajando correctamente. Además, el unit testing ayuda al programador a separar la funcionalidad que está creando en pequeños módulos con una sola responsabilidad para que sean fáciles de testear.

Hay un proceso de desarrollo que sugiere escribir los tests antes de escribir la funcionalidad. De esa manera, estás en la obligación de diseñar tus componentes primero, escribir tests para ellos y por último implementar dichos componentes que pasaron por las pruebas. Ese proceso se llama Test Driven Code (TDD) y es parte de una metodología más grande llamada Extreme Programming (XP).

El unit testing sirve como documentación para tu código también. Muestra la manera en que se usa un componente y cuál es la interfaz que expone. Muchos programadores que desean utilizar componentes externos en su software simplemente miran los tests para ver ejemplos de cómo se usan.

Hay un problema con el unit testing también. No testea la interacción entre los componentes. Sólo testea el componente aislado. Para solucionar esto, puedes utilizar otro tipo de testeo llamado Integration Testing, pero eso será desarrollado en otro artículo.

¿Cómo?

Ok, ya sabemos de qué se trata el unit testing y por qué es útil. Ahora hablemos como puede ser utilizado en Node.js.
Primeramente, necesitarás un test runner. Mocha es una buena elección para esta tarea ya que brinda una gran funcionalidad y le permite al programador customizar las herramientas que usará para escribir los tests. Una vez obtenido el test runner, necesitarás una assertion library. Hay muchos hoy en día, pero personalmente sugeriría Chai. Ofrece lenguajes tanto BDD como TDD, de esa manera puedes elegir el que prefieras.

Con estas dos herramientas puedes comenzar a escribir unit tests simples. Hay un pequeño ejemplo de cómo hacerlo aquí.  También, hay algunos casos que requerirán consumir servicios externos vía peticiones HTTP. Nock es una gran elección para lograr eso. Es realmente simple usar y proveer una manera de emular peticiones HTTP sin tener que preocuparse sobre el método que se está utilizando. Hay un ejemplo de cómo hacerlo aquí.

La última herramienta de la caja de herramientas del unit testing es Rewire, un inyector de dependencia. Es bastante útil cuando se precisa emular dependencias de módulos.

Ha sido presentada la Node.js Unit Testing Toolbox. Puedes lograr todo lo que te propongas con estas cinco herramientas, pero hay muchas más que pueden ser utilizadas con los mismos resultados. Anímate a buscar y elegir la mejor para tí.

Tomás Boccardo

Trabajó como Full Stack Web Developer en la compañía, donde ingresó en febrero de 2014. Se graduó como Ingeniero en Informática en la Universidad de Buenos Aires. Se destaca en desarrollo en Python y Node.js y si hay algo que desconoce, lo investiga.

Deja un comentario