Clases testeables lineamientos básicos
Para lograr una implementación testeable se recomienda cumplir con los siguientes lineamientos:
- Bajo acoplamiento
- Capa de acceso a datos intercambiable
- Minimizar las interfaces privadas
- Comportamiento de cada interface debe ser parametrizable y tener valor de retorno
- División en componentes más pequeños
- Reutilizar la mayor cantidad de componentes posible
Cada uno de estos puntos contribuye a la implementación de una clase testeable. Esto garantiza que podrá ser modificada sin propagar errores inprevistos a otras partes del sistema.
Bajo acoplamiento
El bajo acoplamiento es uno de los principales puntos a tener en cuenta a la hora de programar, pero no siempre se cumple.
Capa de acceso a datos intercambiable
El origen de los datos no suele cambiar periodicamente durante la vida de un sistema pero si durante el desarrollo, más aún en la etapa de investigación. Implementar una capa de acceso a datos que no sólo permita utilizar cualquier motor de base de datos sino que también permita trabajar con datos dummy o de pruebas (sobre todo en las pruebas unitarias donde no es aconsajable realizar peticiones a la base de datos) es una de las características que debe tenerse en mente durante todo el desarrollo.
Minimizar las interfaces privadas
Las interfaces o mensajes privados son útiles cuando se trata de procesos o mensajes internos que no deben ser utilizados por los componentes externos, sin embargo el uso debe ser restringido y muy bien pensado y en algunos casos evitados ya que estos mensajes privados no podrán ser testeados mediante pruebas unitarias y mucho menos funcionales.
Comportamiento de cada interface debe ser parametrizable y tener valor de retorno
Es común tener métodos que no reciben ningún parámetro y no devuelven ningún valor, esto pasa cuando la implementación no es realizada correctamente. Un método con tales características por lo general indican que no deberían estar en esa clase o bien abusan de las variables miembros directamente y no a través de sus "accessors".
División en componentes más pequeños
Siempre la mejor estrategia para encarar cualquier problema es dividirlo en problemas más pequeños. Es mucho más manejable varios problemas simples antes de que un único problema grande y complejo.
Reutilizar la mayor cantidad de componentes posible
No reinventar la rueda cada vez, sino al contrario, buscar y analizar qué partes del sistema resuelven un problema similar o idéntico y reutilizar el código ya implementado. Es muy común encontrar porciones de código que podrian reutilizarse pero debido a su alto acoplamiento no es factible extraerlo para que ambos puntos del sistema lo reutilicen. En estos casos es necesario analizar el proceso conocido como "refactorización". Existen dos caminos a seguir en este punto: uno es realizar todas las modificaciones necesarias para lograr el bajo acomplamiento y así poder reutilizar el código, o bien realizar la refactorización en etapas bien planificadas donde el primer paso es duplicar la lógica reutilizable en un componente que será utilizado por el nuevo código y en un futuro será el reemplazo de la lógica original de donde fue extraida.
Comentarios
Publicar un comentario