Víctor Javier Madrid

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática con especialidad en Ingeniería del Conocimiento *.

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2009-02-26

Tutorial visitado 4.799 veces Descargar en PDF
Integración Selenium / Maven 2 / Surefire / Cargo / Tomcat 6.

Integración Selenium / Maven 2 / Surefire / Cargo / Tomcat 6.


0. Índice de contenidos.

1. Introducción

Con este tutorial se pretende integrar en nuestro proyecto : Maven, Selenium, Surefire, Cargo y Tomcat 6 con el objetivo de incluir y ejecutar las pruebas de integración dentro del ciclo de vida de Maven.

Seguro que os preguntáis sobre el motivo de semejante integración, pues es muy sencillo, vamos a tratar de ejecutar las pruebas de integración (mediante test realizados con Selenium) sobre un contenedor Tomcat 6 (que sería el contenedor final de la nueva versión),para que justo cuando se genere una versión nueva del proyecto se realicen las pruebas directamente sobre la nueva versión y así comprobar que no se ha producido ninguna regresión en nuestro código.

Recordar que las pruebas de regresión tratan de identificar que no se haya producido ningún nuevo defecto o bien efectos colaterales en nuestro código.Cada vez que realizamos cualquier modificación en nuestro código sería conveniente probar todo lo anterior para ver que todo sigue funcionando correctamente y que no hemos realizado una regresión en nuestra calidad. Muchas veces cuando incluimos alguna modificación o añadimos algo se puede incorporar problemas "sin darse cuenta", así que teneis que estar muy pendiente de estas cosas.

Por otro lado, destacar que las pruebas se ejecutarán automáticamente lo que supone que no tendremos que dedicar nuestro tiempo una y otra vez a probar la aplicación en cada versión que se realice. Es cierto, que las primeras veces preparar todo esto presentará un coste añadido bastante elevado y que requiere cierto aprendizaje, pero mirar a largo plazo y verlo como una inversión, en los siguientes ciclos de ejecución os dareis cuante de todo lo que habeis ganado y de aquí en adelante todo serán beneficios.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM, 320 GB HD).
  • Sistema operativo: Windows Vista Ultimate.
  • Internet Explorer 7.0.6001.1800
  • Mozilla Firefox 3.0.6
  • Opera 9.63
  • Safari 3.2.1


3. ¿Qué es Maven?.

Maven es una herramienta que permite realizar la administración de un proyecto.

En sus inicios fue un proyecto interno de Turbine (que es un framework web que pertenece a Jakarta), sus primera funcionalidades eran la de facilitar la realización de las pruebas unitarias o bien generar la documentación del proyecto. Poco a poco se fue haciendo un hueco hasta que se convirtió en un proyecto independiente de Turbine debido al potencial que presentaba.

Características:

  • Generar proyectos de forma muy sencilla.
  • Establece un modo de generar proyectos de forma uniforme.
  • Utilización de la información del proyecto (Informes, etc.).
  • Genera la documentación de un proyecto.
  • Generación de elementos de "despliegue" de un proyecto de forma sencilla (WAR, EAR o JAR).
  • Facilita la publicación y distribución de un proyecto.
  • Gestión de dependencias.

Se basa en dos conceptos:

- POM (Project Object Model)

Es un fichero XML en el que se describe proyecto, así como sus dependencias externas con otros módulos y el uso de componentes externos.

Además permite la ejecución de procesos, para ello tiene definidas una serie de tareas como son la compilación, empaquetado, despliegue, etc... (ver ciclo de vida de Maven)

Ejemplo de Esqueleto del fichero POM:

- Repositorio

Es el lugar donde se localizarán las dependencias de nuestro proyecto (vendrían a ser los ficheros JAR de los elementos que necesitamos para que nuestro proyecto funcione). Hay que pensar que incluso varios de nuestros proyectos pueden compartir dichas dependencias.

La ubicación por defecto del repositorio local es la siguiente:

  • Windows : C:\Documents and Settings\usuario\.m2
  • Linux / Unix : $HOME/.m2

Existen varias páginas que son repositorios de Maven (Oficiales y no oficiales), en ellas se pueden encontrar todos los jar de libre distribución que pueda necesitar nuestro proyecto. Por ejemplo : http://www.ibiblio.org/maven2/

De hecho, Maven se encargará de descargarlos automáticamente en el momento que los necesite.

Instalación:

Paso 1 : Descargar la versión en formato zip desde su página web http://maven.apache.org/download.html

Paso 2 : Descomprimir el archivo en nuestro sistema. Por ejemplo : C:\maven-X.X.X

Paso 3 : Incluir en la variable de entorno PATH la siguiente instrucción : C:\maven-X.X.X\bin

Paso 4 : Comprobar que se ha instalado correctamente para ello arrancar una consola y ejecutar la siguiente instrucción : mvn --version

Si la instalación se ha realizado correctamente nos devolverá la versión utilizada de Maven.

Ciclo de vida:

Es interesante tener una noción básica del ciclo de vida de Maven, ya que habrá que establecer las diferentes ejecuciones de los plugin (Selenium , Cargo, etc.) en algunas fases específicas de su ciclo de vida.

Nota :Ejecutando estas fases mediante su ejecución por línea de comandos se conseguirá realizar la acción especificada.

Ciclo de vida de limpieza : se encarga de "limpiar" el proyecto, es decir, lo prepara para iniciar las diferentes fases partiendo desde cero.

Objetivo Descripción
pre-clean Ejecuta los procesos necesarios antes de realizar la fase de limpiado del proyecto.
clean Quita todos los ficheros generados en la anterior construcción de la aplicación.
post-clean Ejecuta los procesos necesarios después de realizar la fase de limpiado del proyecto.

Ciclo de vida por defecto

Objetivo Descripción
validate Valida que el proyecto sea correcto y que toda la información necesaria este disponible.
compile Compila el código fuente del proyecto.
test Ejecuta los test previamente compilados usando el framework adecuado.Estas pruebas no deben requerir que el código este empaquetado y ni desplegado.
package Coge el código compilado y lo empaqueta en su formato a distribuir (JAR, WAR, etc.).
pre-integration-test Ejecuta las acciones necesarias antes de ejecutar las pruebas de integración. Por ejemplo la configuración del entorno necesario.
integration-test Procesa y depliega el paquete. Si es necesario lo realiza en el entorno donde se van a ejecutar las pruebas de integración.
post-integration-test Ejecuta las acciones necesarios, después de que las pruebas de integración se hayan realizado. Por ejemplo la limpieza del entorno.
verify Ejecuta los chequeos necesarios para verificar que el paquete cumple los criterios de calidad.
install Instala el paquete en el repositorio local, para su uso como dependencias de otros proyectos locales.
deploy Libera el entorno o hace una integración.Copia el paquete final al repositorio remoto.

Para ver el ciclo de vida completo de Maven visitar su página.

Para más información sobre Maven consultar el siguiente tutorial Maven.


4. ¿Qué es Selenium?.

Selenium es un conjunto de herramientas que permite automatizar las pruebas sobre aplicaciones web a través de diferentes plataformas.

Sus principales características son las siguientes:

  • Funciona en diferentes navegadores y con diferentes sistemas operativos.
  • Puede ser controlado por muchos lenguajes de programación y framework de prueba.
  • Permite crear pruebas de regresión.

Para entener un poco mejor la funcionalidad de Selenium sería interesante echar un vistado al tutorial de Selenium Remote Control.Ya que vamos a utilizar muchos de los conceptos que en él se explican como : servidor Selenium, su integración con JUnit, etc.

Para poder utilizar Selenium en nuestro proyecto vamos a integrarlo con Maven, para ello haremos uso de:

- Selenium-maven-plugin

Selenium-maven-plugin es un plugin para integrar Selenium con Maven 2.

Su principal uso es el de permitir arrancar el servidor Selenium (viene proporcionado por Selenium Remote Control) que nos va a permitir realizar las pruebas sobre la aplicación web.

Con este plugin se trata de dar soporte a la utilización del driver del cliente Java Selenium cuando ejecuta algún test mediante Surefire.

Instalación (Maven 2)

No requiere instalación,simplemente bastará con indicar su uso en el fichero POM del proyecto.

Habría que incluir en el POM la indicación de su uso:

Objetivos (Maven 2)

Nota :Ejecutando estos objetivos mediante su ejecución por línea de comandos se conseguirá realizar la acción especificada.

Objetivo Descripción
selenium:start-server Arranca el servidor Selenium.
selenium:stop-server Parar el servidor Selenium.
selenium:selenese Ejecuta una suite de test HTML.
selenium:xvfb Arranca una instancia Xvfb.

Para más información consultar el siguiente tutorial Selenium Remote Control.


5. ¿Qué es Surefire?.

Surefire es un plugin que se integra durante la fase de test de Maven para ejecutar los test de una aplicación.

Permite generar informes de los resultados de las pruebas en dos formatos de fichero:

  • Fichero de texto plano.
  • Fichero XML
  • Fichero HTML (Habría que indicarlo)

Dichos ficheros se suelen generar por defecto en la siguiente carpeta : ${basedir}/target/surefire-reports.

Instalación (Maven 2)

No requiere instalación,simplemente bastará con indicar su uso en el fichero POM del proyecto.

Habría que incluir en el POM el uso de este plugin:

Por otro lado habría que establecer el framework de prueba que permitirá ejecutar las pruebas unitarias.Por ejemplo: JUnit o Testng. Para ello se incorporarían en el fichero POM las dependencias requeridas.

Objetivos (Maven 2)

Nota :Ejecutando este objetivo mediante su ejecución por línea de comandos se conseguirá realizar la acción especificada.

Objetivo Descripción
surefire:test Ejecuta los test unitarios de la aplicación.

Para más información consultar el siguiente tutorial Surefire.


6. ¿Qué es Cargo?

Cargo es un framework que proporciona una API de Java desde la cual se van a poder arrancar,parar y configurar una gran variedad de contenedores de Java de una forma muy sencilla.

Su principal uso es el de permitir arrancar el contenedor necesario para realizar las pruebas funcionales y de integración.Pero también tiene otros como arrancar contenedores para aplicaciones que requieren el tenerlo arrancado para su ejecución.

Cargo proporciona los siguientes API:

  • API Java para arrancar,detener y contenedores Java (incluso desplegar modulos en ellos).
  • API Java para analizar,crear y fusionar módulos J2EE.

Lo mejor de todo es que para relizar estas operaciones permite el uso de tareas Ant,Maven 1,plugin Maven 2,Intellij IDEA y plugin Netbeans.

Contenedores utilizados:

  • Geronimo 1.x
  • JBoss 3.x / 4.x / 4.2.x
  • Jetty 4.x / 5.x / 6.x
  • Jo 1.x
  • JOnAS 4.x / 5.x
  • Oc4J 9.x / 10.x
  • Orion 1.x / 2.x
  • Resin 2.x / 3.x
  • Tomcat 3.x /4.x / 5.x / 6.x
  • WebLogic 8.x / 9.x / 10.x / 10.3x

Hay diferentes formas de utilizar cargo : utilizando sus propias librerías, integrado con Maven o Ant o como plugin de Eclipse, etc.

Ejemplo del uso de librerías del core de Cargo:

En este ejemplo se configura Resin 3.0.15 para arrancar en target/myresin3x y desplegar un WAR localizado.

Nota: en la página de cargo podemos encontrar más ejemplos de esta parte.

Pero de todas las opciones que tenemos para utilizarlo nos vamos a centrar a su uso con Maven.

Instalación Maven 2

No requiere instalación,simplemente bastará con indicar su uso en el fichero POM del proyecto.

Todos los artefactos que utilizan Cargo se encuentra en el repositorio de ibiblio.

OJO : Cuidado con las versiones de los artefactos ya que muchos de las versiones son antiguas y pueden no funcionar.

Nota : Cargo dispone de un repositorio asociado al proyecto, si se quiere incorporar al proyecto incluir el siguiente texto en el POM.

Habría que incluir en el POM su uso como plugin :

Objetivos (Maven 2)

Nota :Ejecutando estos objetivos mediante su ejecución por línea de comandos se conseguirá realizar la acción especificada.

Objetivo Descripción
cargo:start Arranca el contenedor y de forma opcional despliega la construcción básica WAR / EAR / Etc.
cargo:stop Para el contenedor
cargo:deployer-deploy (Alias de cargo:deploy) Despliega un elemento desplegable en un contenedor en ejecución.
cargo:deployer-undeploy (Alias de cargo:undeploy) Replegar el elemento desplado desde el contenedor en ejecución.
cargo:deployer-start Arranca un elemento despleado que se encuentre instalado en un contenedor en ejecución.
cargo:deployer-stop Parar un elemento deplegado sin replegarlo.
cargo:deployer-redeploy Repliega y despliega el emlemento desplegable.
cargo:uberwar Fusiona varios archivos WAR en un único WAR.
cargo:install Instala una distribución del contender el sistema de ficheros.

Para más información consultar la página de Cargo.


7. ¿Qué es Tomcat?

Apache Tomcat es un servidor web con soporte de servlets y JSPs. Dejar claro en todo momento que no es un servidor de aplicaciones como Jboss.

Una de sus principales características es que se ha realizado en Java, luego funcionará en cualquier sistema operativo que disponga máquina virtual Java (JVM).

Instalación

Paso 1 : Descargar de la página web la versión de Tomcat . Descargarla aquí

Paso 2 : Descomprimir el archivo en nuestro sistema. Por ejemplo : C:\apache-tomcat-6.0.18

Paso 3 : Incluir la anterior ruta como variable de entorno CATALINA_HOME

Paso 4 : Comprobar que tenemos instalada la variable JAVA_HOME (en caso de no encontrase intalar JAVA)

Paso 5 : En el directorio CATALINA_HOME/bin nos encontraremos los scrips de arranque y parada.

  • Arrancar Tomcat : startup.sh
  • Parar Tomcat : shutdown.sh

Para más información visitar su página.


6. Ejemplo.

En este punto se va a pasar a detallar la integración de todo lo anterior, para ello se trabajará sobre un fichero POM de un proyecto.

Nota : Para poder comprobar su correcto funcionamiento es necesario realizar previamente los test. En este tutorial no se va a enseñar a realizarlos, es por ello que se aconseja visualizar los siguientes tutoriales antes de continuar donde se explica como hacerlo de forma detallada:

En este ejemplo de integración, trataré de explicar en detalle lo que hace cada parte del fichero POM, pero recordad que tendréis que adaptarlo a vuestro proyecto y a vuestras necesidades.

En esta parte del código se detallan los datos del proyecto:

  • modelVersion : Indica la versión del modelo de POM utilizado (actualmente 4.0.0).
  • groupId : Indica el identificador común que van a tener los proyectos desarrollados por mi empresa o por mi mismo.
  • artifactId : Indica el identificador del proyecto dentro de los proyectos que pertenecen al mismo groupId.
  • packaging : Indica el sistema de empaquetado del proyecto.
  • version : Indica la versión del proyecto (por defecto 1.0-SNAPSHOT).
  • name : Nombre utilizado por el proyecto (por defecto es igual que el groupId).
  • url : Indica la URL en la que se encuentra la información asociada al proyecto.

En este apartado se muestran las propiedades comunes al proyecto y en las cuales se indican las características de configuración de Selenium:

  • selenium-version : Versión de Selenium que se va a utilizar.
  • selenium.port : Puerto por el que escuchará Selenium.
  • selenium.background : Establece si Selenium se va a ejecutar en modo background.

Con el plugin maven-compiler-plugin vamos a poder compilar nuestro proyecto indicándole la versión de Java con la que se realizará.

En este apartado incluiremos Selenium, para ello indicar que se usará el plugin selenium-maven-plugin.

Declaramos una ejecución, la cual consiste en que durante la fase de Maven de "pre-integration-test" se arracará el servidor Selenium para realizar las pruebas.Recordar que en esta fase se realiza la reserva de los recursos necesarios para la realización de las pruebas de integración.

Nota :En cuanto a parar el servidor, decir que este se parará automáticamente al terminar las pruebas.

En este apartado incluiremos Surefire, para ello indicar que se usará el plugin maven-surefire-plugin.

Declaramos una ejecución "especial" denominada it-test,esta ejecución se encargará de realizar en la fase de Maven de integration-test la ejecución de todos los test cuyo nombre terminen por "It".Esto se debe al siguiente problema :

Maven no es capaz de diferenciar las pruebas unitarias de las de integración, por lo que al final termina utilizando la misma carpeta para utilizarlas (Se cree que esto estará solucionado a partir de las versiones de Maven 2.1), de esta forma conseguirmos hacer esta distinción y asi ejecutar las pruebas que nos interesan.

En este apartado incluiremos Cargo, para ello indicar que se usará el plugin cargo-maven2-plugin.

Declaramos dos ejecuciones:

- Start-container : que se ejecutará en la fase de pre-integration-test y que arracará el contenedor especificado (en nuestro caso Tomcat 6).

- Stop-container : que se ejecutará en la fase de post-integration-test y que parará el contenedor especificado (en nuestro caso Tomcat 6).

Por otro lado, declaremos los datos asociados a la configuración del contenedor. Como puntos fuertes indicar que en este ejemplo lo ejecutemos en local porque lo estamos integrando con Maven y nos interesa que se realicen las pruebas antes de realizar la release, pero que sepáis que también existe la posibilidad de ejecutarlo en modo remoto.

Para mayor información sobre este punto mirar la página de Cargo.

OJO : Es muy importante tener la condición de wait a false para que NO se quede esperando el contendor al arrancar.

En este apartado incluimos el repositorio asociado a "codehaus" para que descarga en caso de ser necesario cualquier cosa asociada a sus proyectos.

En este apartado se indican los repositorios que usará el proyecto.

Es este apartado se establecen las dependencias que tendrá el proyecto. Como se puede observar deberemos de incluir a las que ya tenemos 3:

junit :Framework de prueba que se utilizará para la ejecución de las pruebas unitarias y de integración.

selenium-java-client-driver :Cliente Java utilizado.

selenium-server :Servidor Selenium sobre el que se ejecutarán las pruebas.


Resultados de la ejecución del ejemplo

Para la ejecución del ejemplo , se ejecutará sobre la línea de comandos la orden mvn install sobre un proyecto que tiene una prueba unitaria y una prueba de integración.

En el siguiente área de texto podeis ver toda la traza desde que se realiza "mvn install" y podréis identificar de forma directa cada uno de los puntos que os he ido indicando en los apartados anteriores.

7. Conclusiones.

Como habéis podido comprobar, toda esta integración parece muy complicada si uno desconoce cada uno de los elementos que lo forman,pero no es tanto si uno sabe lo que hace cada elemento.Espero haberos podido aclarar muchas de las dudas que os pudieran surgir.

Al final, el objetivo de toda esta integración es evitar regresiones en el software con el que estamos trabajando, tratando de automatizar al máximo para no volver a perder tiempo en realizar todas y cada una de las pruebas (manuales) necesarias para comprobar que no se ha producido ningún defecto, lo que nos permite comprobar y asegurar nuestra calidad.

¿Qué mas se puede pedir? ;-)


Un saludo.

Víctor

mailto:vjmadrid@autentia.com

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL: