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
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.