15

Mejorá la calidad de tu código y tu vida escribiendo Tests

20634Puntos

hace 5 años

Buenas, hoy vamos a hablar de ¿por qué DEBÉS, QUERÉS y NECESITÁS escribir tests sobre tu código?

Imaginate esta situación, acabas de terminar tu código, te tomás un respiro para apreciar la obra maestra de lógica que creaste. Ahora te presentaron nuevos requerimientos y tenés que hacerle mejoras. Ok agregas código, refactoreas algunas cositas y… ¡listo!, ahora probamos click acá, click allá y todo funciona perfecto.
Como sabemos el software es un elemento vivo, puede cambiar y tranquilamente la complejidad de un módulo se puede ir hasta las nubes. En ese caso probar la funcionalidad manualmente deja de ser una tarea agradable y si no probamos todos y cada uno de los casos en vez de recibir requerimientos vamos a empezar a recibir peticiones para arreglar bugs y un proyecto que solía ser un paraíso ahora es una inmundicia llena de parches. Nadie merece vivir así, podés tomar acción a tiempo y asegurarte una vida sin estrés.

Escribí tests

Los tests son esos amigos que te dicen la verdad. Si un caso no funciona como creías en tu lógica magistral es mucho mejor darse cuenta antes de que ese programa llegue a dominio público o del cliente.
Si escribís buenos tests vas a poder irte a dormir tranquilo sabiendo que hiciste bien tu trabajo y podés enfrentarte a nuevos e interesantes retos.

Es un tipo de mentalidad

Listo ya lo tenés hay que escribir tests, entonces armás tu código y luego escribís un test que compruebe que todos los caminos funcionan tal cual esperabas y cada vez que haces una modificación ejecutás el test y si pasa sigue todo ok.

Buena aproximación

¿y si te digo que podés ir un poco más lejos?
Podés partir de la definición del proyecto y empezar por los tests, algo muy sencillo que cumpla las expectativas del negocio, de esta forma tenés documentado en código la definición de la lógica de negocio y si el negocio cambia con el tiempo y mantenés los tests alineados siempre vas a tener una documentación actualizada de por qué cada cosa está en cada lugar. Esto es algo que se conoce como TDD (Test Driven Development).

Escucho los lamentos de fondo

Mientras escribo este artículo estoy recibiendo vibraciones de almas en pena y quejumbrosas que cuestionan con argumentos como:

  • Escribir test toma tiempo de desarrollo que no tengo.
  • Los tests son programas también, si un test tiene un bug, ¿quién testea el test?.
  • Si hay que actualizar la lógica también hay que actualizar los tests, es doble trabajo.
  • El negocio evoluciona muy rápido como para andar implementando tests.

Y un sinfín de sinónimos de los puntos anteriores, permitime contestar a estas negaciones prematuras una por una.

  1. Si tenés poco tiempo para escribir tests imaginate cuanto tiempo te va a quedar cuando además de estar agregando features tengas que estar escribiendo fixes. Si es que te queda tiempo para agregar features después de arreglar bugs (incendio constante, vida estresante).
  2. Los tests no deben tener lógica compleja -son tests-. Con una lógica simple la probabilidad de que se rompan es MUY baja.
  3. Si hay cambios grandes en la lógica de negocio que hagan que los tests deban ser reescritos todo el tiempo quiere decir que estás definiendo mal todo. Reunite con tu equipo o tomate un rato en un parque como para enfocarte y definir las cosas bien.

Si tenés un lamento novedoso acerca de los tests y puede ser respondido con alguna de los 3 puntos anteriores, deja de llorar.

Los tests son una herramienta

Los tests son una herramienta y como tal tienen sus aplicaciones específicas, y me gustaría enumerarlas:

  1. Que sabemos lo que sabemos.
  2. Que sabemos lo que no sabemos.
  3. Que no sabemos lo que no sabemos.

El punto número 1 habla de Que sabemos lo que sabemos, el camino feliz donde todos los valores que entran están en perfecto estado y formateado como necesitamos, en ese caso el test pasa y somos todos felices.

El punto número 2 habla de Que sabemos lo que no sabemos, en este caso sabemos que es lo que no queremos que pase, si tiene que venir un string y viene un int, si un proceso tenía que devolver algo y no devolvió nada y teníamos que disparar una excepción. Con el test nos aseguramos de que esas excepciones sean disparadas.

El punto número 3 habla de Que no sabemos lo que no sabemos y acá es donde te pido sinceridad y humildad, si un caso no estaba en los tests, se rompe en producción y vuelve como un bug. En esos casos no hay ni test ni milagro que valga, tenés documentado en los tests que no habías pensado en ese caso de uso o falla, solo queda aprender del bug, solucionarlo y agregar lo que no habías pensado al test para que no vuelva a pasar.

Tipos de tests

Existen varios tipos de tests que hacen que una aplicación sea robusta y relajada.

Test unitario

Este tipo de test se centra en testear cada parte del código, deberías aspirar a tener una cobertura del 100% de las líneas.

Test funcionales

Este tipo de test está mucho más centrado en el funcionamiento a grandes rasgos del sistema, en el caso de una página web podrías testear que si estas logueado y tu nombre tiene que aparecer en la barra superior del sitio, realmente aparezca.

Una vez que le encuentres el gustito a trabajar implementando tests no solo vas a ser una persona mucho más profesional sino que vas a irte todos los días a casa sabiendo que el trabajo en el cual te esforzaste está bien hecho.

<El último apaga la luz>

Alan
Alan
alanRiveros

20634Puntos

hace 5 años

Todas sus entradas
Escribe tu comentario
+ 2
1

Muy bueno. Cuando aprenda Java seguramente tomaré el curso de Testing, esa que describes es la forma en la que quiero trabajar.

1
86895Puntos

Muy buen blog ! Me anima aún mas por enfocarme en testing.