Pruebas de integración con Maven

0
21801

Pruebas
de integración con Maven

Creación: 25-01-2007

1.
Introducción

Actualmente Maven, en su versión 2.0, no soporta la
configuración de distintos directorios para las pruebas
unitarias y las pruebas de integración, ya que únicamente
tenemos un testSourceDirectory por módulo, por lo que deben
convivir en el mismo directorio. Ésto nos causa un problema,
porque en la fase de test de maven, se lanzarían las pruebas
unitarias conjuntamente con las pruebas de intregración, que
posiblemente necesiten un contenedor iniciado para que se realicen
correctamente.

En el libro “Better
Builds with Maven” nos explican como configurar Maven para
ejecutar pruebas de integración creando un módulo
específico para esta tarea y solucionar el problema comentado
anteriormente. En este tutorial vamos a ver como configurar éstas
pruebas dentro del mismo módulo donde tenemos configuradas nuestras
pruebas unitarias. Damos por hecho de que tenemos instalado Maven y
el Tomcat en nuesto equipo. Realizaremos un proyecto web llamado
“autentiaWeb”, donde convivan ambos tipos de prueba y se
ejecuten correctamente en su fase correspondiente.

Nota: Existen rumores
de que la versión 2.1 de Maven soportará la
configuración de un directorio distinto para las pruebas de
integración; eso esperamos.

2.
Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: HP COMPAQ Presario V6000 (Centrino Duo 1.66GHz,
    2048 MB RAM, 100 GB HD)

  • Sistema Operativo: Windows XP Home Edition

  • Máquina Virtual Java: JDK 1.6.0 de Sun Mircosystems

  • Maven 2.0.4

  • Tomcat 5.5.20

  • Cargo 0.8 (plugin para maven)

3.
Creando el proyecto

Para empezar, vamos al crear el proyecto con Maven. Suponiendo que
nuestros proyectos los tenemos en C:\home\workspace basta con hacer:

C:\>cd home/workspace

C:\home\workspace>mvn
archetype:create -DgroupId=com.autentia.demoapp
-DartifactId=autentiaWeb -DarchetypeArtifactId=maven-archetype-webapp

Donde groupId es el identificador único de la
organización o grupo que crea el proyecto, artifactId es el
identificador único del artefacto principal de este proyecto y
le indicamos mediante el atributo archetypeArtifactId que queremos
usar la plantilla de aplicaciones web de Maven.

Ahora editamos el archivo index.jsp que nos ha creado
Maven y ponemos:


MyIntegrationTest

Integration Test!!!!

Podemos probar nuestro proyecto publicandolo en nuestro contenedor
favorito y vemos como funciona.

4.
Creando los ficheros de prueba

Vamos a crear los ficheros para las pruebas, que meteremos en la
carpeta src/test/java del proyecto, que es donde Maven configura por
defecto el directorio testSourceDirectory para localizar los
ficheros de pruebas.

Antes de nada vamos a estudiar un poco el comportamiento del
plugin de Maven maven-surefire-plugin
, que es el plugin utilizado por Maven automaticamente en la fase de
test.

Como podemos ver en la documentación,
en la descripción del parámetro includes, si no
especificamos lo contrario, el plugin ejecuta todos test que
encuentre en el directorio por defecto de test que cumplan alguno de
estos patrones:

**/Test*.java, **/*Test.java,
**/*TestCase.java

Por lo tanto, y siguiendo la documentación, creamos la
clase MyTest.java (termina en Test.java cumpliendo uno de los
patrones para que se ejecute en la fase de test) con el siguiente
código:

import junit.framework.TestCase;

public class MyTest extends TestCase {

public void testHolaMundo() {
assertEquals("HolaMundo", "HolaMundo");
}
}

Ahora creamos otro fichero para el test de la fase de integración,
pero como no queremos que se ejecute en la fase de test de Maven, lo
nombramos incumpliendo todos los patrones anteriores, por ejemplo lo
llamamos MyTestIt.java. De este modo, al lanzarse las pruebas
unitarias en la fase de test, esta prueba no será lanzada (más
adelante veremos como configurar mediante este mismo plugin las
pruebas de integración y que esta vez si se lance).

import junit.framework.*;
import com.meterware.httpunit.*;

public class MyTestIt extends TestCase {

public void testDisplayMainPage() throws Exception {
WebConversation wc = new WebConversation();
WebRequest request = new GetMethodWebRequest("http://localhost:8080/autentiaWeb/index.jsp");
WebResponse response = wc.getResponse(request);
assertEquals("MyIntegrationTest", response.getTitle());
}
}

Esta prueba realiza una petición al servidor local del
archivo, y tendrá éxito cuando me devuelva la página
con el título correcto, una prueba sencilla. Como vemos en
esta prueba se hace referencia a la librería httpunit, de la
cual habrá que crear una dependencia en el pom del proyecto.

5.
Configurando el pom.xml

Lo primero es declarar todas las dependencias, incluyendo a la
librería httpunit comentada anteriormente y a las librerías
del plugin de Cargo, que utilizaremos para arrancar y parar el
contenedor Tomcat antes de lanzar las pruebas de integración
(en las fases pre-integration-test y post-integration-test
respectivamente).



junit
junit
3.8.1
test


org.codehaus.cargo
cargo-core-uberjar
0.8
test


org.codehaus.cargo
cargo-ant
0.8
test


httpunit
httpunit
1.6.1
test


Ahora añadimos la configuración de Cargo para
arrancar y parar el contenedor Tomcat en las fases correspondientes:


[...]

org.codehaus.cargo
cargo-maven2-plugin


start-container
pre-integration-test

start



stop-container
post-integration-test

stop





false

tomcat5x
c:/servidores/tomcat/



[...]

Tomcat lo tenemos instalado en el directorio
C:/servidores/tomcat. El container lo arrancamos con start en la fase
de pre-integration-test y lo paramos con stop en la fase de
post-integration-test. El wait a false en la configuración del
contenedor es debido a que al hacer start se quedaría
esperando (arrancaría el servidor y estaría listo para
hacer peticiones) y no seguiría avanzando hacia las siguientes
fases, que es lo que queremos para lanzar seguidamente la prueba de
integración.

Ahora configuramos la prueba de integración con
el plugin de Maven:


[...]

org.apache.maven.plugins
maven-surefire-plugin


it-test
integration-test

test



**/*It.class





[...]

Como vemos en la configuración, le decimos que
tiene que ejecutar los ficheros que terminen en *It.class, así
logramos ejecutar únicamente los ficheros de pruebas de integración.

6.
Lanzamos el proyecto

Ahora ejecutamos con Maven para ver el resultado:

C:\home\workspace\autentiaWeb>mvn clean post-integration-test

[INFO] Scanning for projects...

[INFO] ----------------------------------------------------------------------------

[INFO] Building autentiaWeb Maven Webapp

[INFO] task-segment: [clean, post-integration-test]

[INFO] ----------------------------------------------------------------------------

[INFO] [clean:clean]

[INFO] Deleting directory C:\home\workspace\tutoriales\autentiaWeb\target

[INFO] Deleting directory C:\home\workspace\tutoriales\autentiaWeb\target\classes

[INFO] Deleting directory C:\home\workspace\tutoriales\autentiaWeb\target\test-classes

[INFO] [resources:resources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:compile]

[INFO] No sources to compile

[INFO] [resources:testResources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:testCompile]

Compiling 2 source files to C:\home\workspace\tutoriales\autentiaWeb\target\test-classes

[INFO] [surefire:test] SE LANZAN LAS PRUEBAS UNITARIAS

[INFO] Surefire report directory: C:\home\workspace\tutoriales\autentiaWeb\target\surefire-reports

-------------------------------------------------------

T E S T S

-------------------------------------------------------

Running MyTest

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [war:war]

[INFO] Exploding webapp...

[INFO] Assembling webapp autentiaWeb in C:\home\workspace\tutoriales\autentiaWeb\target\autentiaWeb

[INFO] Copy webapp webResources to C:\home\workspace\tutoriales\autentiaWeb\target\autentiaWeb

[INFO] Generating war C:\home\workspace\tutoriales\autentiaWeb\target\autentiaWeb.war

[INFO] Building war: C:\home\workspace\tutoriales\autentiaWeb\target\autentiaWeb.war

[INFO] [cargo:start {execution: start-container}] SE LANZA EL CONTENEDOR TOMCAT

[INFO] [talledLocalContainer] Tomcat 5.5.20 starting...

[INFO] [CopyingLocalDeployer] Deploying [C:\home\workspace\tutoriales\autentiaWeb\target\autentiaWeb.war] to [C:\home\workspace\tutoriales\autentiaWeb\target\tomcat5x\webapps]...

[INFO] [talledLocalContainer] Tomcat 5.5.20 started on port [8080]

[INFO] [surefire:test {execution: it-test}] SE LANZAN LAS PRUEBAS DE INTEGRACION

[INFO] Surefire report directory: C:\home\workspace\tutoriales\autentiaWeb\target\surefire-reports



-------------------------------------------------------

T E S T S

-------------------------------------------------------

Running MyTestIt

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.235 sec



Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0



[INFO] [cargo:stop {execution: stop-container}] SE PARA EL CONTENEDOR

[INFO] [talledLocalContainer] Tomcat 5.5.20 is stopping...

[INFO] [talledLocalContainer] Tomcat 5.5.20 is stopped

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESSFUL

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 14 seconds

[INFO] Finished at: Thu Jan 25 17:39:00 CET 2007

[INFO] Final Memory: 6M/14M

[INFO] ------------------------------------------------------------------------


7.
Conclusiones

Como veis, hemos conseguido lanzar las pruebas de integración
“engañando” a Maven para que no se lanzaran en la
fase de test teniendo únicamente un módulo para ambas.

8.
Sobre el autor

José Carlos López Díaz, Ingeniero en
Informática

jclopez@autentia.com

Autentia Real Business Solutions S.L – “Soporte a
Desarrollo”

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad