Tuesday, 30 June 2009

Concordion

Bueno, este mes ya veo que me estoy superando con la friolera de más de 30 artículos. Espero que os de tiempo de leerlos todos porque ya veis que son muy interesantes. En éste artículo y continuando con mi planificación voy a hablaros de Concordion. Hace unas horas os estuve entreteniendo con FIT (Framework for Integrated Test), pues bién, Concordion es una mejora de éste marco de trabajo y mucho más intuitivo para los lenguages Java, .NET y Ruby. Concordion ha sido desarrollado por David Peterson, y uno de sus desarrolladores es José Manuel Beas, el cual podéis encontrar en mi lista de blog roll. Éste al igual que FIT trabaja mediante tablas HTML, pero es mucho más fácil de añadirlo a nuestro proyecto Java. Mediante una keywords muy básicas, podemos crear nuestras hojas de test para comprobar que el programa devuelve lo que nosotros queremos.
  • Que necesitamos para empezar?
Primero, descargamos la última versión de concordion desde la misma web: Concordion-1.3.1. Luego una vez descargado, tenemos que añadir las librerias necesárias a nuestro class path en el eclipse:

Como podéis observar, tengo enlazadas las librerías concordion-1.3.1.jar, la última versión de la junit (junit-4.6.jar) y las ognl-2.6.9.jar y xom-1.1.jar. Una vez tengo esto, creo un pequeño package llamado example donde pondré el código que voy a probar.
Podréis encontrar más información del funcionamiento de Concordion en la web : http://www.concordion.org/Tutorial.html.

Ahora, aprovechando el código fuente de mi anterior post (Arithmetic.java) crearé un HTML de pruebas para ver si la clase me genera bien los resultados esperados. Aquí os pongo la definición del fichero java:

ArithmeticTest.java:




/**
* @Author : Jordi Coll
* Test With Concordion
*/
package example;

import org.concordion.integration.junit3.ConcordionTestCase;

public class ArithmeticTest extends ConcordionTestCase {
private int x;
private int y;

public int plus () {
return getX() + getY();
}

public int minus() {
return getX() - getY();
}

public int multiply () {
return getX() * getY();
}

public int divide () {
return getX() / getY();
}

public float floating () {
return (float)getX() / (float)getY();
}

public float sin () {
return (float)Math.sin(Math.toRadians(getX()));
}

public float cos () {
return (float) Math.cos(Math.toRadians(getX()));
}

public void setX(int x) {
this.x = x;
}

public int getX() {
return x;
}

public void setY(int y) {
this.y = y;
}

public int getY() {
return y;
}
}





Como podéis ver, hay que heredar de la clase ConcordionTestCase para que parsee el documento HTML y localice las entradas que queremos.

Una vez ejecutamos el proyecto con el jUnit, nos tiene que aparecerer en la ventana resultado:

C:\Temp\concordion\example\Arithmetic.html Successes: 4, Failures: 2, Exceptions: 1

La parte del HTML es muy fácil. Simplemente tenemos que generar éste con una sería de metaKeywords definidos por concordion. De ésta manera, podemos escribir sobre un método y leer de él con mucha facilidad. Por ejemplo voy a cargar los valores x y y con números y luego voy a comprobar el resultado. Si el resultado es correcto, me marcará el número en verde y sino en rojo.

Arithmetic.html:

El HTML se tiene que decir igual que la clase, pero sin el Test, de esta manera el hace el matching de una clase a su HTML correspondiente.




<html xmlns:concordion="http://www.concordion.org/2007/concordion">
<body>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
y:
<span concordion:execute="setY(#TEXT)">2</span>
- x+y:
<span concordion:assertEquals="plus()">4</span>
</p>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
y:
<span concordion:execute="setY(#TEXT)">2</span>
- x*y:
<span concordion:assertEquals="multiply()">4</span>
</p>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
y:
<span concordion:execute="setY(#TEXT)">2</span>
- x div y:
<span concordion:assertEquals="divide()">1</span>
</p>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
y:
<span concordion:execute="setY(#TEXT)">2</span>
- x / y:
<span concordion:assertEquals="floating()">1.0</span>
</p>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
- sin(x):
<span concordion:assertEquals="sin()">0.034899495</span>
</p>
<p>
x:
<span concordion:execute="setX(#TEXT)">2</span>
- cos(x):
<span concordion:assertEquals="cos()">0.99939084</span>
</p>
</body>
</
html>




En el caso de que la prueba tubiese éxito aparecería:


Si uno de los valores no devolviese el valor esperado, nos aparecería de la siguiente manera:

Una de las cosas más interesantes que he visto y que más me ha gustado ha sido el mostrado de los errores. Si nos equivocamos al escribir un método en el HTML, luego en el resultado nos aparece:



3 comments:

  1. Hola Jordi,

    Me duele que no me cites en tu blog al hablar de Concordion. :-)

    Bueno, bromas aparte, quería comentarte que en la web de Concordion hay un tutorial en español (je, je, lo traduje yo) que creo que puede ser muy útil para los que empiezan.

    Además, también hay una lista de correo donde el autor, David Peterson, suele dar respuesta siempre muy acertadamente y normalmente muy rápido.

    Y por último, y perdona el "spam", en mi blog también tengo algunos artículos sobre Concordion que pueden ser interesantes (modestia aparte).

    ReplyDelete
  2. Perdona Jose Manuel por no haberte citado en el artículo. Si que tenía en mente a David Peterson (aunque tampoco lo he puesto) pero no a ninguno de vosotros, que estáis realizando un trabajo impresionante con éste framework y que hace poco que lo empezé a utilizar. De todas formas gracias por el tutorial y la información extra. Seguro que mis lectores estaran entusiasmados con el "spam" extra!.

    ReplyDelete
  3. Je, je, bueno, no es para tanto. Pero sí me gustaría aprovechar que paso por tu blog para comentar que estoy intentando muy poco a poco escribir un plugin Eclipse para facilitar la edición de las especificaciones con Concordion. Eclipse es ideal porque puedes editar Java y HTML sin salirte del editor. (Seguro que alguno sale por ahí diciendo que NetBeans también, pero que sepa que Eclipse lo hace mejor) :-P

    Bueno, que decía esto porque yo no tengo mucha experiencia (los libros, las pruebecillas que he estado haciendo y el código del WicketBench en el que me estoy fijando), así que si alguien se anima a echarme una mano, estaré encantado. :-)

    ReplyDelete