Importancia del Unit Testing

Si has llegado hasta esta entrada, puede que sea porque te estés preguntando si de verdad es tan importante aplicar pruebas unitarias sobre tu código, al fin y al cabo puedes completar desarrollos sin ellos.

Me voy a basar en diferentes argumentos que enumeraré a continuación.

1. El mercado demanda TDD

Pues bien, comencemos usando como argumento que cada vez son mas demandados perfiles capaces de desarrollas haciendo uso de TDD (Test Driven Design).

Esto no es un capricho del mercado, y quiero pensar que tampoco se trata de una moda, detrás hay unas causas bien definidas. En este hilo hablo en mas profundidad sobre qué es el TDD y sus ventajas, pero básicamente se trata de que antes de comenzar a escribir una funcionalidad, se escribe un test que dará un resultado negativo (rojo), principalmente porque la funcionalidad no está desarrollada (o terminada), a continuación se desarrolla la funcionalidad para que el test pase a tener un resultado verde, tras ello se refactoriza el código, y el ciclo vuelve a empezar.

Como ya habrás deducido, si lo primero que haces es un test rojo, y luego una implementación que supere el test, todo tu desarrollo estará bajo la cobertura de tus unit test.

El TDD es el máximo exponente de la importancia de los unit tests, ya que tu desarrollo se apoya sobre él.

2. Confiabilidad ante integraciones

Si todos los métodos de tu código están blindados ante fallos con unit tests, y pasan en verde, será mas probable que cuando los integres unos con otros el resultado acabe siendo favorable.

Si tenemos una buena arquitectura, en la que por ejemplo tengamos una capa de servicio que especifique los pasos funcionales que nuestro negocio debe seguir, y para cada uno de esos pasos funcionales tenemos un método con una batería de unit test superados, es muy probable que ese servicio funcione con éxito y por tanto nuestro negocio sea satisfactorio.

3. Test de regresión

Si manejas código en periodos de tiempo muy largos, puede llegar el momento en que modifiques viejas funciones o añadas nuevos comportamientos.

Estas modificaciones podrían hacer peligrar viejas funcionalidades que pueden ser muy numerosas, de forma que volver a probarlas puede resultar muy duro y costoso.

Si ya tenías una batería de test verde dando cobertura a todo ese código, y tras los cambios, tus test siguen siendo verdes, tus viejas funcionalidades tienen una muy alta probabilidad de continuar funcionando (si tus test están bien diseñados).

Incluso aunque tus test devuelvan un resultado rojo será información valiosa, sabrás qué has roto o qué es necesario modificar, o incluso qué tests deben ser arreglados para que todo vuelva a estar bajo control.

4. Los test son F.I.R.S.T

¿Y qué es esto de FIRST?

Fast, Independent, Repeatable, Small y Transparent.

Un test unitario debe ser muy rápido de ejecutar, para lanzar grandes baterías de ellos si fuese necesario.

Además debe ser independiente, para que unas funcionalidades estén desacopladas de otras, probando pequeñas porciones de código y así evitemos efectos en cadena.

Sea cual sea el número de veces que ejecutemos el test, o la batería de los mismos, el resultado debe ser siempre el mismo, siendo todos repetibles y deterministas.

Un test unitario se autodefine como unitario, atómico, pequeño. Si para probar un método necesitamos un test muy grande, probablemente ese código se pueda refactorizar y probar con métodos mas pequeños.

Un test debe dejar clara su finalidad, qué aspecto de la funcionalidad se esta probando, siendo “transparente”, de forma que incluso los tests en si mismos puedan documentar la funcionalidad desarrollada y validarse por parte del cliente.

5. Y por último, ¿que hay de los usuales despistes?

Me ha sucedido en diferentes ocasiones, antes de usar Unit Test, que redacto una funcionalidad con total convencimiento de su funcionamiento, y cuando hago un test manual usando algún cliente tipo Postman o Fiddler, y hago debug de mi código, resulta que he cometido pequeños errores o excepciones no previstas o incontroladas.

Un test unitario corrige este tipo de situaciones con mucha efectividad, detectando posibles bugs antes incluso de que estos se produzcan bajo una prueba end-to-end.

Conclusiones

En definitiva, el uso de unit tests te ayuda a mantener un código robusto, minimizando las probabilidades de error o de que algo se rompa y deje de funcionar en un futuro sin que lo detectes (probablemente un cliente lo detectará antes que tú si no usas unit test, y nadie quiere eso), así que si aún no aplicas unit test, espero que esta entrada del blog te anime a llevarlos a cabo.

Deja un comentario