CTDD

Diseño dirigido por testing continuo (CTDD) en Eclipse con Infinitest

Si usas habitualmente del desarrollo guiado por test (Test Driven Development) seguro que te has hartado de ejecutar test y test hasta llegar a ver la señal de color verde que indica que los test han pasado.

Si no has probado nunca el TDD, te lo recomiendo. Básicamente (y de forma seguramente imprecisa, pero por motivos didácticos…) se resumiría en:

  1. Se crea un test que debería cumplir el código que voy a programar.
  2. Se ejecuta el test y se falla, obteniendo una señal de color rojo (como un semáforo).
  3. Se programa el código mínimo que hace que el test se cumpla.
    1. Se ejecuta el test y se puede obtener una señala roja de fallo, por lo que hay que modificar el código.
    2. Se ejecuta el test y se obtiene una señal verde que indica que el test ha pasado.
  4. Se genera otra vez otro test con más requisitos que debe cumplir.

La ejecución de los test se realiza en el IDE o a través de herramientas como Maven o un sistema de integración continua. Si lo hacemos en nuestro IDE, puede ser algo tedioso ya que tenemos que ejecutarlo manualmente cada vez que queramos probar si nuestro código hace cumplir el test que hemos creado.

  1. Programamos el código que se supone que pasa el test unitario.
  2. Localizamos la clase del test (unitario) que corresponde al fragmento de código que hemos programado (a veces se nos pierde entre un tumulto de pestañas).
  3. Ejecutamos el test.
  4. Vemos el resultado.
    1. Y si ha fallado, vuelta a empezar.

Aunque en los ID como Eclipse es fácil con las teclas cmd+alt+R+T (quizá no tanto jeje), podemos acabar algo cansados.

Para evitar esto podemos utilizar un plugin que nos permite realizar testing continuo (Continuous Test Driven Development – CTTD) esto es, que cada vez que modificamos un fichero de código, los test asociados a él se ejecutan en segundo plano de modo automático y sin intervención del desarrollador), obteniendo el resultado de los mismos en un lateral de la pantalla.

Aunque automatizar la ejecución continua de test puede ser algo muy básico, es de gran ayuda. Sintetizaría sus ventajas en los siguientes puntos:

  • Evita perder tiempo porque no tenemos que localizar el test que le incumbe al código modificado, o no tenemos que correr todos los test (porque no queremos localizar el test).
  • Quizá nos pueda evitar dar alguna vuelta de más al código al tener de forma más constante el resultado del test.
  • Y lo más importante: Ayuda a enfocarse todavía más en el paradigma TDD al proveer un feedback continuo de nuestras acciones.

Si buscamos herramientas CTTD para Eclipse, que es el IDE que suelo utilizar, aparecen unas cuantas. He probado una que parecía sencilla. Se llama Infinitest. Vamos a ver cómo se instala y se utiliza. Es muy fácil.

Infinitest

Screenshot from 2014-11-22 10:39:41

Infinitest está disponible para Eclipse e IntelliJ IDEA en forma de plugin que se integra perfectamente con el navegador. Su modo de funcionamiento se puede resumir en estos pasos:

  1. Primera ejecución: pasa todos los test que hay en el proyecto para conocer qué código está cubierto por cada test. De este modo, cuando salvemos un fichero, sabrá qué test tiene que ejecutar, evitando tener que correr todos otra vez.
  2. Siguientes ejecuciones: cuando salvemos un fichero de código, comprueba qué test se le aplican y los ejecuta en segundo plano, informando del resultado de dos modos (en Eclipse):
    1. Mediante un indicador en la zona inferior izquierda con el típico semáforo verde – rojo de los test.
    2. Mediante la pestaña de errores del proyecto, donde tiene su apartado específico.
    3. Mediante una señal de error en el código del test que ha fallado, donde devuelve el error de JUnit (fallo de Assert…).

Los pasos par instalarlo en Eclipse son muy sencillos, son los siguientes (perdón por los colores del Eclipse Luna con el tema Dark ^_^):

1. Vamos al Eclipse Marketplace (Menú Help > Eclipse Market Place…).

2. En la caja Find escribimos “Infinitest” y esperamos al resultado.

Screenshot from 2014-11-22 09:41:28

3. Aceptamos condiciones de instalación (y advertencias de contenido no firmado ^_^)

4. Reiniciamos el IDE.

Cuando iniciamos de nuevo Eclipse y si no se ha ejecutado nunca, aparecerá un nuevo control en forma de barra en la zona inferior izquierda de la pantalla, que indica que Infinitest está esperando acciones.

Screenshot from 2014-11-22 09:44:27

He creado un proyecto muy sencillo para probar su funcionamiento. Sea el siguiente test que requiere un contador que cuente palabras y devuelva el valor de tipo int “6” al ejecutarse:

test

Si seguimos el paradigma TDD, debemos escribir el código mínimo que supere el test. Podría ser este.

test

 

Sí, si te lo estás preguntando, solamente devuelve un 6 sin hacer operaciones porque es lo que el test ha pedido. Se trata de cumplir el test con el código mínimo. Si esperabas la funcionalidad de que contase el número de palabras, se debería haber especificado en el test poniendo más casos.

Volviendo al CTTD con Infinitest. En el momento que salvamos el fichero de código que pretendo cumplir el test, Infinitest ejecuta todos los test del proyecto para detectar las dependencias código-test. Ahora cada vez que salvemos ejecutará los necesarios. El resultado de la ejecución se muestra en la zona inferior izquierda:

Screenshot from 2014-11-22 10:17:53

Y como nuestro código es adecuado, ¡tenemos una bandera verde! Podemos añadir otro test para llegar donde queremos.

test3

Nada más salvar el fichero del test (un cmd+s o ctrl+s), podemos ver que aparece una señal de error en Eclipse (la bombilla con una equis en la línea 13). El indicador de Infinitest también los avisa.

test4

Si vamos a la pestaña “Problems” podemos ver las causas:

TEST5

Obviamente el problema está en que nuestro código simplemente devuelve un número 6 y no cumple el segundo test. Modificamos el código de nuestra clase para que cuente las palabras del texto pasado por parámetro. Se me ha ocurrido hacer un split y contar el vector resultante:

Test6

Y nada más salvar el código de nuestra clase, el test correspondiente se ha ejecutado en segundo plano. Los fallos del test desaparece también.

Screenshot from 2014-11-22 10:35:03

Como habéis podido ver, en este proceso tendría que haber ejecutado el test unitario al menos 4 veces si siempre hubiera acertado con la solución a los test a la primera. Asi que he ahorrado un tiempo y distracciones, y he podido concentrarme en escribir el código adecuado.

Por supuesto, el hecho de disponer de una herramienta para hacer CTTD no sustituye ninguna de las otras partes del TDD, es simplemente una ayuda más para acelerar el proceso. Debemos seguir ejecutando todos los test de forma periódica y debemos seguir utilizando los sistema de integración y generar las builds como siempre

Seguro que cuando lo pruebes será un clásico en tu IDE (o al menos otra herramienta que permita hacer CTTD).