Pruebas unitarias Web para aplicaciones JSF

0
20737

Pruebas unitarias Web para aplicaciones JSF

 

Pruebas
unitarias Web para aplicaciones JSF. 1

Introducción
a las pruebas unitaria de aplicaciones Web. 1

Algunos
framework open source de pruebas unitarias web. 2

¿Cuál
elegir?. 3

Una posible
elección. 4

Conclusión. 4

 

 

Introducción a las pruebas unitaria de aplicaciones
Web

 

En nuestro trabajo diario en Autentia realizamos consultoría
para el desarrollo de portales empresariales. Todos los desarrollos de estas
características implementan los siguientes elementos:

 

  • Funciones de seguridad en el código, para intentar
    prevenir o minimizar los posibles ataques maliciosos contra nuestras
    aplicaciones.
  • Compilación y despliegue automáticos y desatendidos
    (compilación nocturna),
  • Funciones de traza tanto funcionales como de depuración
    (log)
  • Pruebas unitarias de todos los componentes desarrollados.

 

El último punto se está convirtiendo poco a poco en una
métrica de calidad del software  desarrollado actualmente. Una prueba unitaria
es una prueba que comprueba el correcto funcionamiento de una funcionalidad
incluida en la aplicación, tanto en las condiciones favorables como en las no
favorables (por ejemplo, entradas correctas e incorrectas del usuario para un
determinado valor). Las pruebas unitarias normalmente se desarrollan como
funciones que utilizan los componentes ya desarrollados, y se lanzan como una
batería de pruebas que sólo tienen dos posibles resultados: correcta o
incorrecta.

 

Para el mundo Java hay un estándar open source para el
desarrollo de pruebas unitarias para los componentes desarrollados en lenguaje
Java: JUnit. El framework JUnit se extiende a menudo con otra serie de
frameworks que realizan pruebas unitarias más específicas, insertándose a
menudo como plugins en los entornos de desarrollo.

 

Toda aplicación Web se ejecuta dentro de un servidor Web o
de un servidor de aplicaciones. Estos elementos hacen de contenedor para la
aplicación, conteniendo los recursos, datos y objetos que la forman.

 

Hay varias formas de realizar pruebas unitarias sobre una
aplicación Web:

  • Pruebas desde el interior del contenedor de la aplicación.
    En este caso se instala un módulo en el contenedor de la aplicación
    (normalmente un módulo en el servidor Web o de aplicaciones), que le dota
    de esta capacidad.
  • Pruebas desde el exterior del contenedor de la aplicación.
    En este caso, mediante aplicaciones externas a la aplicación web, se ejecutan
    pruebas contra la aplicación, que normalmente son peticiones de páginas o
    servicios, simulando la interacción de los usuarios o a
  • Pruebas sin utilizar un contenedor de la aplicación.

 

Para realizar las pruebas unitarias utilizaremos normalmente
un framework (marco de trabajo) que nos permitirá realizar dichas pruebas en
nuestra aplicación.

 

En el primer caso, el framework se integra dentro del
contenedor, bien utilizando la API del contenedor o extendiendo su
funcionalidad, por ejemplo, añadiendo un módulo que intercepte el diálogo entre
el cliente Web y el servidor. Es el método más complejo, pues supone controlar
desde el propio contenedor la aplicación, obligándonos a usar las siempre
complejas APIs de bajo nivel de contenedor. Este método está especialmente
indicado para probar los componentes críticos, el corazón de nuestras
aplicaciones, y es el método que normalmente se utiliza para probar los propios
frameworks utilizados para el desarrollo de aplicaciones.

 

En el segundo caso, las pruebas se realizan desde el
exterior del contenedor, desde el lado del cliente. Una técnica habitual para
ello consiste en implementar el protocolo http en un cliente de pruebas
unitarias que simula la interacción entre un usuario y el servidor Web. Este
método está especialmente indicado para comprobar la correcta navegación dentro
de la aplicación, así como para detectar problemas en la interfaz visual de la
misma, ya que normalmente los framework de pruebas pueden inspeccionar la vista
devuelta por la aplicación en cada momento.

 

El tercer método consiste en implementar dentro del
framework parte de la funcionalidad del propio contenedor de la aplicación.
Este método es especialmente útil para aplicaciones basadas en componentes, ya
que los componentes suelen encerrar una funcionalidad muy definida de la
aplicación Web, lo que facilita el desarrollo de las pruebas unitarias. Una
ventaja adicional de este método es que es muy sencillo realizar las pruebas
unitarias dentro del proceso de compilación, en la misma máquina virtual donde
se está compilando la aplicación, sin necesidad de realizar el despliegue de la
misma a los servidores web o de aplicación.

 

Algunos framework open source de pruebas unitarias
web

Para la realización de pruebas unitarias para aplicaciones
web contamos con varias herramientas en el dominio open source. Podemos
destacar:

 

  • Httpunit.
    Es una extensión de junit para la realización de pruebas unitarias sobre
    el protocolo http.
    • Utiliza la metáfora de conversación con el servidor web,
      al estilo de htmlunit.
    • Permite obtener el texto de la página o su estructura
      DOM, reconociendo sus principales elementos (tablas, formularios, frames.
      etc.)
    • La documentación del framework es escasa
    • No indican el grado de soporte de funciones javascript
  • Htmlunit.
    Es una extensión de junit para la realización de pruebas unitarias web. 
    Su funcionamiento se basa en obtener los diferentes elementos que componen
    la página web devuelta por el servidor, e interactuar sobre ellos. Algunas
    de sus características son:
    • Objetos para todas las etiquetas html: title, table, etc.
    • Gestión de los eventos javascript, como onclick, etc.
      Esto todavía está en desarrollo.
    • Sintaxis bastante farragosa. Para acceder a los elementos
      de la página hay que ir instanciando los diferentes objetos que la
      soportan.
    • Gestión parcial de los eventos javascript de los
      elementos html de la página. Todavía no está completo el soporte, aunque
      sí dispara el onclick()
    • El proyecto está bastante activo, y se ha liberado en
      2006 la versión 1.10
  • Seleniuum.
    Es un framework en desarrollo al estilo de htmlunit, pero su principal
    diferencia es que embebe un cliente web real. Se instala como un plugin
    sobre Firefox o Internet Explorer, y permite trabajar con ellos como
    cliente web de pruebas, controlando sus funciones. Tiene dos usos
    fundamentales:
    • Realizar pruebas de compatibilidad con diferentes
      navegadores
    • Realizar pruebas funcionales de aplicaciones al estilo de
      htmlunit
  • Jwebunit.
    Es un framework de pruebas unitarias web basado en htmlunit, que
    simplifica el desarrollo de las pruebas. Dispone de las siguientes
    características:
    • Sintaxis sencilla para las pruebas, mucho más simples que
      en htmlunit.
    • Posibilidad de usar diferentes plugins para acceder a la
      página web a probar. La nueva versión en preparación (2.0) soportará
      cuatro plugins diferentes: htmlunit, httpunit, Selenium y Jwebfit
    • Rapidez a la hora de hacer las pruebas unitarias
  • Shale.
    Realmente es un framework para escribir aplicaciones JSF, pero incluye un
    test-framework que puede ser utilizado para realizar aplicaciones
    unitarias en aplicaciones JSF sin usare un contenedor, vía objetos mock
    que emulan al contenedor JSF.
    • Objetos mock que emulan el contexto JSF y el contenedor
      del servlet de JSF
  • Cactus.
    Es un framework para la realización de pruebas unitarias de aplicaciones
    web, y dispone de elementos parar realizar pruebas unitarias sobre
    servlets y páginas jsp.
    • Diseñado para probar aplicaciones que siguen el patrón de
      arquitectura MVC.
    • Soporta como controladores servlets, java clases,
      taglibs, filters
    • Soporta

 

¿Cuál elegir?

Si tenemos que realizar un conjunto de pruebas unitarias en
nuestra aplicación, las dos partes fundamentales a probar son:

 

  • La interfaz de la aplicación, incluyendo  la navegación.
    Debemos comprobar que la aplicación cumple los casos de uso que hemos
    determinado, realizando la navegación correcta por las diferentes páginas
    necesarias, y que muestra en todo momento la información correcta al
    usuario. También debemos probar que se comporta correctamente cuando el
    usuario realiza acciones incorrectas.

 

  • La lógica de la aplicación. Una vez que la aplicación se
    comporta externamente de manera correcta, hay que comprobar que no tenemos
    monstruos en el armario, es decir, que dentro también se comporta
    correctamente. Es el momento de probar la lógica de la aplicación, los
    diferentes estados y la persistencia en base de datos, como elementos
    frecuentes.

 

Una posible elección

 

De entre todos los productos que hemos citado anteriormente,
nuestros candidatos para realizar las pruebas unitarias serían:

 

  • Para las pruebas de interfaz, un buen candidato es
    jwebunits.  Con este framework podremos simular el comportamiento de los
    usuarios con la aplicación de modo sencillo. Además parece una solución
    con buen futuro (2007), ya que la nueva versión 2.0 en desarrollo
    permitirá usar cuatro plugins. Sin embargo, la documentación no es muy
    completa, por lo que tareas complicadas (procesamiento avanzado del
    javascript) nos dará guerra.

 

  • Para las pruebas de la lógica de la aplicación, y ya que
    estamos centrados en las aplicaciones JSF, el mejor candidato es el
    test-framework de Shale. Además se integra de un modo sencillo dentro del
    proceso de compilación (ideal para compilaciones nocturnas).

 

Conclusión

Ya no hay excusas para incluir pruebas unitarias automáticas
en nuestros desarrollos web en Java. Con los frameworks que describimos en este
tutorial podremos integrar nuestras pruebas fácilmente como parte de nuestro
ciclo de desarrollo estándar.

En próximos tutoriasles describiremos alguno de estos
entornos utilizando ejemplos de desarrollo.

En el siguiente artículo os mostraremos cómo hacer pruebas
unitarias con JWebUnit.

Dejar respuesta

Please enter your comment!
Please enter your name here